Проверить, привязан ли обработчик событий к элементу в 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(){...

Ответ 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')