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

JQuery: как развязать событие, связанное с объектом документа?

У меня есть плохо запрограммированная библиотека, которая делает это

$(document).on('click','#keep_first_only_button', function(){

Я написал после этого часть кода, чтобы "переопределить" это плохое поведение

$("keep_first_only_button").unbind("click");
$("keep_first_only_button").on("click", selectKeepFirstOfAll);

НО это не работает, тогда обработчик функции document.click запускается снова

Я не могу отменить все события кликов из документа, потому что на странице произойдут бедствия.

Какой правильный способ действовать в этой ситуации?

РЕДАКТИРОВАТЬ: Извините за вопрос о потерях времени, я не видел отсутствующего "#" в моем селекторе. Мне очень жаль!

4b9b3361

Ответ 1

$("#keep_first_only_button")...

Отсутствует хэш?

Ответ 2

Исходный обработчик событий был связан как делегированное событие, поэтому вы не можете удалить его из $('#keep_first_only_button'). Вам нужно удалить его на уровне document.

Из документация:

Чтобы удалить определенные делегированные обработчики событий, укажите selectorаргумент. Строка селектора должна точно соответствовать той, которая была передана .on() при подключении обработчика событий. Чтобы удалить все делегированные события из элемента без удаления не делегированных событий, используйте специальное значение "**".

Другими словами, чтобы отвязать делегированное событие, вы должны просто использовать тот же набор аргументов, который вы использовали для их связывания, вместо этого передайте их вместо off. Поскольку связанная функция анонимна, вы не можете ссылаться на нее, поэтому вам придется решить, отвязав все делегированные обработчики событий, связанные с #keep_first_only_button на уровне document:

$(document).off('click', '#keep_first_only_button');

РЕДАКТИРОВАТЬ: Похоже, проблема заключалась только в отсутствии хэша. Нечетный, я думал, что вы не можете отменить делегированные обработчики событий, используя обычный вызов .off()...

Ответ 3

Для кого-то интересно... Маттиас Буэленс прав.

Если у вас есть связанный элемент, например

$(document).on("click","#element",function(){ });

И вы хотите отключить его позже, вы должны сделать это как:

 $("#element").click(function(e) { 
    $(document).off('click', '#element'); 
});

Ответ 4

Если вы хотите удалить событие без использования select, используйте

$(документ).off("click", "**" );