jQuery Custom事件如何正常工作

Rod*_*son 9 javascript jquery

我找不到任何关于如何实际实现jquery中的自定义事件的好资源.就像他们如何模拟事件冒泡等.

Sea*_*ira 7

这条路:

// bubbling is internal
trigger: function( event, data, elem /*, bubbling */ ) {
// Event object or event type
var type = event.type || event,
    bubbling = arguments[3];

// Handle a global trigger
if ( !elem ) {
    // Don't bubble custom events when global (to avoid too much overhead)
    event.stopPropagation();

    // Only trigger if we've ever bound an event for it
    if ( jQuery.event.global[ type ] ) {
        jQuery.each( jQuery.cache, function() {
            if ( this.events && this.events[type] ) {
                jQuery.event.trigger( event, data, this.handle.elem );
            }
        });
    }
}

// ... snip ...
// Trigger the event, it is assumed that "handle" is a function
var handle = elem.nodeType ?
    jQuery.data( elem, "handle" ) :
    (jQuery.data( elem, "__events__" ) || {}).handle;

if ( handle ) {
    handle.apply( elem, data );
}

var parent = elem.parentNode || elem.ownerDocument;
// ... snip ....
if ( !event.isPropagationStopped() && parent ) {
    jQuery.event.trigger( event, data, parent, true );

   } else if ( !event.isDefaultPrevented() ) {
   // ... snip ...
                jQuery.event.triggered = true;
                target[ targetType ]();
    }
}
Run Code Online (Sandbox Code Playgroud)

这里发生的事情如下:

何时trigger调用jQuery检查事件是否被全局触发($.trigger("event_name");).

如果它没有被全局触发,并且传播尚未停止有问题的元素具有父元素(!event.isPropagationStopped() && parent),则jQuery在父元素上手动调用触发事件.

jQuery.event.trigger( event, data, parent, true );
Run Code Online (Sandbox Code Playgroud)

还有更多的事情 - 请参阅jQuery源代码中的event.js.