Переопределить все события JavaScript, связанные с элементом с одним новым событием
-
09-10-2019 - |
Вопрос
Предполагая, что на месте есть большое количество элементов, которые имеют неизвестное число и тип событий, связанных с ними.
Если мне нужно переопределить все эти события одним событием, и только это событие уводит, каковы некоторые рекомендации?
Я был бы привязан к событию с обработчиком событий 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 */ };
Это не дает абсолютно никаких затрат на каких -либо изменений, повторения и т. Д.