Project

General

Profile

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