Я привязываю событие щелчка к кнопке:
$('#myButton').bind('click', onButtonClicked);
В одном сценарии это вызывается несколько раз, поэтому, когда я делаю это, trigger
я вижу несколько вызовов ajax, которые я хочу предотвратить.
Как мне это сделать, bind
только если он не был связан раньше.
Ответы:
Обновление 24 августа 2012 г . : в jQuery 1.8 больше невозможно получить доступ к событиям элемента с помощью
.data('events')
. (Подробнее см. В этой ошибке .) Можно получить доступ к тем же данным сjQuery._data(elem, 'events')
помощью внутренней структуры данных, которая недокументирована и, следовательно, не на 100% гарантирует стабильность. Однако это не должно быть проблемой, и соответствующую строку кода плагина выше можно изменить на следующее:События jQuery хранятся в названном объекте данных
events
, поэтому вы можете искать в нем:Конечно, было бы лучше, если бы вы могли структурировать свое приложение так, чтобы этот код вызывался только один раз.
Это может быть инкапсулировано в плагин:
Затем вы можете позвонить:
источник
<a>
? Потому что, когда я пытаюсь, он говорит оjQuery._data()
следующей ошибкеTypeError: a is undefined
var data = jQuery._data(this[0], 'events')[type];
в try catch и вернул false в catch. Если никакие события не привязаны к этому [0], то вызов [type] вызовет некоторую вариацию «Невозможно получить свойство 'click' неопределенной или нулевой ссылки» и, очевидно, это также говорит вам то, что вам нужно знать.for (var i = 0; i < data.length; i++) { if (data[i].handler.toString() === fn.toString()) { return true; } }
Еще один способ - пометить такие кнопки классом CSS и фильтром:
В последних версиях jQuery замените
bind
наon
:источник
При использовании jQuery 1.7+:
Вы можете позвонить
off
раньшеon
:Если не:
Вы можете просто отвязать его первое событие:
источник
.unbind('click', onButtonClicked)
. См. Руководство$(sel).unbind("click.myNamespace");
$('#myButton').unbind('click', onButtonClicked).bind('click', onButtonClicked);
На мой взгляд, лучший способ - использовать live () или delegate () для захвата события в родительском элементе, а не в каждом дочернем элементе.
Если ваша кнопка находится внутри элемента #parent, вы можете заменить:
$('#myButton').bind('click', onButtonClicked);
по
$('#parent').delegate('#myButton', 'click', onButtonClicked);
даже если #myButton еще не существует, когда этот код выполняется.
источник
Я написал очень маленький плагин под названием «once», который делает это. Выполнять от случая к случаю в элементе.
А просто:
источник
off
удаляю все обработчики для данного типа? Это означает, что если бы существовал отдельный обработчик кликов, не связанный, но с одним и тем же элементом, разве он не был бы удален?Почему бы не использовать это
unbind()
передbind()
источник
$('#myButton').off().on('click', onButtonClicked);
у меня тоже работает.Вот моя версия:
Использование:
источник
На основе ответа @ konrad-garus, но с использованием
data
, поскольку я считаю, что егоclass
следует использовать в основном для стилизации.источник
Чтобы избежать проверки / привязки / отмены привязки, вы можете изменить свой подход! Почему бы вам не использовать JQuery .on ()?
Поскольку Jquery 1.7, .live (), .delegate () устарели, теперь вы можете использовать .on () для
Это означает, что вы можете прикрепить событие к родительскому элементу, который все еще существует, и присоединить дочерние элементы независимо от того, присутствуют они или нет!
Когда вы используете .on () вот так:
Вы ловите событие, щелкнув по родительскому элементу, и ищите дочерний элемент '#myButton', если он существует ...
Поэтому, когда вы удаляете или добавляете дочерний элемент, вам не нужно беспокоиться о том, добавлять или удалять привязку события.
источник
.off
которой, как я полагаю, удаляла бы несвязанные обработчики в процессе.Пытаться:
источник
источник
По состоянию на июнь 2019 года я обновил функцию (и она работает для того, что мне нужно)
источник
У JQuery есть решение :
эквивалент:
источник