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