2011-02-08 29 views
6

Siempre me he preguntado qué tan limpio es ese enfoque: eliminar un oyente de eventos de ese mismo oyente.JavaScript: ¿elimina un detector de eventos de ese oyente?

ACTUALIZACIÓN:

Internamente guardo un hash de los objetos y los oyentes, por lo que potencialmente puede quitar detector de eventos desde cualquier lugar. Solo me preocupa eliminarlo de su interior. ¿Tal acción realmente hará un trabajo?

ACTUALIZACIÓN

estoy preguntando por addEventListener, removeEventListener cosas.

+0

¿Estamos hablando de 'addEventListener' o' .onxxx = '? –

Respuesta

1

Usted podría intentar algo como esto, dependiendo de cómo se llama:

some_div.onclick = function() { 
    ... 
    this.onclick = null; 
    // or: some_div.onclick = null; 
}; 

O es evento oyentes está preocupado con? Porque esos son un poco más complicados.

+0

Sip oyentes ... Pensé que los controladores y los oyentes son lo mismo, ¿no? – jayarjo

+0

Pregunta actualizada. – jayarjo

+1

@jayarjo Un elemento solo puede tener un controlador por evento, pero cualquier cantidad de oyentes.Esa es mi comprensión, de todos modos. – sdleihssirhc

0

Si usa jQuery, probablemente tenga algunos métodos de conveniencia expuestos para interactuar con los manejadores de eventos - vea bind()/unbind(), delegate()/undelegate(), one(), y similar methods.

No tengo mucha experiencia con otros frameworks, pero me imagino que ofrecen una funcionalidad similar. Si no está utilizando ningún framework, @sdleihssirhc tiene una respuesta aceptable.

EDITAR: Ah, quizás estás buscando algo más como addEventListener() y removeEventListener(). Una vez más, un marco ofrecerá cierta comodidad para sus interacciones y le ahorrará la molestia de reinventar la rueda en algunos casos.

6

Acabo de ver esto porque me preguntaba el exacta misma pregunta!

arguments.callee es su amigo ...

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments/callee

por lo que tendría

blah.addEventListener('click',function(e){ 
    e.source.removeEventListener('click', arguments.callee); 
    blee bloo bleep 
}); 

esto funciona en Appcelerator, por lo que debe trabajo en javascript también (porque son lo mismo)

NB NO agregue () a th e final de arguments.callee en este ejemplo, a menos que desee ver ... bah dum tish!.

De hecho, si usted no desea utilizar arguments.callee, esto también podría funcionar (no probado):

blah.addEventListener('click', anyThingYouWantHere : function(e){ 
    e.source.removeEventListener('click', anyThingYouWantHere); 
    blee bloo bleep 
}); 

Donde "anythingYouWantHere" es cualquier nombre de variable desea que estés ~ efectivamente "nombrar" la función a medida que la agrega.

+0

Eso no está permitido en el modo estricto de ES5, ¿no es así? –

+0

¡Hah! Yo ni siquiera * sabía * que existía tal cosa. ANYhoo, tuve un poke alrededor y encontré este http://stackoverflow.com/a/1335595/1061426 que parece indicar que aún existe. Además, el enlace al que hice referencia para arguments.callee no menciona que está en desuso tampoco. El enlace * does * menciona que la variante '()' no funcionará, pero no la usaremos aquí ... a causa de stackoverflow – bharal

Cuestiones relacionadas