2011-01-11 16 views
20

Suponiendo que hay una gran cantidad de elementos en todo el sitio que tienen un número desconocido y un tipo de evento vinculado a ellos.Reemplazar todos los eventos de JavaScript vinculados a un elemento con un único evento nuevo

Si necesito anular todos estos eventos con un solo evento enlazado, y solo ese evento se disparará, ¿cuáles son algunas recomendaciones?

Me gustaría vincular el evento a un controlador de evento de clic, y estoy usando jQuery.

Gracias de antemano.

+1

¿Quiere decir sin realmente desvincular los controladores de eventos originales? – user113716

+0

Ugh; esto suena como una muy mala idea. Sin embargo, sospecho que puede hacerlo averiguando el mecanismo jQuery interno y subvirtiéndolo con su propio código. – Pointy

+0

@patrick dw - Desvincular todos los manejadores de evento click originales está bien, siempre que eso no requiera identificar el evento exacto que está asociado con el clic. Si hay una forma de "desvincular todos los eventos de clic" y luego "enlazar este evento de clic específico e invaluable", entonces eso estaría bien. – jerome

Respuesta

46

Está buscando jQuery#unbind.

para eliminar todos los controladores de eventos en un elemento o un conjunto de elementos, simplemente:

$('.some-selector').unbind(); 

para desenlazar única clic manipuladores, utilice unbind('click'):

$('.some-selector').unbind('click'); 

para desenlazar todos los manipuladores clic y inmediatamente unir a su propio controlador después de eso, puede hacer algo como esto:

$('.some-selector').unbind('click').click(function(event) { 
    // Your code goes here 
}); 

Tenga en cuenta que esto solo funcionará para eventos enlazados usando jQuery (usando .bind o cualquier método jQuery que use .bind internamente). Si desea eliminar todos los posibles eventos onclick de un conjunto dado de elementos, se puede utilizar:

$('.some-selector') 
    .unbind('click') // takes care of jQuery-bound click events 
    .attr('onclick', '') // clears `onclick` attributes in the HTML 
    .each(function() { // reset `onclick` event handlers 
    this.onclick = null; 
    }); 
+1

Esto no cubrirá los eventos que estaban vinculados con inline-javascript o listeners de eventos Javascript simples. – jAndy

+1

¿Qué tal '' $ (". Some-selector"). Unbind ("click"). Attr ("onclick", "") .each (función() {this.onclick = null;}); '? –

+0

Funcionó para mí, gracias – dsilva

1

Trate de usar en lugar de livebind. A continuación, puede eliminar fácilmente el enlace activo con die del selector, que es de operación rápida y establecer otro en vivo igualmente rápido.

$('selection here').live('..', .....); // multiple invocations 
    $('selection here').die(); 
    $('selection here').live('click',.....); 

DOM no se ha tocado en absoluto. La condición del evento se evalúa en la ocurrencia del evento.

Pero en general, si sólo desea intercambiar funciones de controlador de por qué no hacerlo de esta manera:

var ahandler = function(evt) { /* first implementation */ } 
$('.selector').bind('click', function(evt) { ahandler(evt); }); 

//and then if you want to change handlers 
ahandler = function(evt) { /* new implementation */ }; 

Esto da absolutamente ningún costo de cualquier cambio, etc. rebinding

+0

Estaba usando el código de alguien que usaba 'en vivo' y no pude descifrar cómo desenganchar ... esto me ahorró mucho tiempo y dolores de cabeza;) – afreeland

+1

FYI: Use jQuery en() ahora, como en vivo() es obsoleto. – aikeru

1

Parece que esto es bastante simple en realidad:

$('#foo').unbind('click'); 
$('#foo').bind('click', myNewFunction); 

Gracias por sus respuestas.

+1

No necesita dos instrucciones, puede encadenarlas (como expliqué en [mi respuesta] (http://stackoverflow.com/questions/4659032/override-all-javascript-events-bound-to-an- element-with-a-single-new-event/4659067 # 4659067)). –

+0

@Mathias Bynens - ¡Gracias! – jerome

4

Me gustaría pensar en ello sin eliminar todos los eventos (solo anularlos).

Si su nuevo evento único vinculado (lo llamamos "clic" aquí) es específico del elemento al que se une, entonces creo que puede ignorar cualquier otro evento simplemente mediante la función stopPropagation(). Como este

$("specific-selector").on("click", ".specific-class", function (e) { 
    e.stopPropagation() 
    // e.stopImmediatePropagation() 
    /* your code continues ... */ 
}); 

Detendrá los eventos burbujas, así que tus otros eventos no se dispararán. utilice stopImmediatePropagation() para evitar que otros eventos se unan a los mismos elementos como lo hace "click".

Por ejemplo, si el evento "mouseleave" también se une al elemento $ ("specific-selector .specific-class"), no se activará también.

Por último, todos los demás eventos no se activarán en este elemento, pero su nuevo elemento "clic".

La pregunta no resuelta es, ¿qué pasa si otros eventos también usan stopPropagation()? ... Entonces creo que gana el que tenga la mejor especificación, así que trate de evitar eventos complejos, demasiados es la sugerencia final.

Puede ver "Eventos directos y delegados" en jQuery site para obtener más información.

Cuestiones relacionadas