Как удалить все обработчики событий кликов с помощью jQuery?


121

У меня проблема. Обычно, когда пользователь щелкает ссылку «Изменить» на странице, выполняется следующий код JQuery:

$("#saveBtn").click(function () {
    saveQuestion(id);
});

Таким образом, событие onClick кнопки сохранения вызывает saveQuestion()метод и передает идентификатор вопроса, для которого была нажата ссылка «Изменить».

Но если в одном и том же сеансе пользователь нажимает кнопку редактирования для 2 вопросов, то вместо перезаписи предыдущего clickобработчика событий он вызывает запуск двух обработчиков событий, один из которых может вызывать, saveQuestion(1)а другой может вызывать saveQuestion(2). Таким образом, один вопрос заменяет другой.

Есть ли способ удалить все предыдущие clickсобытия, назначенные кнопке?

Ответы:


203

Вы должны использовать off () для удаления такого события:

$("#saveBtn").off("click");

но это удалит все события щелчка, связанные с этим элементом. Если функция с SaveQuestion является единственным связанным событием, то это сделает вышеуказанный. Если нет, сделайте следующее:

$("#saveBtn").off("click").click(function() { saveQuestion(id); });

31
Начиная с jQuery 1.7, вы должны использовать on и off вместо bind и unbind
Ральф Янсен

@LockTar, можете ли вы подсказать, как это написать?
Джон Магнолия

@JohnMagnolia См. Мои изменения выше.
Ральф Янсен

1
.addAttr ( 'OnClick'); или .removeAttr ('onclick');
Aliti

13

Есть ли способ удалить все предыдущие события щелчка, назначенные кнопке?

$('#saveBtn').unbind('click').click(function(){saveQuestion(id)});

unbind()устарел с jQuery 3.0, а использование off()поощряется с версии 1.7.
Скайлар Иттнер


2

Если вы использовали ...

$(function(){
    function myFunc() {
        // ... do something ...
    };
    $('#saveBtn').click(myFunc);
});

... тогда потом будет проще отвязать.


1
Как ты рассчитываешь? Независимо от того, как привязаны события элемента, их всегда можно освободить одинаково ... $ ('# saveBtn'). Unbind ('любое событие (я)'); Теперь, чтобы ПОВТОРИТЬ ... да, в определенных обстоятельствах ваша техника может быть проще.
KyleFarris

1
Если вы отмените привязку всех событий щелчка, то ничего не изменится. Но если бы вы хотели отвязать только одно конкретное действие, я бы не стал переписывать это событие в двух местах. И, как вы сказали, если я захочу повторно привязать ее позже, это снова будет легче сделать, потому что мне не нужно писать функцию в третий раз.
Джарретт Мейер,

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.