Как удалить все обработчики событий кликов с помощью 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); });
TStamper
источник
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.
Скайлар Иттнер
7
$('#saveBtn').off('click').click(function(){saveQuestion(id)});
Фо Нко
источник
2

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

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

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

Джарретт Мейер
источник
1
Как ты рассчитываешь? Независимо от того, как привязаны события элемента, их всегда можно освободить одинаково ... $ ('# saveBtn'). Unbind ('любое событие (я)'); Теперь, чтобы ПОВТОРИТЬ ... да, в определенных обстоятельствах ваша техника может быть проще.
KyleFarris
1
Если вы отмените привязку всех событий щелчка, то ничего не изменится. Но если бы вы хотели отвязать только одно конкретное действие, я бы не стал переписывать это событие в двух местах. И, как вы сказали, если я захочу повторно привязать ее позже, это снова будет легче сделать, потому что мне не нужно писать функцию в третий раз.
Джарретт Мейер,
0
$('#saveBtn').off('click').on('click',function(){
   saveQuestion(id)
});

Использование JQuery это прочь и на

Ninjaneer
источник