0
|
1 define( [
|
|
2 "../core",
|
|
3 "../var/document",
|
|
4 "../data/var/dataPriv",
|
|
5 "../data/var/acceptData",
|
|
6 "../var/hasOwn",
|
|
7 "../var/isFunction",
|
|
8 "../var/isWindow",
|
|
9 "../event"
|
|
10 ], function( jQuery, document, dataPriv, acceptData, hasOwn, isFunction, isWindow ) {
|
|
11
|
|
12 "use strict";
|
|
13
|
|
14 var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
|
|
15 stopPropagationCallback = function( e ) {
|
|
16 e.stopPropagation();
|
|
17 };
|
|
18
|
|
19 jQuery.extend( jQuery.event, {
|
|
20
|
|
21 trigger: function( event, data, elem, onlyHandlers ) {
|
|
22
|
|
23 var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
|
|
24 eventPath = [ elem || document ],
|
|
25 type = hasOwn.call( event, "type" ) ? event.type : event,
|
|
26 namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
|
|
27
|
|
28 cur = lastElement = tmp = elem = elem || document;
|
|
29
|
|
30 // Don't do events on text and comment nodes
|
|
31 if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
|
|
32 return;
|
|
33 }
|
|
34
|
|
35 // focus/blur morphs to focusin/out; ensure we're not firing them right now
|
|
36 if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
|
|
37 return;
|
|
38 }
|
|
39
|
|
40 if ( type.indexOf( "." ) > -1 ) {
|
|
41
|
|
42 // Namespaced trigger; create a regexp to match event type in handle()
|
|
43 namespaces = type.split( "." );
|
|
44 type = namespaces.shift();
|
|
45 namespaces.sort();
|
|
46 }
|
|
47 ontype = type.indexOf( ":" ) < 0 && "on" + type;
|
|
48
|
|
49 // Caller can pass in a jQuery.Event object, Object, or just an event type string
|
|
50 event = event[ jQuery.expando ] ?
|
|
51 event :
|
|
52 new jQuery.Event( type, typeof event === "object" && event );
|
|
53
|
|
54 // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
|
|
55 event.isTrigger = onlyHandlers ? 2 : 3;
|
|
56 event.namespace = namespaces.join( "." );
|
|
57 event.rnamespace = event.namespace ?
|
|
58 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
|
|
59 null;
|
|
60
|
|
61 // Clean up the event in case it is being reused
|
|
62 event.result = undefined;
|
|
63 if ( !event.target ) {
|
|
64 event.target = elem;
|
|
65 }
|
|
66
|
|
67 // Clone any incoming data and prepend the event, creating the handler arg list
|
|
68 data = data == null ?
|
|
69 [ event ] :
|
|
70 jQuery.makeArray( data, [ event ] );
|
|
71
|
|
72 // Allow special events to draw outside the lines
|
|
73 special = jQuery.event.special[ type ] || {};
|
|
74 if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
|
|
75 return;
|
|
76 }
|
|
77
|
|
78 // Determine event propagation path in advance, per W3C events spec (#9951)
|
|
79 // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
|
|
80 if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
|
|
81
|
|
82 bubbleType = special.delegateType || type;
|
|
83 if ( !rfocusMorph.test( bubbleType + type ) ) {
|
|
84 cur = cur.parentNode;
|
|
85 }
|
|
86 for ( ; cur; cur = cur.parentNode ) {
|
|
87 eventPath.push( cur );
|
|
88 tmp = cur;
|
|
89 }
|
|
90
|
|
91 // Only add window if we got to document (e.g., not plain obj or detached DOM)
|
|
92 if ( tmp === ( elem.ownerDocument || document ) ) {
|
|
93 eventPath.push( tmp.defaultView || tmp.parentWindow || window );
|
|
94 }
|
|
95 }
|
|
96
|
|
97 // Fire handlers on the event path
|
|
98 i = 0;
|
|
99 while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
|
|
100 lastElement = cur;
|
|
101 event.type = i > 1 ?
|
|
102 bubbleType :
|
|
103 special.bindType || type;
|
|
104
|
|
105 // jQuery handler
|
|
106 handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
|
|
107 dataPriv.get( cur, "handle" );
|
|
108 if ( handle ) {
|
|
109 handle.apply( cur, data );
|
|
110 }
|
|
111
|
|
112 // Native handler
|
|
113 handle = ontype && cur[ ontype ];
|
|
114 if ( handle && handle.apply && acceptData( cur ) ) {
|
|
115 event.result = handle.apply( cur, data );
|
|
116 if ( event.result === false ) {
|
|
117 event.preventDefault();
|
|
118 }
|
|
119 }
|
|
120 }
|
|
121 event.type = type;
|
|
122
|
|
123 // If nobody prevented the default action, do it now
|
|
124 if ( !onlyHandlers && !event.isDefaultPrevented() ) {
|
|
125
|
|
126 if ( ( !special._default ||
|
|
127 special._default.apply( eventPath.pop(), data ) === false ) &&
|
|
128 acceptData( elem ) ) {
|
|
129
|
|
130 // Call a native DOM method on the target with the same name as the event.
|
|
131 // Don't do default actions on window, that's where global variables be (#6170)
|
|
132 if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
|
|
133
|
|
134 // Don't re-trigger an onFOO event when we call its FOO() method
|
|
135 tmp = elem[ ontype ];
|
|
136
|
|
137 if ( tmp ) {
|
|
138 elem[ ontype ] = null;
|
|
139 }
|
|
140
|
|
141 // Prevent re-triggering of the same event, since we already bubbled it above
|
|
142 jQuery.event.triggered = type;
|
|
143
|
|
144 if ( event.isPropagationStopped() ) {
|
|
145 lastElement.addEventListener( type, stopPropagationCallback );
|
|
146 }
|
|
147
|
|
148 elem[ type ]();
|
|
149
|
|
150 if ( event.isPropagationStopped() ) {
|
|
151 lastElement.removeEventListener( type, stopPropagationCallback );
|
|
152 }
|
|
153
|
|
154 jQuery.event.triggered = undefined;
|
|
155
|
|
156 if ( tmp ) {
|
|
157 elem[ ontype ] = tmp;
|
|
158 }
|
|
159 }
|
|
160 }
|
|
161 }
|
|
162
|
|
163 return event.result;
|
|
164 },
|
|
165
|
|
166 // Piggyback on a donor event to simulate a different one
|
|
167 // Used only for `focus(in | out)` events
|
|
168 simulate: function( type, elem, event ) {
|
|
169 var e = jQuery.extend(
|
|
170 new jQuery.Event(),
|
|
171 event,
|
|
172 {
|
|
173 type: type,
|
|
174 isSimulated: true
|
|
175 }
|
|
176 );
|
|
177
|
|
178 jQuery.event.trigger( e, null, elem );
|
|
179 }
|
|
180
|
|
181 } );
|
|
182
|
|
183 jQuery.fn.extend( {
|
|
184
|
|
185 trigger: function( type, data ) {
|
|
186 return this.each( function() {
|
|
187 jQuery.event.trigger( type, data, this );
|
|
188 } );
|
|
189 },
|
|
190 triggerHandler: function( type, data ) {
|
|
191 var elem = this[ 0 ];
|
|
192 if ( elem ) {
|
|
193 return jQuery.event.trigger( type, data, elem, true );
|
|
194 }
|
|
195 }
|
|
196 } );
|
|
197
|
|
198 return jQuery;
|
|
199 } );
|