Проверить, привязан ли обработчик событий к элементу в jQuery
Можно ли определить, имеет ли элемент обработчик клика или обработчик изменений или какой-либо обработчик событий, связанный с ним, используя jQuery?
Кроме того, можно ли определить, сколько обработчиков кликов (или любого другого вида обработчиков событий) оно имеет для определенного типа события и какие функции находятся в обработчиках событий?
Ответы
Ответ 1
вы можете получить эту информацию из кэша данных.
//регистрируем их на консоли (firebug, ie8)
console.dir( $('#someElementId').data('events') );
//или итерации их
jQuery.each($('#someElementId').data('events'), function(i, event){
jQuery.each(event, function(i, handler){
console.log( handler.toString() );
});
});
Другой способ - использовать букмарклет, но, очевидно, это не помогает во время выполнения.
Ответ 2
Убивание привязки, когда оно еще не существует, не является лучшим решением, но кажется достаточно эффективным! Во второй раз, когда вы нажмете, вы можете с уверенностью узнать, что он не будет создавать дублирующее связывание.
Поэтому я использую die() или unbind() следующим образом:
$("#someid").die("click").live("click",function(){...
или
$("#someid").unbind("click").bind("click",function(){...
или в последних версиях jQuery:
$("#someid").off("click").on("click",function(){...
Ответ 3
Я написал плагин с именем hasEventListener, который именно это делает:
http://github.com/sebastien-p/jquery.hasEventListener
Надеюсь, что это поможет.
Ответ 4
Это решение больше не поддерживается с jQuery 1.8, как мы можем прочитать в блоге здесь:
$(element).data( "events" ): теперь он удален в 1.8, но вы все равно можете добраться до данных событий для целей отладки через $._ data (элемент, "события" ). Обратите внимание, что это не поддерживаемый публичный интерфейс; фактические данные структуры могут меняться несовместимо с версией на версию.
Итак, вы должны развязать/переподтвердить его или просто использовать логическое значение, чтобы определить, было ли ваше событие прикрепленным или нет (что, на мой взгляд, лучшее решение).
Ответ 5
Я думаю, что это могло бы быть обновлено с помощью jQuery 1.9. *
Я нахожу, что это единственное, что работает для меня на данный момент:
$._data($("#yourElementID")[0]).events
Ответ 6
Я написал очень маленький плагин под названием "один раз", который делает это:
$.fn.once = function(a, b) {
return this.each(function() {
$(this).off(a).on(a,b);
});
};
И просто:
$(element).once('click', function(){
});
Ответ 7
Для jQuery 1.9 +
var eventListeners = $._data($('.classname')[0], "events");
Мне нужен литерал массива [0]
.
Ответ 8
Я не думаю, что упомянутый плагин hasEventListener будет обрабатывать пользовательские события, например.
var obj = {id:'test'};
$(obj).bind('custom', function(){
alert('custom');
}).trigger('custom');
alert($(obj).hasEventListener('custom'));
Кроме того, по крайней мере, в jQuery 1.5 я думаю, вам нужно быть осторожным с использованием $(target).data('events'), потому что он возвращает по-разному для событий, связанных с объектами, как указано выше.
Вам нужно сделать что-то вроде:
var events = $(target).data("events");
if(typeof events === "function"){
events = events.events;
}
Я использую такой подход, и он работает, но мне кажется, что я нахожусь во власти внутренних фреймов jquery, и я действительно не должен этого делать!
Ответ 9
Отсылаем ответ SJG и W3Schools.com
В версии jQuery версии 1.7 метод off() - это новая замена методов unbind(), die() и undelegate(). Этот метод обеспечивает много согласованности с API, и мы рекомендуем использовать этот метод, поскольку он упрощает базу кода jQuery.
Это дает:
$("#someid").off("click").live("click",function(){...
или
$("#someid").off("click").bind("click",function(){...
Ответ 10
У меня была такая же потребность и быстро исправил существующий код, чтобы иметь возможность сделать что-то вроде этого:
if( $('.scroll').hasHandlers('mouseout') ) // could be click, or '*'...
{
... code ..
}
Он также работает для делегирования событий:
if ( $('#main').hasHandlers('click','.simple-search') ) ...
Он доступен здесь: jquery-handler-toolkit.js
Ответ 11
Это работает для меня:
$ ( '# Profile1'). Атр ( 'OnClick')