Foros del Web » Programando para Internet » Javascript »

duda con removeEventListener

Estas en el tema de duda con removeEventListener en el foro de Javascript en Foros del Web. Hola. Mi pregunta es si existe algún tipo de función estilo " removeAllEventListener ", que elimine todos los oyentes de un evento para un elemento; ...
  #1 (permalink)  
Antiguo 23/08/2008, 12:16
Avatar de Jawar  
Fecha de Ingreso: octubre-2005
Ubicación: Málaga
Mensajes: 34
Antigüedad: 18 años, 7 meses
Puntos: 0
duda con removeEventListener

Hola.
Mi pregunta es si existe algún tipo de función estilo "removeAllEventListener", que elimine todos los oyentes de un evento para un elemento; o si se puede hacer algo como :

Código PHP:
for(i=0i<elemento.events.lengthi++)
    {
        
elemento.removeEventListener(events[i].typeevents[i].function, false)
    } 

Es decir, si hay alguna forma de obtener todos los oyentes de un evento para un elemento dado y tambiém si se pueden borrar todos los oyentes de un evento de una tacada.


Gracias
  #2 (permalink)  
Antiguo 23/08/2008, 12:52
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 7 meses
Puntos: 45
Respuesta: duda con removeEventListener

Hola Jawar:

No existe removeAllEventListener() ni alguna función en la especificación que haga lo que necesitas. Se puede probar a crearla, no habría problema. Basta con recorrer todos los eventos posibles e ir eliminandolos uno a uno.

Para saber si se le ha establecido el evento onclick a un elemento, haríamos así:
Código HTML:
<a id="enlace" href="http://www.paco.com" onclick="return false;">paco</a>

<script type="text/javascript">
<!--

alert( typeof $("enlace").onclick === "function" );

// -->
</script> 

Saludos
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #3 (permalink)  
Antiguo 23/08/2008, 13:09
Avatar de Jawar  
Fecha de Ingreso: octubre-2005
Ubicación: Málaga
Mensajes: 34
Antigüedad: 18 años, 7 meses
Puntos: 0
Respuesta: duda con removeEventListener

Cita:
Iniciado por derkenuke Ver Mensaje
Hola Jawar:

No existe removeAllEventListener() ni alguna función en la especificación que haga lo que necesitas. Se puede probar a crearla, no habría problema. Basta con recorrer todos los eventos posibles e ir eliminandolos uno a uno.

Para saber si se le ha establecido el evento onclick a un elemento, haríamos así:
Código HTML:
<a id="enlace" href="http://www.paco.com" onclick="return false;">paco</a>

<script type="text/javascript">
<!--

alert( typeof $("enlace").onclick === "function" );

// -->
</script> 

Saludos

Hola derkenuke, gracias por tu respuesta, pero, ¿como podría entonces borrar por ejemplo todos los listeners del evento onclick para un elemento HTML dado?
Probé a hacer "elemento.onclick=null" , pero si has hecho "elemento.addEventListener(......)" , lo anterior no elimina lo añadido con addEventListener.

Última edición por Jawar; 23/08/2008 a las 13:14
  #4 (permalink)  
Antiguo 23/08/2008, 14:47
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: duda con removeEventListener

Tener en cuenta que Explorer usa attachEvent para agregar y detachEvent para desagregar.
Algo crossbrowser sería así:
Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html xmlns="http://www.w3.org/1999/xhtml">
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<
title>Documento sin t&iacute;tulo</title>
<
script>
function $(
id){return document.getElementById(id);}
function 
addEvent(objevTypefnuseCapture){
    if(
obj.addEventListener){
        
obj.addEventListener(evTypefnuseCapture);
    }else if(
obj.attachEvent){
        
obj.attachEvent("on"+evTypefn);
    }else{
        
obj['on'+evType]=fn;
    }
}
function 
removeEvent(objevTypefnuseCapture){
  if (
obj.removeEventListener){
    
obj.removeEventListener(evTypefnuseCapture);
  } else if (
obj.detachEvent){
    
obj.detachEvent("on"+evTypefn);
  } else {
    
obj['on'+evType]=function(){};
  }


}
function 
mostrar(e){
    var 
e=|| window.event;
    var 
obj=e.srcElement || e.target;
    
alert(obj.id);
}
function 
eliminarEvento(){
    
removeEvent($('adentro'), 'click'mostrarfalse);
}
window.onload=function(){
    
addEvent($('adentro'), 'click'mostrarfalse);
    
addEvent($('quitar'), 'click'eliminarEventofalse);
}
</script>
</head>

