Подтвердить что ты не робот

Можно ли удалить один обработчик события из события с несколькими обработчиками?

Как я искал решение проблемы, имеющей прямо сейчас, я нашел этот поток: jQuery: более одного обработчика для одного события. Теперь я задаюсь вопросом, можно ли удалить только один из этих обработчиков?

4b9b3361

Ответ 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" в примере выше).