Переопределить все события JavaScript, привязанные к элементу, одним новым событием

Предположим, что на сайте имеется большое количество элементов, к которым привязано неизвестное количество и тип событий.

Если мне нужно переопределить все эти события одним связанным событием, и только это событие сработает, каковы некоторые рекомендации?

Я бы привязал событие к обработчику события клика, и я использую jQuery.

Заранее спасибо.


person jerome    schedule 11.01.2011    source источник
comment
Вы имеете в виду без фактического отключения исходных обработчиков событий?   -  person user113716    schedule 11.01.2011
comment
Фу; это звучит как очень плохая идея. Однако я подозреваю, что вы могли бы сделать это, разобравшись с внутренним механизмом jQuery и подорвав его своим собственным кодом.   -  person Pointy    schedule 11.01.2011
comment
@patrick dw - Отмена привязки всех исходных обработчиков событий кликов — это нормально, если для этого не требуется идентифицировать точное событие, связанное с кликом. Если есть способ отменить привязку всех событий щелчка, а затем привязать это конкретное, переопределяющее событие щелчка, тогда это будет просто прекрасно.   -  person jerome    schedule 11.01.2011
comment
Будут ли все элементы получать один и тот же обработчик для каждого типа события? И были ли исходные связаны с помощью jQuery? Если нет, то как они были связаны?   -  person user113716    schedule 11.01.2011


Ответы (4)


Вы ищете jQuery#unbind.

Чтобы удалить все обработчики событий для элемента или набора элементов, просто выполните:

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

Чтобы отвязать только обработчики кликов, используйте unbind('click'):

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

Чтобы отвязать все обработчики кликов и сразу после этого привязать свой собственный обработчик, вы можете сделать что-то вроде этого:

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

Обратите внимание, что это будет работать только для событий, связанных с использованием jQuery (с использованием .bind или любого метода jQuery, который использует .bind внутри). Если вы хотите удалить все возможные события onclick из заданного набора элементов, вы можете использовать:

$('.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;
  });
person Mathias Bynens    schedule 11.01.2011
comment
Это не распространяется на события, которые были связаны с прослушивателями событий встроенного javascript или простого Javascript. - person jAndy; 11.01.2011
comment
Как насчет $(".some-selector").unbind("click").attr("onclick", "").each(function(){ this.onclick = null; });? - person Alexander Wallin; 11.01.2011

Я хотел бы поделиться мыслью, не удаляя все события вместе (просто переопределить их).

Если ваше новое одно связанное событие (здесь мы называем его «щелчок») специфично для элемента, к которому оно привязано, то я считаю, что вы можете игнорировать любые другие события просто с помощью функции stopPropagation(). Так

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

Это остановит всплывающие окна событий, поэтому другие ваши события не будут срабатывать. используйте stopImmediatePropagation(), чтобы предотвратить другие события, прикрепленные к тем же элементам, что и «щелчок».

Например, если событие mouseleave также привязано к элементу $("specific-selector .specific-class"), оно также не сработает.

Наконец, все остальные события не будут срабатывать на этом элементе, а на вашем новом элементе «щелчок».

Нерешенный вопрос: что, если другие события также используют stopPropagation()? ... Тогда я думаю, что побеждает тот, у кого лучшая спецификация, поэтому старайтесь избегать сложных, слишком многих событий - это последнее предложение.

Дополнительные сведения см. в разделе "Прямые и делегированные события" на сайте jQuery.

person francischan    schedule 31.12.2013

Похоже, это довольно просто на самом деле:

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

Спасибо за ваши ответы.

person jerome    schedule 11.01.2011
comment
Вам не нужны два оператора, вы можете связать их вместе (как я объяснил в мой ответ). - person Mathias Bynens; 11.01.2011

Попробуйте использовать live вместо bind. Затем вы можете легко удалить живую привязку с помощью die из селектора, который является быстрой операцией, и установить другую так же быстро.

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

DOM вообще не трогается. Состояние события оценивается при возникновении события.

Но вообще, если вы просто хотите поменять местами функции-обработчики, почему бы не сделать это так:

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 */ };

Это абсолютно бесплатно для любых изменений, перепривязки и т.д.

person gertas    schedule 11.01.2011
comment
Использовал чей-то код, который использовал «живой», и не мог понять, как отвязать... это сэкономило мне много времени и головных болей;) - person afreeland; 19.01.2012
comment
К вашему сведению: используйте jQuery on() сейчас, так как live() устарела. - person aikeru; 15.11.2012