4 "../data/var/dataPriv",
5 "../data/var/acceptData",
9 ], function( jQuery, document, dataPriv, acceptData, hasOwn ) {
11 var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
13 jQuery.extend( jQuery.event, {
15 trigger: function( event, data, elem, onlyHandlers ) {
17 var i, cur, tmp, bubbleType, ontype, handle, special,
18 eventPath = [ elem || document ],
19 type = hasOwn.call( event, "type" ) ? event.type : event,
20 namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
22 cur = tmp = elem = elem || document;
24 // Don't do events on text and comment nodes
25 if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
29 // focus/blur morphs to focusin/out; ensure we're not firing them right now
30 if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
34 if ( type.indexOf( "." ) > -1 ) {
36 // Namespaced trigger; create a regexp to match event type in handle()
37 namespaces = type.split( "." );
38 type = namespaces.shift();
41 ontype = type.indexOf( ":" ) < 0 && "on" + type;
43 // Caller can pass in a jQuery.Event object, Object, or just an event type string
44 event = event[ jQuery.expando ] ?
46 new jQuery.Event( type, typeof event === "object" && event );
48 // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
49 event.isTrigger = onlyHandlers ? 2 : 3;
50 event.namespace = namespaces.join( "." );
51 event.rnamespace = event.namespace ?
52 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
55 // Clean up the event in case it is being reused
56 event.result = undefined;
57 if ( !event.target ) {
61 // Clone any incoming data and prepend the event, creating the handler arg list
64 jQuery.makeArray( data, [ event ] );
66 // Allow special events to draw outside the lines
67 special = jQuery.event.special[ type ] || {};
68 if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
72 // Determine event propagation path in advance, per W3C events spec (#9951)
73 // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
74 if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
76 bubbleType = special.delegateType || type;
77 if ( !rfocusMorph.test( bubbleType + type ) ) {
80 for ( ; cur; cur = cur.parentNode ) {
81 eventPath.push( cur );
85 // Only add window if we got to document (e.g., not plain obj or detached DOM)
86 if ( tmp === ( elem.ownerDocument || document ) ) {
87 eventPath.push( tmp.defaultView || tmp.parentWindow || window );
91 // Fire handlers on the event path
93 while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
97 special.bindType || type;
100 handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
101 dataPriv.get( cur, "handle" );
103 handle.apply( cur, data );
107 handle = ontype && cur[ ontype ];
108 if ( handle && handle.apply && acceptData( cur ) ) {
109 event.result = handle.apply( cur, data );
110 if ( event.result === false ) {
111 event.preventDefault();
117 // If nobody prevented the default action, do it now
118 if ( !onlyHandlers && !event.isDefaultPrevented() ) {
120 if ( ( !special._default ||
121 special._default.apply( eventPath.pop(), data ) === false ) &&
122 acceptData( elem ) ) {
124 // Call a native DOM method on the target with the same name name as the event.
125 // Don't do default actions on window, that's where global variables be (#6170)
126 if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
128 // Don't re-trigger an onFOO event when we call its FOO() method
129 tmp = elem[ ontype ];
132 elem[ ontype ] = null;
135 // Prevent re-triggering of the same event, since we already bubbled it above
136 jQuery.event.triggered = type;
138 jQuery.event.triggered = undefined;
141 elem[ ontype ] = tmp;
150 // Piggyback on a donor event to simulate a different one
151 // Used only for `focus(in | out)` events
152 simulate: function( type, elem, event ) {
153 var e = jQuery.extend(
162 jQuery.event.trigger( e, null, elem );
169 trigger: function( type, data ) {
170 return this.each( function() {
171 jQuery.event.trigger( type, data, this );
174 triggerHandler: function( type, data ) {
175 var elem = this[ 0 ];
177 return jQuery.event.trigger( type, data, elem, true );