Suponiendo que hay una gran cantidad de elementos en todo el sitio que tienen un número desconocido y un tipo de eventos vinculados a ellos.
Si necesito anular todos estos eventos con un solo evento vinculado y solo se activará ese evento, ¿cuáles son algunas recomendaciones?
Estaría vinculando el evento a un controlador de eventos de clic, y estoy usando jQuery.
Gracias por adelantado.
Estás buscando jQuery#unbind .
Para eliminar todos los controladores de eventos en un elemento o conjunto de elementos, simplemente haga lo siguiente:
$('.some-selector').unbind(); Para desvincular solo los controladores de clic, use unbind('click') :
$('.some-selector').unbind('click');Para desvincular todos los controladores de clics e inmediatamente vincular 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 con jQuery (usando .bind o cualquier método jQuery que use .bind internamente). Si desea eliminar todos los eventos onclick posibles de un conjunto de elementos dado, puede usar:
$('.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; });Me gustaría proporcionar una idea sin eliminar todos los eventos juntos (simplemente anularlos).
Si su nuevo evento de enlace único (lo llamamos "clic" aquí) es específico del elemento al que se enlaza, entonces creo que puede ignorar cualquier otro evento simplemente con la función stopPropagation(). Me gusta esto
$("specific-selector").on("click", ".specific-class", function (e) { e.stopPropagation() // e.stopImmediatePropagation() /* your code continues ... */ });Detendrá las burbujas de eventos, por lo que sus otros eventos no se activarán. use stopImmediatePropagation() para evitar que otros eventos se adjunten a los mismos elementos que "clic".
Por ejemplo, si el evento "mouseeleave" también está vinculado al elemento $("specific-selector .specific-class"), tampoco se activará.
Por fin, todos los demás eventos no se activarán en este elemento sino en su nuevo elemento de "clic".
La pregunta sin resolver es, ¿qué pasa si otros eventos también usan stopPropagation()? ... Entonces creo que gana el que tiene la mejor especificación, así que trate de evitar eventos complejos, demasiados es la sugerencia final.
Puede ver "Eventos directos y delegados" en el sitio de jQuery para obtener más información.
Intenta usar live en lugar de bind . Luego, puede eliminar fácilmente la unión en vivo con el troquel del selector, que es una operación rápida, y configurar otra en vivo igualmente rápida.
$('selection here').live('..', .....); // multiple invocations $('selection here').die(); $('selection here').live('click',.....);DOM no se toca en absoluto. La condición del evento se evalúa cuando ocurre el evento.
Pero, en general, si solo desea intercambiar funciones de controlador, ¿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, reencuadernación, etc.