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