Як видалити всі обробники подій клацання за допомогою jQuery?


121

У мене є проблеми. В основному, коли користувач натискає посилання "Редагувати" на сторінці, працює такий код Jquery:

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

Роблячи це, подія onClick кнопки збереження викликає saveQuestion()метод і передає ідентифікатор питання, на який було натиснуто посилання "Редагувати".

Але якщо в той же сеанс користувач натискає на редагування на два запитання, то замість того, щоб перезаписати попередній clickобробник подій, він замість цього викликає запуск 2 обробників подій, один, який може зателефонувати, saveQuestion(1)а другий може зателефонувати saveQuestion(2). Виконуючи це 1 запитання замінює інше.

Чи є спосіб видалити всі попередні clickподії, призначені кнопці?

Відповіді:


203

Ви будете використовувати off () для видалення такої події:

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

але це видалить усі події кліку, пов'язані з цим елементом. Якщо функція SaveQuestion є єдиною пов'язаною подією, то це зробить вище. Якщо не зробити наступне:

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

31
Оскільки jQuery 1.7, вам слід використовувати ввімкнення та вимкнення замість прив’язки та відключення
Ральф Янсен

@LockTar Ви можете запропонувати, як це слід написати замість цього?
Джон Магнолія

@JohnMagnolia Дивіться мої зміни вище.
Ральф Янсен

1
.addAttr ('onclick'); або .removeAttr ('onclick');
Аліті

13

Чи є спосіб видалити всі попередні події клацання, призначені кнопці?

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

unbind()застаріло на jQuery 3.0, а використання off()оновлених рекомендується з 1.7.
Skylar


2

Якщо ви використовували ...

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

... тоді згодом буде легше розв’язати.


1
Як ти малюєш? Незалежно від того, як пов'язані події елемента, вони завжди можуть бути незв'язаними однаково ... $ ('# saveBtn'). Unbind ('будь-яка подія (и)'); Тепер, щоб RE-BIND ... так, ваша техніка може бути простішою за певних обставин.
KyleFarris

1
Якщо відв’язати всі події клацання, то це не відрізнятиметься. Але якби ви хотіли скасувати лише одну конкретну дію, я б не хотів переписувати цю подію у двох місцях. І як ви сказали, якщо я хочу повторно відновити його згодом, це знову зробити простіше, тому що мені не потрібно писати функцію втретє.
Джарретт Мейєр

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.