2011-01-06 12 views
6

Duplicar posible:
Removing an anonymous event listenerJavascript: la eliminación de un detector de eventos anónimo

tengo la siguiente función de navegador de la Cruz añadir un detector de eventos:

_SU3.addEventListener = function(elem, eventName, fn) { 
if(elem.addEventListener) { 
    elem.addEventListener(eventName, fn, false); 
    } else if (elem.attachEvent) { 
     elem.attachEvent('on'+eventName, fn); 
    } 
}; 

I' m agregando el oyente de esta manera:

_SU3.addEventListener(_show, "click", function(event) { 
          _SU3.getChildren(_show, uri, element); 
        }); 

¿Qué está todo bien? Sin embargo, quiero eliminar el oyente después de haber sido llamado una vez. Es decir algo como:

_SU3.getChildren = function(_show, url, element) { 

... blah... 

_SU3.removeEventListener(_show, 'click', ANON_FUNCTION); 

}; 

Pero, por supuesto, la función del oyente es anónima, por lo que no hay ningún nombre de función para hacer referencia.

¿Cómo puedo eliminar el oyente?

Gracias

+0

Tienes que mantener una referencia en alguna parte. O explícitamente pasando una referencia a tu función, o implícitamente dentro de tu función. –

Respuesta

8

que necesita para mantener una referencia a la función:

var foo = function(event) { _SU3.getChildren(_show, uri, element); }; 

_SU3.addEventListener(_show, "click", foo); 

...

_SU3.getChildren = function(_show, url, element) { 

... blah... 

_SU3.removeEventListener(_show, 'click', foo); 

}; 

Asegúrese de que la variable foo es en el ámbito de donde se quita el detector de eventos.

+0

Gracias. Pero este oyente se agrega a muchos elementos en la página, por lo que no puedo tener una variable global, ya que se sobreescribirá si se llama al oyente a otros elementos. –

+0

@Richard: No dije que tenía que ser global, dije que tenía que estar en el alcance. – Matt

4

No puede. Si desea eliminarlo, debe almacenar una referencia al mismo. ¿De qué otra manera sería capaz de distinguirlo de los demás?

+1

Bueno, estoy muy contento de borrar todos los oyentes de clic conectados a un elemento si eso es posible? –

+2

No, no hay tal función. –

3

En lugar de eliminación el detector de eventos, arreglos para que un seguimiento de si se le ha llamado:

addOneShotListener = function(elem, eventName, fn) { 
    var triggered = false, handler = function(ev) { 
    if (triggered) return; 
    fn(ev); 
    triggered = true; 
    }; 

    if(elem.addEventListener) { 
    elem.addEventListener(eventName, handler, false); 
    } else if (elem.attachEvent) { 
    elem.attachEvent('on'+eventName, handler); 
    } 
}; 

Esa variación en su función original simplemente envuelve el controlador original (el "fn" aprobada en) con una función que solo llama al controlador la primera vez que se invoca. Después de eso, establece un indicador y no volverá a llamar a la función de controlador original.

+0

Esa es una sugerencia interesante, gracias –

0

Si solo tiene asignado un evento de clic en cualquier momento a un elemento, ¿por qué no establecer la propiedad onclick? Puedes eliminarlo en cualquier momento con element.onclick = '';

+0

porque la página está construida dinámicamente, y he encontrado que hacer node.setAttribute ('onclick', 'function') no funciona en algunos navegadores –

+0

Dijo propiedad, no atributo. – Neil

+0

object.onclick = function (e) {// etc}; –

Cuestiones relacionadas