javascript - pagina - probar si el controlador de eventos está enlazado a un elemento en jQuery
saber si existe elemento jquery (11)
Esta pregunta ya tiene una respuesta aquí:
¿Es posible determinar si un elemento tiene un controlador de clic, un controlador de cambios o cualquier tipo de controlador de eventos vinculado a jQuery?
Además, ¿es posible determinar cuántos manejadores de clics (o cualquier tipo de manejadores de eventos) tiene para un tipo dado de evento, y qué funciones están en los manejadores de eventos?
Con referencia a la respuesta de W3Schools.com y de W3Schools.com
A partir de la versión 1.7 de jQuery, el método off () es el nuevo reemplazo para los métodos unbind (), die () y undelegate (). Este método le da mucha consistencia a la API, y le recomendamos que use este método, ya que simplifica la base de código jQuery.
Esto da:
$("#someid").off("click").live("click",function(){...
o
$("#someid").off("click").bind("click",function(){...
Creo que esto podría haberse actualizado con jQuery 1.9. *
Estoy encontrando que esto es lo único que me funciona en este momento:
$._data($("#yourElementID")[0]).events
Eliminar la unión cuando no existe aún no es la mejor solución, ¡pero parece lo suficientemente eficaz! La segunda vez que ''haga clic'' puede saber con certeza que no creará un enlace duplicado.
Por lo tanto, uso die () o unbind () así:
$("#someid").die("click").live("click",function(){...
o
$("#someid").unbind("click").bind("click",function(){...
o en versiones recientes de jQuery:
$("#someid").off("click").on("click",function(){...
Escribí un plugin llamado hasEventListener que hace exactamente eso:
http://github.com/sebastien-p/jquery.hasEventListener
Espero que esto ayude.
Escribí un plugin muy pequeño llamado "once" que hace eso:
$.fn.once = function(a, b) {
return this.each(function() {
$(this).off(a).on(a,b);
});
};
Y simplemente:
$(element).once(''click'', function(){
});
Esta solución ya no es compatible desde jQuery 1.8, ya que podemos leer en el blog aquí:
$ (elemento) .data ("eventos"): ahora se eliminó en la versión 1.8, pero aún puede acceder a los datos de eventos con fines de depuración a través de $ ._ datos (elemento, "eventos"). Tenga en cuenta que esta no es una interfaz pública compatible; las estructuras de datos reales pueden cambiar incompatiblemente de una versión a otra.
Por lo tanto, debe desenlazar / volver a vincularlo o, simplemente, usar un booleano para determinar si su evento se adjuntó o no (lo que en mi opinión es la mejor solución).
Esto me funciona: $ (''# profile1''). Attr (''onclick'')
No creo que el complemento hasEventListener mencionado maneje eventos personalizados, por ejemplo
var obj = {id:''test''};
$(obj).bind(''custom'', function(){
alert(''custom'');
}).trigger(''custom'');
alert($(obj).hasEventListener(''custom''));
Además, al menos en jQuery 1.5, creo que debes tener cuidado al usar $ (target) .data (''eventos'') porque devuelve de manera diferente los eventos que se han enlazado a objetos como anteriormente.
Necesitas hacer algo como:
var events = $(target).data("events");
if(typeof events === "function"){
events = events.events;
}
Estoy usando este tipo de enfoque y funciona, pero se siente un poco como si estuviera a merced de jquery internals y realmente no debería estar haciéndolo.
Para jQuery 1.9+
var eventListeners = $._data($(''.classname'')[0], "events");
Necesitaba la matriz [0]
literal.
Puede obtener esta información de la caché de datos.
Por ejemplo, regístrelos en la consola (firebug, ie8):
console.dir( $(''#someElementId'').data(''events'') );
o iterarlos:
jQuery.each($(''#someElementId'').data(''events''), function(i, event){
jQuery.each(event, function(i, handler){
console.log( handler.toString() );
});
});
Otra forma es usar el siguiente bookmarklet pero obviamente esto no ayuda en el tiempo de ejecución.
Tenía la misma necesidad y rápidamente parché un código existente para poder hacer algo como esto:
if( $(''.scroll'').hasHandlers(''mouseout'') ) // could be click, or ''*''...
{
... code ..
}
Funciona también para la delegación de eventos:
if ( $(''#main'').hasHandlers(''click'',''.simple-search'') ) ...
Está disponible aquí: jquery-handler-toolkit.js