2009-10-03 26 views
157

¿Hay alguna manera de verificar si existe un evento en jQuery? Estoy trabajando en un complemento que usa eventos personalizados con espacios de nombres, y me gustaría poder verificar si el evento está vinculado a un elemento o no.Compruebe si existe evento en el elemento

+1

entonces, en 1.8, ¿todo esto está mal? –

+4

@SkylarSaveland Método '$ .data (elemento," eventos ")' nunca fue oficial. Pero en jQuery 1.8.0 este método se salió a través de '$ ._ data (element," events ")'. leer más [aquí] (http://blog.jquery.com/2012/08/09/jquery-1-8-released/) – Anton

Respuesta

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 
}); 

Puede inspeccionar alimentando la referencia del objeto (no el objeto jQuery sin embargo) a $ .data, y para el segundo argumento de alimentación 'eventos' y que devolverá un objeto poblada con todos los eventos tales como ' hacer clic'. Puede recorrer ese objeto y ver qué hace el controlador de eventos.

+2

Me gustó mucho su primer ejemplo, los $ .data (elem, 'eventos ') proporciona mucha más información. –

+0

lo agregué como comentario –

+17

¿Por qué no solo usas $ ('body'). Data ('events')? – James

24

uso jQuery filtro de eventos

se puede utilizar de esta manera

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

Hah, gracias, construí ese complemento después de recibir la respuesta de Meder hace meses. –

+19

A partir de 1.8, este complemento ya no funciona –

+3

Me encanta esto, publicando un plugin OP creado como respuesta a su pregunta :) – Andy

5

me escribió un plugin llamado hasEventListener, que hace exactamente eso.

Espero que esto ayude.

+1

El problema es, ¿cómo funciona? He estado trabajando durante algunas horas, y aún no está claro. Solo quiero comprobar si hay un evento de clic y recuperar un booleano, no un objeto, pero la mayoría de los métodos que proporciona, al menos los ejemplos, son mucho más complicados. Curiosamente: http://www.codingjack.com/playground/jquick/#haseventlistener, pero no estoy usando jquick, pero me gusta esa simplicidad limpia. –

62

Es posible utilizar:

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

para asegurarse de que todos los eventos de clic son unbinded, después adjuntar su evento

+1

No ayuda si ha utilizado en vivo para registrar el evento. http://stackoverflow.com/questions/12755646/jquery-datatables-multiple-calls-to-event-handler-with-live-function –

+25

La pregunta es comprobar si existe evento en el elemento y no cómo desvincular los eventos existentes ... – Avi

+35

@Avi, sigue siendo una buena respuesta, porque en muchos casos la pregunta se realiza teniendo en cuenta el problema: "¿Cómo no registrar un controlador dos veces?" – hans

3

A continuación código le proporcionará todos los eventos de clic sobre dado de selección:

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

Puede iterar sobre él usando cada uno o por ej. compruebe la longitud para la validación como:

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

Pensé que ayudaría a alguien. :)

+1

No funciona más en jQuery> = 1.8. Vea la respuesta de Tom Gerken para una solución de trabajo. – jbandi

25

Aquí es cómo comprobar si existe cualquier caso para un elemento

<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

Creo que puede simplificar esto usando: var eventBound = (events! = Null); –

+0

Esta solución funciona con jQuery 1.8.0 más tarde. Muchas gracias Ton Gerken :) –

-1

que terminé haciendo este

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

Este trabajo para mí muestra los objetos y el tipo de evento que ha ocurrido.

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 
    }); 
Cuestiones relacionadas