<body>
<div id="adentro">test</div>
<div id="quitar">quitar</div>
</body>
</html> 
De esa manera, podemos usar addEvent para asignar un evento y removeEvent para eliminarlo.
  #5 (permalink)  
Antiguo 23/08/2008, 16:10
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 7 meses
Puntos: 45
Respuesta: duda con removeEventListener

Hola de nuevo:

Cita:
Iniciado por Jawar Ver Mensaje
¿como podría entonces borrar por ejemplo todos los listeners del evento onclick para un elemento HTML dado?
Probé a hacer "elemento.onclick=null" , pero si has hecho "elemento.addEventListener(......)" , lo anterior no elimina lo añadido con addEventListener.
Lo malo de removeEvent() (tanto de la función estándar como la del IE) es que hay que decirle qué función (manejador de evento) quitar del evento onclick. Es decir, no vale con decir removeEvent(obj, "click"); hay que especificar qué función queremos quitar de click. Así que técnicamete no podremos hacer un bucle quitando todos los onclick del documento.

Si mantenemos un control sobre lo que hemos hecho sería fácil eliminar los onclick. Siempre los añadimos con addEvent(), y por ende siempre los eliminamos con autoRemoveEvent(), función que prepararemos inteligentemente para que quite todo lo que hemos añadido:

Código PHP:
<button id="click">click</button>
<
button id="mouseoverYclick">mouseover click</button>
<
button id="quitar">quitar</button>
<
div id="capa">No has estado encima</div>

<
script type="text/javascript">
<!--


// document.getElementById abreviado
function $(x) { return document.getElementById(x); }

function 
addEvent(objevTypefnuseCapture){
    if(
obj.addEventListener){
        
obj.addEventListener(evTypefnuseCapture);
    }else if(
obj.attachEvent){
        
obj.attachEvent("on"+evTypefn);
    }else{
        
obj['on'+evType]=fn;
    }

    
// Esta parte se encargará de quitar especificamente este evento (y los eventos añadidos anteriormente) a obj
    
var anterior obj.quitarEvento;            // guardamos la anterior función, si la hubiere
    
obj.quitarEvento = function() {
        if( 
typeof anterior === "function" 
            
anterior();                            // la ejecutamos, si la hubiere
        
removeEvent(objevTypefnuseCapture);
    }
}
function 
removeEvent(objevTypefnuseCapture){
  
//alert("ejecuto removeEvent con obj="+obj.id+";\r evType="+evType+";\r fn="+fn+";\r y useCapture="+useCapture+"");
  
if (obj.removeEventListener){
    
obj.removeEventListener(evTypefnuseCapture);
  } else if (
obj.detachEvent){
    
obj.detachEvent("on"+evTypefn);
  } else {
    
obj['on'+evType]=function(){};
  }


function 
autoRemoveEvents(obj) {
    
obj.quitarEvento();
}

var 
hola = function() { alert("hola!"); }


window.onload=function(){
    
// añadimos todos los eventos y los handlers
    
addEvent($('click'), 'click'holafalse);
    
addEvent($("mouseoverYclick"), "mouseover", function() {
        $(
"capa").innerHTML="Has estado encima";
    }, 
false);
    
addEvent($("mouseoverYclick"), "click", function() {
        
alert("Me has pulsado!");
    }, 
false);

    
// añadimos un evento click al segundo botón para eliminar los eventos de los anteriores elementos (da igual qué eventos)
    
addEvent($('quitar'), 'click', function() { 
        
autoRemoveEvents($("click")); 
        
autoRemoveEvents($("mouseoverYclick"));
    } );
}

// -->
</script> 

Si queremos eliminar todos los onclick que hemos puesto en el documento basta con guardar los elementos que tengan onclick en un array (esto se haría en la función addEvent()), y luego en la eliminar sólo ese handler (haría falta una condicional dentro de quitarEvento() si es que sólo queremos eliminar el onclick.

Para eliminar todos los handlers de onclick de un elemento es todavía más fácil.


Me parece muy rebuscado pero es la única manera que veo de hacerlo.


Saludos.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #6 (permalink)  
Antiguo 24/08/2008, 08:26
Avatar de Jawar  
Fecha de Ingreso: octubre-2005
Ubicación: Málaga
Mensajes: 34
Antigüedad: 18 años, 7 meses
Puntos: 0
Respuesta: duda con removeEventListener

Muchas gracias a todos. He usado la solución de Panino5001 para compatibilizar firefox y IE, y la solucion de derkenuke para poder eliminar todos los listeners de una tacada :)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:23.