2009-10-03 3 views
157

Есть ли способ проверить, существует ли событие в jQuery? Я работаю над плагином, который использует пользовательские события с именами, и хотел бы иметь возможность проверить, привязано ли событие к элементу или нет.Проверить, существует ли событие на элементе

+1

так, в 1.8, все это неправильно? –

+4

@SkylarSaveland Method '$ .data (element," events ")' никогда не был официальным. Но в jQuery 1.8.0 этот метод остался слева через '. ._ data (element,« events »)'. Подробнее [здесь] (http://blog.jquery.com/2012/08/09/jquery-1-8-released/) – Anton

ответ

129
$('body').click(function(){ alert('test')}) 

var foo = $.data($('body').get(0), 'events').click 
// you can query $.data(object, 'events') and get an object back, then see what events are attached to it. 

$.each(foo, function(i,o) { 
    alert(i) // guid of the event 
    alert(o) // the function definition of the event handler 
}); 

Вы можете проверить, подавая ссылку на объект (а не объект JQuery, хотя) до $ .data, а для второго аргумента подачи «событий», и что будет возвращать объект, заполненный все события, такие как " нажмите». Вы можете пропустить этот объект и посмотреть, что делает обработчик событий.

+2

Мне действительно понравился ваш первый пример, события $ .data (elem, ' ') предоставляет гораздо больше информации. –

+0

Я добавил, что в качестве комментария –

+17

Почему бы вам просто не использовать $ ('body'). Data ('events')? – James

24

использование JQuery фильтр событий

вы можете использовать его как этот

$("a:Event(click)") 
+33

Ха, спасибо, построил этот плагин после ответа медикера несколько месяцев назад. –

+19

Начиная с версии 1.8, этот плагин больше не работает –

+3

Мне это нравится, отправляя плагин OP, созданный как ответ на его вопрос :) – Andy

5

Я написал плагин под названием hasEventListener который точно делает это.

Надеюсь, это поможет.

+1

Проблема в том, как это работает? Я был на нем несколько часов, и он до сих пор не ясен. Я просто хочу проверить, есть ли на нем событие клика, и получить логический ответ, а не объект, но большинство тех методов, которые вы предоставляете, по крайней мере на примерах, намного сложнее. Интересно: http://www.codingjack.com/playground/jquick/#haseventlistener, но я не использую jquick, но мне нравится эта чистая простота. –

62

Вы можете использовать:

$("#foo").unbind('click'); 

, чтобы убедиться, что все события кликов являются unbinded, а затем прикрепить ваше событие

+1

Не помогает, если вы использовали live для регистрации мероприятия. http://stackoverflow.com/questions/12755646/jquery-datatables-multiple-calls-to-event-handler-with-live-function –

+25

Вопрос в том, чтобы проверить, существует ли событие в элементе, а не как развязать существующие события ... – Avi

+35

@Avi, это по-прежнему хороший ответ, потому что во многих случаях вопрос задается с учетом этой проблемы: «Как не регистрировать обработчик дважды?» – hans

3

Ниже код предоставит вам все замковое событий на данном селекторе:

jQuery(selector).data('events').click 

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

jQuery(selector).data('events').click.length 

Думал, что это поможет кому-то. :)

+1

Не работает в jQuery> = 1.8. См. Ответ Тома Геркена для рабочего решения. – jbandi

25

Вот как проверить, существует ли какое-либо событие для элемента

<html> 
<head> 
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js" type="text/javascript"></script> 
    <script> 
     $(function() { 
      $("#textDiv").click(function() { 
       //Event Handling 
      }); 
      var events = $._data(document.getElementById('textDiv'), "events"); 
      var hasEvents = (events != null); 
     }); 
    </script> 
</head> 
<body> 
<div id="textDiv">Text</div> 
</body> 
</html> 
+0

Я думаю, вы можете упростить это, используя: var eventBound = (events! = Null); –

+0

Это решение работает с jQuery 1.8.0 позже. Большое спасибо Тон Геркен :) –

-1

я в конечном итоге делает это

typeof ($('#mySelector').data('events').click) == "object" 
0

Эта работа для меня показывает объекты и тип события, которое произошло.

var foo = $._data($('body').get(0), 'events'); 
    $.each(foo, function(i,o) { 
    console.log(i); // guide of the event 
    console.log(o); // the function definition of the event handler 
    }); 
Смежные вопросы