проверьте, привязан ли обработчик событий к элементу в jQuery [duplicate]

этот вопрос уже есть ответ здесь:

можно ли определить, имеет ли элемент обработчик click или обработчик изменений или какой-либо обработчик событий, связанный с ним с помощью jQuery?

кроме того, возможно ли определите, сколько обработчиков кликов (или каких обработчиков событий) он имеет для данного типа события и какие функции находятся в обработчиках событий?

11 ответов


вы можете получить эту информацию из кэша данных.

/ / войдите в консоль (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() );

    });

});

другой способ-вы можете использовать следующие закладка но, очевидно, это не поможет во время выполнения.


убийство привязки, когда она еще не существует, не является лучшим решением, но кажется достаточно эффективным! Во второй раз, когда вы "нажимаете", вы можете с уверенностью знать, что он не создаст дубликат привязки.

поэтому я использую die() или unbind () следующим образом:

$("#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(элемент, "события"). обратите внимание, что это не поддерживается открытый интерфейс; фактические данные структуры могут изменяться несовместимо от версии к версии.

таким образом, вы должны отменить / повторно связать его или просто использовать boolean, чтобы определить, было ли ваше событие прикреплено или нет (что, на мой взгляд, является лучшим решением).


Я думаю, что это могло обновиться с jQuery 1.9.*

Я нахожу это единственное, что работает для меня на данный момент:

$._data($("#yourElementID")[0]).events

Я написал очень маленький плагин под названием "Один раз", который делает это:

$.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 я думаю, что вам нужно быть осторожным, используя $(target).данных ("события"), потому что он возвращает по-разному для событий, которые были привязаны к объектам, как указано выше.

нужно сделать что-то вроде:

var events = $(target).data("events");
if(typeof events === "function"){
   events = events.events;
}

Я использую такой подход, и он работает, но кажется, что я нахожусь во власти jQuery internals и что мне не следовало этого делать!


у меня была такая же потребность и быстро исправил существующий код, чтобы иметь возможность сделать что-то вроде этого:

 if( $('.scroll').hasHandlers('mouseout') )  // could be click, or '*'...
 { 
   ... code ..
 }

он работает и для делегирования событий:

 if ( $('#main').hasHandlers('click','.simple-search') )  ...

это здесь : jQuery-handler-toolkit.js


со ссылкой на ответ SJG и от W3Schools.com

начиная с версии 1.7 jQuery метод off () является новой заменой методов unbind (), die () и undelegate (). Этот метод обеспечивает большую согласованность API, и мы рекомендуем использовать этот метод, поскольку он упрощает базу кода jQuery.

это дает:

$("#someid").off("click").live("click",function(){...

или

$("#someid").off("click").bind("click",function(){...

Это работает для меня: $('#profile1').буква attr('onclick функции')