Búsqueda de sitios web

javascript - Manejar todos los tipos de eventos en jQuery


En una aplicación que utiliza jQuery, me gustaría registrar en la consola cada vez que se active cualquier tipo de evento, incluidos los eventos personalizados.

¿Hay alguna manera de hacer esto sin modificar el código fuente de jQuery y sin enlazarse a una lista larga de todos los posibles tipos de eventos?

Respuesta #1

var oldTrigger = jQuery.event.trigger;

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

Solo necesito verificar minuciosamente que cada disparador realmente pase por este método.

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

Como mínimo, $.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 );
            }

Alternativamente, puedes sobrescribir jQuery.data e interceptar la configuración de los manejadores de eventos.

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

El método bind utiliza jQuery.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 a través de jQuery.event.add y eso 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;
                    };
            }

Que está escribiendo el controlador de eventos en jQuery.data( elem ) donde elem es un nodo del DOM.

[[En conclusión]]

Personalmente diría que jQuery.data es complejo y un dolor de cabeza sobrescribirlo de manera segura, así que en su lugar simplemente sobrescribe jQuery.event.add.

[[Ejemplo en vivo]]

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