jQuery Custom事件如何正常工作

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

这条路:

// 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 ](); } } 

这里发生的事情如下:

当调用trigger ,jQuery会检查事件是否被全局触发( $.trigger("event_name"); )。

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

 jQuery.event.trigger( event, data, parent, true ); 

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

看看教程

 $(document).bind("eventType", ...); // This is equivalent to the plugin's $.subscribe("eventType", ...); $(document).trigger("eventType"); // equivalent to plugin's $.publish("eventType"); 

还要查看这个问题