处理jQuery中的所有事件类型 [英] Handle all event types in jQuery

查看:110
本文介绍了处理jQuery中的所有事件类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在使用jQuery的应用程序中,每次触发任何类型的事件时,我都希望登录到控制台,包括自定义事件。

In an application using jQuery, I'd like to log to the console every time any type of event is triggered, including custom events.

有没有这样做不需要修改jQuery源代码,而不是绑定到每个可能的事件类型的大长列表?

Is there anyway of doing this without modifying the jQuery source, and without binding to a big long list of every possible event type?

推荐答案

var oldTrigger = jQuery.event.trigger;

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

只需要仔细检查每个触发器是否通过此方法。 / p>

Just need to throughly double check that every trigger does go through this method.

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

至少 $。fn.trigger 通过jQuery.event.trigger

At the very least $.fn.trigger goes through 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 );
            }

或者您可以覆盖 jQuery.data 并拦截事件处理程序的设置。

Alternatively you can overwrite jQuery.data and intercept the setting of event handlers.

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

bind 使用 jQuery.event.add 添加处理程序。你也可以拦截。

The bind method uses jQuery.event.add to add handlers. You can also intercept that.

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

所有标准事件都通过 $。fn.trigger

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 code> jQuery.event.add 。

$.fn.live goes through jQuery.event.add.

总之,一切都通过 jQuery.event.add ,然后这样做:

In conclusion everything goes through jQuery.event.add and that in turns does this :

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

哪个是将事件处理程序写入 jQuery.data (elem)其中 elem 是一个DOM节点。

Which is writing the event handler to jQuery.data( elem ) where elem is a DOM Node.

[[结论]]

个人我会说 jQuery.data 是复杂的,并且是一个痛苦的覆盖安全地,而不是覆盖 jQuery.event.add

Personally I would say jQuery.data is complex and a pain to overwrite safely so instead just overwrite jQuery.event.add.

[[实例 ]]

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

这篇关于处理jQuery中的所有事件类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