2011-03-25 15 views
6

En una aplicación que usa jQuery, me gustaría iniciar sesión en la consola cada vez que se desencadena un tipo de evento, incluidos los personalizados.Manejar todos los tipos de eventos en jQuery

¿Hay alguna forma de hacerlo sin modificar la fuente de jQuery y sin enlazar a una gran lista larga de todos los tipos de eventos posibles?

Respuesta

8
var oldTrigger = jQuery.event.trigger; 

jQuery.event.trigger = function(event, data, elem) { 
    // do stuff 
    oldTrigger.apply(this, arguments); 
} 

sólo tiene que Throughly comprobación de que cada gatillo no ir a través de este método.

trigger: function(type, data) { 
      return this.each(function() { 
        jQuery.event.trigger(type, data, this); 
      }); 
    }, 

Por lo menos $.fn.trigger pasa por jQuery.event.trigger

  // Trigger the event, it is assumed that "handle" is a function 
      var handle = jQuery.data(elem, "handle"); 
      if (handle) { 
        handle.apply(elem, data); 
      } 

alternativa, se puede sobrescribir jQuery.data e interceptar la configuración de controladores de eventos.

for (var i = 0, l = this.length; i < l; i++) { 
          jQuery.event.add(this[i], type, handler, data); 
        } 

El método utiliza bindjQuery.event.add para agregar controladores. También puedes interceptar eso.

jQuery.each(("blur focus focusin focusout load resize scroll unload click dblclick " + 
     "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + 
     "change select submit keydown keypress keyup error").split(" "), function(i, name) { 

     // Handle event binding 
     jQuery.fn[ name ] = function(fn) { 
       return fn ? this.bind(name, fn) : this.trigger(name); 
     }; 

     if (jQuery.attrFn) { 
       jQuery.attrFn[ name ] = true; 
     } 
}); 

Todos los eventos estándar pasan por $.fn.trigger o $.fn.bind

if (name === "live") { 
           // bind live handler 
           context.each(function(){ 
             jQuery.event.add(this, liveConvert(type, selector), 
               { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType }); 
           }); 

$.fn.live pasa por jQuery.event.add.

En conclusión todo pasa por jQuery.event.add y que a su vez hace esto:

if (!eventHandle) { 
        elemData.handle = eventHandle = function() { 
          // Handle the second event of a trigger and when 
          // an event is called after a page has unloaded 
          return typeof jQuery !== "undefined" && !jQuery.event.triggered ? 
            jQuery.event.handle.apply(eventHandle.elem, arguments) : 
            undefined; 
        }; 
      } 

¿Qué está escribiendo el controlador de eventos a jQuery.data(elem) donde elem es un nodo DOM.

[[En conclusión]]

Personalmente, diría que jQuery.data es complejo y un dolor para sobrescribir de forma segura por lo que en lugar de simplemente sobrescribir jQuery.event.add.

[[vivo Ejemplo]]

http://jsfiddle.net/qLRuT/8/

+0

acercamiento agradable pero había que modificar el código jQuery anulando la misma. Voto de todos modos;) – Nikhil

+0

Parece que todo pasa por ese método, excepto los eventos de navegador estándar, pero eso es lo suficientemente bueno para mis propósitos. ¡Gracias! –

+0

@Nikhil - Estoy bien parcheando el método en tiempo de ejecución. Simplemente no quería tocar la fuente. :) –

Cuestiones relacionadas