Как я искал решение проблемы, имеющей прямо сейчас, я нашел этот поток: jQuery: более одного обработчика для одного события. Теперь я задаюсь вопросом, можно ли удалить только один из этих обработчиков?
Можно ли удалить один обработчик события из события с несколькими обработчиками?
Ответ 1
Возможно, если вы не используете анонимные обратные вызовы:
var $elt = $(...);
function clickHandler1(event){...}
function clickHandler2(event){...}
// bind both
$elt.click(clickHandler1);
$elt.click(clickHandler2);
// unbind just the first
$elt.unbind('click', clickHandler1);
Смотрите также: .unbind()
docs.
Ответ 2
Собственно, вы можете сделать это, используя анонимные обратные вызовы через пространство имен событий:
$elt.bind('click.handler1', function(event) {
alert('click handler 1');
});
$elt.unbind('click.handler1');
Смотрите измененное демо здесь.
И здесь для получения дополнительной информации.
Это было добавлено в jQuery 1.4.3, которое на самом деле появилось за 4 месяца до того, как был задан вопрос.
Ответ 3
Этому посту очень много лет, поэтому я подумал о том, как это сделать сегодня (2019).
Большинство старых ответов выше, включая принятый ответ (который был правильным, когда он был написан), используют метод unbind
который не рекомендуется с Jquery v.3.0.
Начиная с jQuery 3.0,.unbind() устарел. Он был заменен методом .off() начиная с jQuery 1.7, поэтому его использование уже не приветствуется.
Вот как это сделать с помощью .off()
:
var foo = function() {
// Code to handle some kind of event
};
// ... Now foo will be called when paragraphs are clicked ...
$( "body" ).on( "click", "p", foo );
// ... Foo will no longer be called.
$( "body" ).off( "click", "p", foo );
Это будет работать для всех обработчиков событий, реализованных с помощью .on()
и также для неделегированных обработчиков событий. Просто замените "body" на ваш селектор элементов и удалите второй параметр метода .off()
("p" в примере выше).