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

StackOverflow https://stackoverflow.com/questions/4659032

Вопрос

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

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

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

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

Это было полезно?

Решение

Вы ищете 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 внутри). Если вы хотите удалить все возможные события OnClice из данного набора элементов, вы можете использовать:

$('.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;
  });

Другие советы

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

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

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

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

Например, если событие «Mousealeave» также связывается с элементом $ ("Специфический селектор. Специфичный класс"), оно также не будет стрелять.

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

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

Вы можете увидеть «прямые и делегированные события» на jQuery Site. за дополнительной информацией.

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

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

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

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

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

Дом вообще не тронут. Условие события оценивается при возникновении событий.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top