Як переписати обробники подій jquery


74

Я спробую пояснити проблему простим кодом.

var fireClick = function() { alert('Wuala!!!') };

$('#clickme').click(fireclick);
$('#clickme').click(fireclick);

Отже, тепер він, очевидно, буде попереджати 2 рази, але мені потрібно попередження лише один раз. Спробував стільки шляхів, але результату немає.

Дякую.


Чи можете ви дати деякий контекст навколо того, як виклик для прив'язки події закінчується повторенням двічі? Можливо, ви можете запобігти зміні другого виклику того, як ваш код трохи функціонує.
Марк Ренуф,


19
Це, "Вуаля". :)
Марк Аллен

2
Позначте відповідь, якщо вона відповідає на ваше запитання на користь інших користувачів, яким може знадобитися посилання на це запитання.
Саян

Відповіді:


134

Починаючи з jQuery 1.7, ви повинні використовувати off, щоб видалити обробники подій і увімкнути їх додавання, хоча ви все ще можете використовувати clickскорочення.

$('#clickme').off('click').on('click', fireclick);
$('#clickme').off().on('click', fireclick);

Оригінальна відповідь:

Якщо ви хочете замінити всі обробники клацань, спочатку викликайте unbind без аргументу функції. Якщо ви хочете замінити всі обробники подій, не вказуйте тип події.

$('#clickme').unbind('click').click(fireclick);
$('#clickme').unbind().click(fireclick);

1
Бах! Ви виграєте за ланцюжок дзвінків, але, можливо, уточнюєте свою відповідь, щоб вона лише видаляла конкретний обробник, який повторно додається? Отже: $ ('# clickme'). Unbind ('click', fireclick) .click (fireclick)
Mark Renouf

4
Питання було "перезаписати обробники подій jquery" - я припускав, що він хотів їх усіх замінити. Для цього йому потрібно кожного разу викликати unbind (саме тому я повторив виклик на обох) і не вказувати аргумент функції.
tvanfosson

3
Це точно був правильний спосіб зробити це, коли ви відповіли на запитання, тому я підтримав. Тим не менш, я вважаю, що "новий і вдосконалений" спосіб полягає у методах on () і off (). Оскільки ця відповідь є першим результатом пошуку Google за запитом "обробник подій jquery replace", може бути корисно додати до Вашої відповіді. $('#clickme').off('click').on('click', fireclick);або просто $('#clickme').off('click').click(fireclick);.
chucksmash

@IamChuckB дякую за оновлення, я додав це до своєї відповіді.
tvanfosson

24

Використовуйте простір імен, щоб переконатися, що не видаляєте інших слухачів:

$('#clickme').off('click.XXX').on('click.XXX', fireclick);

Поки жоден інший код не використовує XXX , ви можете бути впевнені, що не зіпсували якоїсь іншої поведінки, про яку вам не було відомо.


18

Ви можете скористатися функцією від'єднання jQuery, щоб видалити першу подію:

var fireClick = function() { alert('Wuala!!!') };

$('#clickme').click(fireclick);
$('#clickme').unbind('click', fireClick); // fireClick won't fire anymore...
$('#clickme').click(fireclick); // ...but now it will

3

Я хотів би спробувати усунути зайві дзвінки, але, незважаючи на те, що ви можете переконатись, що зателефонуєте обом цим кожного разу:

$('#clickme').unbind('click', fireclick);
$('#clickme').click(fireclick);


-11

Вам слід використовувати setInterval. Проблема в тому, що ви не можете одночасно вискакувати два попередження. Перший потрібно закрити першим, або другий не може з'явитися на екрані ...

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