scratch – Diff between revs 58 and 125

Subversion Repositories:
Rev:
Only display areas with differencesIgnore whitespace
Rev 58 Rev 125
1 define( [ 1 define([
2 "./core", 2 "./core",
3 "./var/document", 3 "./var/strundefined",
4 "./var/documentElement", 4 "./var/rnotwhite",
5 "./var/rnothtmlwhite", 5 "./var/hasOwn",
6 "./var/slice", 6 "./var/slice",
-   7 "./event/support",
7 "./data/var/dataPriv", 8 "./data/var/data_priv",
8   9  
-   10 "./core/init",
9 "./core/init", 11 "./data/accepts",
10 "./selector" 12 "./selector"
11 ], function( jQuery, document, documentElement, rnothtmlwhite, slice, dataPriv ) { -  
12   -  
13 "use strict"; 13 ], function( jQuery, strundefined, rnotwhite, hasOwn, slice, support, data_priv ) {
14   14  
15 var 15 var
16 rkeyEvent = /^key/, 16 rkeyEvent = /^key/,
17 rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, 17 rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
-   18 rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
18 rtypenamespace = /^([^.]*)(?:\.(.+)|)/; 19 rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
19   20  
20 function returnTrue() { 21 function returnTrue() {
21 return true; 22 return true;
22 } 23 }
23   24  
24 function returnFalse() { 25 function returnFalse() {
25 return false; 26 return false;
26 } 27 }
27   -  
28 // Support: IE <=9 only -  
29 // See #13393 for more info 28  
30 function safeActiveElement() { 29 function safeActiveElement() {
31 try { 30 try {
32 return document.activeElement; 31 return document.activeElement;
33 } catch ( err ) { } 32 } catch ( err ) { }
34 } 33 }
35   -  
36 function on( elem, types, selector, data, fn, one ) { -  
37 var origFn, type; -  
38   -  
39 // Types can be a map of types/handlers -  
40 if ( typeof types === "object" ) { -  
41   -  
42 // ( types-Object, selector, data ) -  
43 if ( typeof selector !== "string" ) { -  
44   -  
45 // ( types-Object, data ) -  
46 data = data || selector; -  
47 selector = undefined; -  
48 } -  
49 for ( type in types ) { -  
50 on( elem, type, selector, data, types[ type ], one ); -  
51 } -  
52 return elem; -  
53 } -  
54   -  
55 if ( data == null && fn == null ) { -  
56   -  
57 // ( types, fn ) -  
58 fn = selector; -  
59 data = selector = undefined; -  
60 } else if ( fn == null ) { -  
61 if ( typeof selector === "string" ) { -  
62   -  
63 // ( types, selector, fn ) -  
64 fn = data; -  
65 data = undefined; -  
66 } else { -  
67   -  
68 // ( types, data, fn ) -  
69 fn = data; -  
70 data = selector; -  
71 selector = undefined; -  
72 } -  
73 } -  
74 if ( fn === false ) { -  
75 fn = returnFalse; -  
76 } else if ( !fn ) { -  
77 return elem; -  
78 } -  
79   -  
80 if ( one === 1 ) { -  
81 origFn = fn; -  
82 fn = function( event ) { -  
83   -  
84 // Can use an empty set, since event contains the info -  
85 jQuery().off( event ); -  
86 return origFn.apply( this, arguments ); -  
87 }; -  
88   -  
89 // Use same guid so caller can remove using origFn -  
90 fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); -  
91 } -  
92 return elem.each( function() { -  
93 jQuery.event.add( this, types, fn, data, selector ); -  
94 } ); -  
95 } -  
96   34  
97 /* 35 /*
98 * Helper functions for managing events -- not part of the public interface. 36 * Helper functions for managing events -- not part of the public interface.
99 * Props to Dean Edwards' addEvent library for many of the ideas. 37 * Props to Dean Edwards' addEvent library for many of the ideas.
100 */ 38 */
101 jQuery.event = { 39 jQuery.event = {
102   40  
103 global: {}, 41 global: {},
104   42  
105 add: function( elem, types, handler, data, selector ) { 43 add: function( elem, types, handler, data, selector ) {
106   44  
107 var handleObjIn, eventHandle, tmp, 45 var handleObjIn, eventHandle, tmp,
108 events, t, handleObj, 46 events, t, handleObj,
109 special, handlers, type, namespaces, origType, 47 special, handlers, type, namespaces, origType,
110 elemData = dataPriv.get( elem ); 48 elemData = data_priv.get( elem );
111   49  
112 // Don't attach events to noData or text/comment nodes (but allow plain objects) 50 // Don't attach events to noData or text/comment nodes (but allow plain objects)
113 if ( !elemData ) { 51 if ( !elemData ) {
114 return; 52 return;
115 } 53 }
116   54  
117 // Caller can pass in an object of custom data in lieu of the handler 55 // Caller can pass in an object of custom data in lieu of the handler
118 if ( handler.handler ) { 56 if ( handler.handler ) {
119 handleObjIn = handler; 57 handleObjIn = handler;
120 handler = handleObjIn.handler; 58 handler = handleObjIn.handler;
121 selector = handleObjIn.selector; 59 selector = handleObjIn.selector;
122 } 60 }
123   -  
124 // Ensure that invalid selectors throw exceptions at attach time -  
125 // Evaluate against documentElement in case elem is a non-element node (e.g., document) -  
126 if ( selector ) { -  
127 jQuery.find.matchesSelector( documentElement, selector ); -  
128 } -  
129   61  
130 // Make sure that the handler has a unique ID, used to find/remove it later 62 // Make sure that the handler has a unique ID, used to find/remove it later
131 if ( !handler.guid ) { 63 if ( !handler.guid ) {
132 handler.guid = jQuery.guid++; 64 handler.guid = jQuery.guid++;
133 } 65 }
134   66  
135 // Init the element's event structure and main handler, if this is the first 67 // Init the element's event structure and main handler, if this is the first
136 if ( !( events = elemData.events ) ) { 68 if ( !(events = elemData.events) ) {
137 events = elemData.events = {}; 69 events = elemData.events = {};
138 } 70 }
139 if ( !( eventHandle = elemData.handle ) ) { 71 if ( !(eventHandle = elemData.handle) ) {
140 eventHandle = elemData.handle = function( e ) { 72 eventHandle = elemData.handle = function( e ) {
141   -  
142 // Discard the second event of a jQuery.event.trigger() and 73 // Discard the second event of a jQuery.event.trigger() and
143 // when an event is called after a page has unloaded 74 // when an event is called after a page has unloaded
144 return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? 75 return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
145 jQuery.event.dispatch.apply( elem, arguments ) : undefined; 76 jQuery.event.dispatch.apply( elem, arguments ) : undefined;
146 }; 77 };
147 } 78 }
148   79  
149 // Handle multiple events separated by a space 80 // Handle multiple events separated by a space
150 types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; 81 types = ( types || "" ).match( rnotwhite ) || [ "" ];
151 t = types.length; 82 t = types.length;
152 while ( t-- ) { 83 while ( t-- ) {
153 tmp = rtypenamespace.exec( types[ t ] ) || []; 84 tmp = rtypenamespace.exec( types[t] ) || [];
154 type = origType = tmp[ 1 ]; 85 type = origType = tmp[1];
155 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); 86 namespaces = ( tmp[2] || "" ).split( "." ).sort();
156   87  
157 // There *must* be a type, no attaching namespace-only handlers 88 // There *must* be a type, no attaching namespace-only handlers
158 if ( !type ) { 89 if ( !type ) {
159 continue; 90 continue;
160 } 91 }
161   92  
162 // If event changes its type, use the special event handlers for the changed type 93 // If event changes its type, use the special event handlers for the changed type
163 special = jQuery.event.special[ type ] || {}; 94 special = jQuery.event.special[ type ] || {};
164   95  
165 // If selector defined, determine special event api type, otherwise given type 96 // If selector defined, determine special event api type, otherwise given type
166 type = ( selector ? special.delegateType : special.bindType ) || type; 97 type = ( selector ? special.delegateType : special.bindType ) || type;
167   98  
168 // Update special based on newly reset type 99 // Update special based on newly reset type
169 special = jQuery.event.special[ type ] || {}; 100 special = jQuery.event.special[ type ] || {};
170   101  
171 // handleObj is passed to all event handlers 102 // handleObj is passed to all event handlers
172 handleObj = jQuery.extend( { 103 handleObj = jQuery.extend({
173 type: type, 104 type: type,
174 origType: origType, 105 origType: origType,
175 data: data, 106 data: data,
176 handler: handler, 107 handler: handler,
177 guid: handler.guid, 108 guid: handler.guid,
178 selector: selector, 109 selector: selector,
179 needsContext: selector && jQuery.expr.match.needsContext.test( selector ), 110 needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
180 namespace: namespaces.join( "." ) 111 namespace: namespaces.join(".")
181 }, handleObjIn ); 112 }, handleObjIn );
182   113  
183 // Init the event handler queue if we're the first 114 // Init the event handler queue if we're the first
184 if ( !( handlers = events[ type ] ) ) { 115 if ( !(handlers = events[ type ]) ) {
185 handlers = events[ type ] = []; 116 handlers = events[ type ] = [];
186 handlers.delegateCount = 0; 117 handlers.delegateCount = 0;
187   118  
188 // Only use addEventListener if the special events handler returns false 119 // Only use addEventListener if the special events handler returns false
189 if ( !special.setup || -  
190 special.setup.call( elem, data, namespaces, eventHandle ) === false ) { 120 if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
191   -  
192 if ( elem.addEventListener ) { 121 if ( elem.addEventListener ) {
193 elem.addEventListener( type, eventHandle ); 122 elem.addEventListener( type, eventHandle, false );
194 } 123 }
195 } 124 }
196 } 125 }
197   126  
198 if ( special.add ) { 127 if ( special.add ) {
199 special.add.call( elem, handleObj ); 128 special.add.call( elem, handleObj );
200   129  
201 if ( !handleObj.handler.guid ) { 130 if ( !handleObj.handler.guid ) {
202 handleObj.handler.guid = handler.guid; 131 handleObj.handler.guid = handler.guid;
203 } 132 }
204 } 133 }
205   134  
206 // Add to the element's handler list, delegates in front 135 // Add to the element's handler list, delegates in front
207 if ( selector ) { 136 if ( selector ) {
208 handlers.splice( handlers.delegateCount++, 0, handleObj ); 137 handlers.splice( handlers.delegateCount++, 0, handleObj );
209 } else { 138 } else {
210 handlers.push( handleObj ); 139 handlers.push( handleObj );
211 } 140 }
212   141  
213 // Keep track of which events have ever been used, for event optimization 142 // Keep track of which events have ever been used, for event optimization
214 jQuery.event.global[ type ] = true; 143 jQuery.event.global[ type ] = true;
215 } 144 }
216   145  
217 }, 146 },
218   147  
219 // Detach an event or set of events from an element 148 // Detach an event or set of events from an element
220 remove: function( elem, types, handler, selector, mappedTypes ) { 149 remove: function( elem, types, handler, selector, mappedTypes ) {
221   150  
222 var j, origCount, tmp, 151 var j, origCount, tmp,
223 events, t, handleObj, 152 events, t, handleObj,
224 special, handlers, type, namespaces, origType, 153 special, handlers, type, namespaces, origType,
225 elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); 154 elemData = data_priv.hasData( elem ) && data_priv.get( elem );
226   155  
227 if ( !elemData || !( events = elemData.events ) ) { 156 if ( !elemData || !(events = elemData.events) ) {
228 return; 157 return;
229 } 158 }
230   159  
231 // Once for each type.namespace in types; type may be omitted 160 // Once for each type.namespace in types; type may be omitted
232 types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; 161 types = ( types || "" ).match( rnotwhite ) || [ "" ];
233 t = types.length; 162 t = types.length;
234 while ( t-- ) { 163 while ( t-- ) {
235 tmp = rtypenamespace.exec( types[ t ] ) || []; 164 tmp = rtypenamespace.exec( types[t] ) || [];
236 type = origType = tmp[ 1 ]; 165 type = origType = tmp[1];
237 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); 166 namespaces = ( tmp[2] || "" ).split( "." ).sort();
238   167  
239 // Unbind all events (on this namespace, if provided) for the element 168 // Unbind all events (on this namespace, if provided) for the element
240 if ( !type ) { 169 if ( !type ) {
241 for ( type in events ) { 170 for ( type in events ) {
242 jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); 171 jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
243 } 172 }
244 continue; 173 continue;
245 } 174 }
246   175  
247 special = jQuery.event.special[ type ] || {}; 176 special = jQuery.event.special[ type ] || {};
248 type = ( selector ? special.delegateType : special.bindType ) || type; 177 type = ( selector ? special.delegateType : special.bindType ) || type;
249 handlers = events[ type ] || []; 178 handlers = events[ type ] || [];
250 tmp = tmp[ 2 ] && -  
251 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); 179 tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
252   180  
253 // Remove matching events 181 // Remove matching events
254 origCount = j = handlers.length; 182 origCount = j = handlers.length;
255 while ( j-- ) { 183 while ( j-- ) {
256 handleObj = handlers[ j ]; 184 handleObj = handlers[ j ];
257   185  
258 if ( ( mappedTypes || origType === handleObj.origType ) && 186 if ( ( mappedTypes || origType === handleObj.origType ) &&
259 ( !handler || handler.guid === handleObj.guid ) && 187 ( !handler || handler.guid === handleObj.guid ) &&
260 ( !tmp || tmp.test( handleObj.namespace ) ) && 188 ( !tmp || tmp.test( handleObj.namespace ) ) &&
261 ( !selector || selector === handleObj.selector || 189 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
262 selector === "**" && handleObj.selector ) ) { -  
263 handlers.splice( j, 1 ); 190 handlers.splice( j, 1 );
264   191  
265 if ( handleObj.selector ) { 192 if ( handleObj.selector ) {
266 handlers.delegateCount--; 193 handlers.delegateCount--;
267 } 194 }
268 if ( special.remove ) { 195 if ( special.remove ) {
269 special.remove.call( elem, handleObj ); 196 special.remove.call( elem, handleObj );
270 } 197 }
271 } 198 }
272 } 199 }
273   200  
274 // Remove generic event handler if we removed something and no more handlers exist 201 // Remove generic event handler if we removed something and no more handlers exist
275 // (avoids potential for endless recursion during removal of special event handlers) 202 // (avoids potential for endless recursion during removal of special event handlers)
276 if ( origCount && !handlers.length ) { 203 if ( origCount && !handlers.length ) {
277 if ( !special.teardown || -  
278 special.teardown.call( elem, namespaces, elemData.handle ) === false ) { 204 if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
279   -  
280 jQuery.removeEvent( elem, type, elemData.handle ); 205 jQuery.removeEvent( elem, type, elemData.handle );
281 } 206 }
282   207  
283 delete events[ type ]; 208 delete events[ type ];
284 } 209 }
285 } 210 }
286   211  
287 // Remove data and the expando if it's no longer used 212 // Remove the expando if it's no longer used
-   213 if ( jQuery.isEmptyObject( events ) ) {
288 if ( jQuery.isEmptyObject( events ) ) { 214 delete elemData.handle;
289 dataPriv.remove( elem, "handle events" ); 215 data_priv.remove( elem, "events" );
290 } 216 }
291 }, 217 },
292   218  
293 dispatch: function( nativeEvent ) { 219 trigger: function( event, data, elem, onlyHandlers ) {
294   220  
-   221 var i, cur, tmp, bubbleType, ontype, handle, special,
-   222 eventPath = [ elem || document ],
295 // Make a writable jQuery.Event from the native event object -  
296 var event = jQuery.event.fix( nativeEvent ); 223 type = hasOwn.call( event, "type" ) ? event.type : event,
297   -  
298 var i, j, ret, matched, handleObj, handlerQueue, -  
299 args = new Array( arguments.length ), 224 namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
-   225  
300 handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], 226 cur = tmp = elem = elem || document;
-   227  
-   228 // Don't do events on text and comment nodes
-   229 if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
-   230 return;
-   231 }
-   232  
-   233 // focus/blur morphs to focusin/out; ensure we're not firing them right now
-   234 if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
-   235 return;
-   236 }
-   237  
-   238 if ( type.indexOf(".") >= 0 ) {
-   239 // Namespaced trigger; create a regexp to match event type in handle()
-   240 namespaces = type.split(".");
-   241 type = namespaces.shift();
-   242 namespaces.sort();
-   243 }
-   244 ontype = type.indexOf(":") < 0 && "on" + type;
-   245  
-   246 // Caller can pass in a jQuery.Event object, Object, or just an event type string
-   247 event = event[ jQuery.expando ] ?
-   248 event :
-   249 new jQuery.Event( type, typeof event === "object" && event );
-   250  
-   251 // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
-   252 event.isTrigger = onlyHandlers ? 2 : 3;
-   253 event.namespace = namespaces.join(".");
-   254 event.namespace_re = event.namespace ?
-   255 new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
-   256 null;
-   257  
-   258 // Clean up the event in case it is being reused
-   259 event.result = undefined;
-   260 if ( !event.target ) {
-   261 event.target = elem;
-   262 }
-   263  
-   264 // Clone any incoming data and prepend the event, creating the handler arg list
-   265 data = data == null ?
-   266 [ event ] :
-   267 jQuery.makeArray( data, [ event ] );
-   268  
-   269 // Allow special events to draw outside the lines
-   270 special = jQuery.event.special[ type ] || {};
-   271 if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
-   272 return;
-   273 }
-   274  
-   275 // Determine event propagation path in advance, per W3C events spec (#9951)
-   276 // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
-   277 if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
301 special = jQuery.event.special[ event.type ] || {}; 278  
302   279 bubbleType = special.delegateType || type;
-   280 if ( !rfocusMorph.test( bubbleType + type ) ) {
-   281 cur = cur.parentNode;
-   282 }
-   283 for ( ; cur; cur = cur.parentNode ) {
-   284 eventPath.push( cur );
-   285 tmp = cur;
-   286 }
303 // Use the fix-ed jQuery.Event rather than the (read-only) native event 287  
-   288 // Only add window if we got to document (e.g., not plain obj or detached DOM)
-   289 if ( tmp === (elem.ownerDocument || document) ) {
-   290 eventPath.push( tmp.defaultView || tmp.parentWindow || window );
-   291 }
-   292 }
-   293  
-   294 // Fire handlers on the event path
-   295 i = 0;
-   296 while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
-   297  
-   298 event.type = i > 1 ?
-   299 bubbleType :
-   300 special.bindType || type;
-   301  
-   302 // jQuery handler
-   303 handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" );
-   304 if ( handle ) {
-   305 handle.apply( cur, data );
-   306 }
-   307  
-   308 // Native handler
-   309 handle = ontype && cur[ ontype ];
-   310 if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
-   311 event.result = handle.apply( cur, data );
-   312 if ( event.result === false ) {
-   313 event.preventDefault();
-   314 }
-   315 }
-   316 }
-   317 event.type = type;
-   318  
-   319 // If nobody prevented the default action, do it now
-   320 if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-   321  
-   322 if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
-   323 jQuery.acceptData( elem ) ) {
-   324  
-   325 // Call a native DOM method on the target with the same name name as the event.
-   326 // Don't do default actions on window, that's where global variables be (#6170)
-   327 if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
-   328  
-   329 // Don't re-trigger an onFOO event when we call its FOO() method
-   330 tmp = elem[ ontype ];
-   331  
-   332 if ( tmp ) {
-   333 elem[ ontype ] = null;
-   334 }
-   335  
-   336 // Prevent re-triggering of the same event, since we already bubbled it above
-   337 jQuery.event.triggered = type;
-   338 elem[ type ]();
-   339 jQuery.event.triggered = undefined;
-   340  
-   341 if ( tmp ) {
-   342 elem[ ontype ] = tmp;
-   343 }
-   344 }
-   345 }
-   346 }
-   347  
-   348 return event.result;
-   349 },
-   350  
-   351 dispatch: function( event ) {
-   352  
-   353 // Make a writable jQuery.Event from the native event object
-   354 event = jQuery.event.fix( event );
-   355  
-   356 var i, j, ret, matched, handleObj,
-   357 handlerQueue = [],
304 args[ 0 ] = event; 358 args = slice.call( arguments ),
305   359 handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [],
306 for ( i = 1; i < arguments.length; i++ ) { 360 special = jQuery.event.special[ event.type ] || {};
307 args[ i ] = arguments[ i ]; 361  
308 } 362 // Use the fix-ed jQuery.Event rather than the (read-only) native event
309   363 args[0] = event;
310 event.delegateTarget = this; 364 event.delegateTarget = this;
311   365  
312 // Call the preDispatch hook for the mapped type, and let it bail if desired 366 // Call the preDispatch hook for the mapped type, and let it bail if desired
313 if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { 367 if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
314 return; 368 return;
315 } 369 }
316   370  
317 // Determine handlers 371 // Determine handlers
318 handlerQueue = jQuery.event.handlers.call( this, event, handlers ); 372 handlerQueue = jQuery.event.handlers.call( this, event, handlers );
319   373  
320 // Run delegates first; they may want to stop propagation beneath us 374 // Run delegates first; they may want to stop propagation beneath us
321 i = 0; 375 i = 0;
322 while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { 376 while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
323 event.currentTarget = matched.elem; 377 event.currentTarget = matched.elem;
324   378  
325 j = 0; 379 j = 0;
326 while ( ( handleObj = matched.handlers[ j++ ] ) && 380 while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
327 !event.isImmediatePropagationStopped() ) { -  
328   381  
329 // Triggered event must either 1) have no namespace, or 2) have namespace(s) 382 // Triggered event must either 1) have no namespace, or 2) have namespace(s)
330 // a subset or equal to those in the bound event (both can have no namespace). 383 // a subset or equal to those in the bound event (both can have no namespace).
331 if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { 384 if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
332   385  
333 event.handleObj = handleObj; 386 event.handleObj = handleObj;
334 event.data = handleObj.data; 387 event.data = handleObj.data;
335   388  
336 ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || 389 ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
337 handleObj.handler ).apply( matched.elem, args ); 390 .apply( matched.elem, args );
338   391  
339 if ( ret !== undefined ) { 392 if ( ret !== undefined ) {
340 if ( ( event.result = ret ) === false ) { 393 if ( (event.result = ret) === false ) {
341 event.preventDefault(); 394 event.preventDefault();
342 event.stopPropagation(); 395 event.stopPropagation();
343 } 396 }
344 } 397 }
345 } 398 }
346 } 399 }
347 } 400 }
348   401  
349 // Call the postDispatch hook for the mapped type 402 // Call the postDispatch hook for the mapped type
350 if ( special.postDispatch ) { 403 if ( special.postDispatch ) {
351 special.postDispatch.call( this, event ); 404 special.postDispatch.call( this, event );
352 } 405 }
353   406  
354 return event.result; 407 return event.result;
355 }, 408 },
356   409  
357 handlers: function( event, handlers ) { 410 handlers: function( event, handlers ) {
358 var i, handleObj, sel, matchedHandlers, matchedSelectors, 411 var i, matches, sel, handleObj,
359 handlerQueue = [], 412 handlerQueue = [],
360 delegateCount = handlers.delegateCount, 413 delegateCount = handlers.delegateCount,
361 cur = event.target; 414 cur = event.target;
362   415  
363 // Find delegate handlers 416 // Find delegate handlers
364 if ( delegateCount && -  
365   -  
366 // Support: IE <=9 -  
367 // Black-hole SVG <use> instance trees (trac-13180) 417 // Black-hole SVG <use> instance trees (#13180)
368 cur.nodeType && -  
369   -  
370 // Support: Firefox <=42 -  
371 // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) 418 // Avoid non-left-click bubbling in Firefox (#3861)
372 // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click -  
373 // Support: IE 11 only -  
374 // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) -  
375 !( event.type === "click" && event.button >= 1 ) ) { 419 if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
376   420  
377 for ( ; cur !== this; cur = cur.parentNode || this ) { 421 for ( ; cur !== this; cur = cur.parentNode || this ) {
378   -  
379 // Don't check non-elements (#13208) 422  
380 // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) 423 // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
381 if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { 424 if ( cur.disabled !== true || event.type !== "click" ) {
382 matchedHandlers = []; -  
383 matchedSelectors = {}; 425 matches = [];
384 for ( i = 0; i < delegateCount; i++ ) { 426 for ( i = 0; i < delegateCount; i++ ) {
385 handleObj = handlers[ i ]; 427 handleObj = handlers[ i ];
386   428  
387 // Don't conflict with Object.prototype properties (#13203) 429 // Don't conflict with Object.prototype properties (#13203)
388 sel = handleObj.selector + " "; 430 sel = handleObj.selector + " ";
389   431  
390 if ( matchedSelectors[ sel ] === undefined ) { 432 if ( matches[ sel ] === undefined ) {
391 matchedSelectors[ sel ] = handleObj.needsContext ? 433 matches[ sel ] = handleObj.needsContext ?
392 jQuery( sel, this ).index( cur ) > -1 : 434 jQuery( sel, this ).index( cur ) >= 0 :
393 jQuery.find( sel, this, null, [ cur ] ).length; 435 jQuery.find( sel, this, null, [ cur ] ).length;
394 } 436 }
395 if ( matchedSelectors[ sel ] ) { 437 if ( matches[ sel ] ) {
396 matchedHandlers.push( handleObj ); 438 matches.push( handleObj );
397 } 439 }
398 } 440 }
399 if ( matchedHandlers.length ) { 441 if ( matches.length ) {
400 handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); 442 handlerQueue.push({ elem: cur, handlers: matches });
401 } 443 }
402 } 444 }
403 } 445 }
404 } 446 }
405   447  
406 // Add the remaining (directly-bound) handlers 448 // Add the remaining (directly-bound) handlers
407 cur = this; -  
408 if ( delegateCount < handlers.length ) { 449 if ( delegateCount < handlers.length ) {
409 handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); 450 handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
410 } 451 }
411   452  
412 return handlerQueue; 453 return handlerQueue;
413 }, 454 },
414   455  
415 addProp: function( name, hook ) { 456 // Includes some event props shared by KeyEvent and MouseEvent
416 Object.defineProperty( jQuery.Event.prototype, name, { -  
-   457 props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
417 enumerable: true, 458  
418 configurable: true, 459 fixHooks: {},
419   -  
420 get: jQuery.isFunction( hook ) ? 460  
421 function() { 461 keyHooks: {
422 if ( this.originalEvent ) { 462 props: "char charCode key keyCode".split(" "),
423 return hook( this.originalEvent ); 463 filter: function( event, original ) {
424 } -  
425 } : 464  
426 function() { 465 // Add which for key events
427 if ( this.originalEvent ) { 466 if ( event.which == null ) {
428 return this.originalEvent[ name ]; -  
429 } 467 event.which = original.charCode != null ? original.charCode : original.keyCode;
430 }, 468 }
-   469  
-   470 return event;
-   471 }
-   472 },
-   473  
431   474 mouseHooks: {
432 set: function( value ) { 475 props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
433 Object.defineProperty( this, name, { 476 filter: function( event, original ) {
-   477 var eventDoc, doc, body,
-   478 button = original.button;
-   479  
-   480 // Calculate pageX/Y if missing and clientX/Y available
434 enumerable: true, 481 if ( event.pageX == null && original.clientX != null ) {
435 configurable: true, 482 eventDoc = event.target.ownerDocument || document;
-   483 doc = eventDoc.documentElement;
-   484 body = eventDoc.body;
-   485  
436 writable: true, 486 event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
-   487 event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
-   488 }
-   489  
-   490 // Add which for click: 1 === left; 2 === middle; 3 === right
-   491 // Note: button is not normalized, so don't use it
437 value: value 492 if ( !event.which && button !== undefined ) {
-   493 event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
-   494 }
438 } ); 495  
439 } 496 return event;
440 } ); 497 }
441 }, 498 },
442   499  
-   500 fix: function( event ) {
-   501 if ( event[ jQuery.expando ] ) {
-   502 return event;
-   503 }
-   504  
-   505 // Create a writable copy of the event object and normalize some properties
443 fix: function( originalEvent ) { 506 var i, prop, copy,
-   507 type = event.type,
-   508 originalEvent = event,
-   509 fixHook = this.fixHooks[ type ];
-   510  
-   511 if ( !fixHook ) {
-   512 this.fixHooks[ type ] = fixHook =
-   513 rmouseEvent.test( type ) ? this.mouseHooks :
-   514 rkeyEvent.test( type ) ? this.keyHooks :
-   515 {};
-   516 }
444 return originalEvent[ jQuery.expando ] ? 517 copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-   518  
-   519 event = new jQuery.Event( originalEvent );
-   520  
-   521 i = copy.length;
-   522 while ( i-- ) {
-   523 prop = copy[ i ];
-   524 event[ prop ] = originalEvent[ prop ];
-   525 }
-   526  
-   527 // Support: Cordova 2.5 (WebKit) (#13255)
-   528 // All events should have a target; Cordova deviceready doesn't
-   529 if ( !event.target ) {
-   530 event.target = document;
-   531 }
-   532  
-   533 // Support: Safari 6.0+, Chrome<28
-   534 // Target should not be a text node (#504, #13143)
-   535 if ( event.target.nodeType === 3 ) {
-   536 event.target = event.target.parentNode;
-   537 }
445 originalEvent : 538  
446 new jQuery.Event( originalEvent ); 539 return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
447 }, 540 },
448   541  
449 special: { 542 special: {
450 load: { 543 load: {
451   -  
452 // Prevent triggered image.load events from bubbling to window.load 544 // Prevent triggered image.load events from bubbling to window.load
453 noBubble: true 545 noBubble: true
454 }, 546 },
455 focus: { 547 focus: {
456   -  
457 // Fire native event if possible so blur/focus sequence is correct 548 // Fire native event if possible so blur/focus sequence is correct
458 trigger: function() { 549 trigger: function() {
459 if ( this !== safeActiveElement() && this.focus ) { 550 if ( this !== safeActiveElement() && this.focus ) {
460 this.focus(); 551 this.focus();
461 return false; 552 return false;
462 } 553 }
463 }, 554 },
464 delegateType: "focusin" 555 delegateType: "focusin"
465 }, 556 },
466 blur: { 557 blur: {
467 trigger: function() { 558 trigger: function() {
468 if ( this === safeActiveElement() && this.blur ) { 559 if ( this === safeActiveElement() && this.blur ) {
469 this.blur(); 560 this.blur();
470 return false; 561 return false;
471 } 562 }
472 }, 563 },
473 delegateType: "focusout" 564 delegateType: "focusout"
474 }, 565 },
475 click: { 566 click: {
476   -  
477 // For checkbox, fire native event so checked state will be right 567 // For checkbox, fire native event so checked state will be right
478 trigger: function() { 568 trigger: function() {
479 if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { 569 if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
480 this.click(); 570 this.click();
481 return false; 571 return false;
482 } 572 }
483 }, 573 },
484   574  
485 // For cross-browser consistency, don't fire native .click() on links 575 // For cross-browser consistency, don't fire native .click() on links
486 _default: function( event ) { 576 _default: function( event ) {
487 return jQuery.nodeName( event.target, "a" ); 577 return jQuery.nodeName( event.target, "a" );
488 } 578 }
489 }, 579 },
490   580  
491 beforeunload: { 581 beforeunload: {
492 postDispatch: function( event ) { 582 postDispatch: function( event ) {
493   583  
494 // Support: Firefox 20+ 584 // Support: Firefox 20+
495 // Firefox doesn't alert if the returnValue field is not set. 585 // Firefox doesn't alert if the returnValue field is not set.
496 if ( event.result !== undefined && event.originalEvent ) { 586 if ( event.result !== undefined && event.originalEvent ) {
497 event.originalEvent.returnValue = event.result; 587 event.originalEvent.returnValue = event.result;
498 } 588 }
499 } 589 }
500 } 590 }
-   591 },
-   592  
-   593 simulate: function( type, elem, event, bubble ) {
-   594 // Piggyback on a donor event to simulate a different one.
-   595 // Fake originalEvent to avoid donor's stopPropagation, but if the
-   596 // simulated event prevents default then we do the same on the donor.
-   597 var e = jQuery.extend(
-   598 new jQuery.Event(),
-   599 event,
-   600 {
-   601 type: type,
-   602 isSimulated: true,
-   603 originalEvent: {}
-   604 }
-   605 );
-   606 if ( bubble ) {
-   607 jQuery.event.trigger( e, null, elem );
-   608 } else {
-   609 jQuery.event.dispatch.call( elem, e );
-   610 }
-   611 if ( e.isDefaultPrevented() ) {
-   612 event.preventDefault();
-   613 }
501 } 614 }
502 }; 615 };
503   616  
504 jQuery.removeEvent = function( elem, type, handle ) { 617 jQuery.removeEvent = function( elem, type, handle ) {
505   -  
506 // This "if" is needed for plain objects -  
507 if ( elem.removeEventListener ) { 618 if ( elem.removeEventListener ) {
508 elem.removeEventListener( type, handle ); 619 elem.removeEventListener( type, handle, false );
509 } 620 }
510 }; 621 };
511   622  
512 jQuery.Event = function( src, props ) { 623 jQuery.Event = function( src, props ) {
513   -  
514 // Allow instantiation without the 'new' keyword 624 // Allow instantiation without the 'new' keyword
515 if ( !( this instanceof jQuery.Event ) ) { 625 if ( !(this instanceof jQuery.Event) ) {
516 return new jQuery.Event( src, props ); 626 return new jQuery.Event( src, props );
517 } 627 }
518   628  
519 // Event object 629 // Event object
520 if ( src && src.type ) { 630 if ( src && src.type ) {
521 this.originalEvent = src; 631 this.originalEvent = src;
522 this.type = src.type; 632 this.type = src.type;
523   633  
524 // Events bubbling up the document may have been marked as prevented 634 // Events bubbling up the document may have been marked as prevented
525 // by a handler lower down the tree; reflect the correct value. 635 // by a handler lower down the tree; reflect the correct value.
526 this.isDefaultPrevented = src.defaultPrevented || 636 this.isDefaultPrevented = src.defaultPrevented ||
527 src.defaultPrevented === undefined && 637 src.defaultPrevented === undefined &&
528   -  
529 // Support: Android <=2.3 only 638 // Support: Android<4.0
530 src.returnValue === false ? 639 src.returnValue === false ?
531 returnTrue : 640 returnTrue :
532 returnFalse; 641 returnFalse;
533   -  
534 // Create target properties -  
535 // Support: Safari <=6 - 7 only -  
536 // Target should not be a text node (#504, #13143) -  
537 this.target = ( src.target && src.target.nodeType === 3 ) ? -  
538 src.target.parentNode : -  
539 src.target; -  
540   -  
541 this.currentTarget = src.currentTarget; -  
542 this.relatedTarget = src.relatedTarget; -  
543   642  
544 // Event type 643 // Event type
545 } else { 644 } else {
546 this.type = src; 645 this.type = src;
547 } 646 }
548   647  
549 // Put explicitly provided properties onto the event object 648 // Put explicitly provided properties onto the event object
550 if ( props ) { 649 if ( props ) {
551 jQuery.extend( this, props ); 650 jQuery.extend( this, props );
552 } 651 }
553   652  
554 // Create a timestamp if incoming event doesn't have one 653 // Create a timestamp if incoming event doesn't have one
555 this.timeStamp = src && src.timeStamp || jQuery.now(); 654 this.timeStamp = src && src.timeStamp || jQuery.now();
556   655  
557 // Mark it as fixed 656 // Mark it as fixed
558 this[ jQuery.expando ] = true; 657 this[ jQuery.expando ] = true;
559 }; 658 };
560   659  
561 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding 660 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
562 // https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html 661 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
563 jQuery.Event.prototype = { 662 jQuery.Event.prototype = {
564 constructor: jQuery.Event, -  
565 isDefaultPrevented: returnFalse, 663 isDefaultPrevented: returnFalse,
566 isPropagationStopped: returnFalse, 664 isPropagationStopped: returnFalse,
567 isImmediatePropagationStopped: returnFalse, 665 isImmediatePropagationStopped: returnFalse,
568 isSimulated: false, -  
569   666  
570 preventDefault: function() { 667 preventDefault: function() {
571 var e = this.originalEvent; 668 var e = this.originalEvent;
572   669  
573 this.isDefaultPrevented = returnTrue; 670 this.isDefaultPrevented = returnTrue;
574   671  
575 if ( e && !this.isSimulated ) { 672 if ( e && e.preventDefault ) {
576 e.preventDefault(); 673 e.preventDefault();
577 } 674 }
578 }, 675 },
579 stopPropagation: function() { 676 stopPropagation: function() {
580 var e = this.originalEvent; 677 var e = this.originalEvent;
581   678  
582 this.isPropagationStopped = returnTrue; 679 this.isPropagationStopped = returnTrue;
583   680  
584 if ( e && !this.isSimulated ) { 681 if ( e && e.stopPropagation ) {
585 e.stopPropagation(); 682 e.stopPropagation();
586 } 683 }
587 }, 684 },
588 stopImmediatePropagation: function() { 685 stopImmediatePropagation: function() {
589 var e = this.originalEvent; 686 var e = this.originalEvent;
590   687  
591 this.isImmediatePropagationStopped = returnTrue; 688 this.isImmediatePropagationStopped = returnTrue;
592   689  
593 if ( e && !this.isSimulated ) { 690 if ( e && e.stopImmediatePropagation ) {
594 e.stopImmediatePropagation(); 691 e.stopImmediatePropagation();
595 } 692 }
596   693  
597 this.stopPropagation(); 694 this.stopPropagation();
598 } 695 }
599 }; 696 };
600   -  
601 // Includes all common event props including KeyEvent and MouseEvent specific props -  
602 jQuery.each( { -  
603 altKey: true, -  
604 bubbles: true, -  
605 cancelable: true, -  
606 changedTouches: true, -  
607 ctrlKey: true, -  
608 detail: true, -  
609 eventPhase: true, -  
610 metaKey: true, -  
611 pageX: true, -  
612 pageY: true, -  
613 shiftKey: true, -  
614 view: true, -  
615 "char": true, -  
616 charCode: true, -  
617 key: true, -  
618 keyCode: true, -  
619 button: true, -  
620 buttons: true, -  
621 clientX: true, -  
622 clientY: true, -  
623 offsetX: true, -  
624 offsetY: true, -  
625 pointerId: true, -  
626 pointerType: true, -  
627 screenX: true, -  
628 screenY: true, -  
629 targetTouches: true, -  
630 toElement: true, -  
631 touches: true, -  
632   -  
633 which: function( event ) { -  
634 var button = event.button; -  
635   -  
636 // Add which for key events -  
637 if ( event.which == null && rkeyEvent.test( event.type ) ) { -  
638 return event.charCode != null ? event.charCode : event.keyCode; -  
639 } -  
640   -  
641 // Add which for click: 1 === left; 2 === middle; 3 === right -  
642 if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { -  
643 if ( button & 1 ) { -  
644 return 1; -  
645 } -  
646   -  
647 if ( button & 2 ) { -  
648 return 3; -  
649 } -  
650   -  
651 if ( button & 4 ) { -  
652 return 2; -  
653 } -  
654   -  
655 return 0; -  
656 } -  
657   -  
658 return event.which; -  
659 } -  
660 }, jQuery.event.addProp ); -  
661   697  
662 // Create mouseenter/leave events using mouseover/out and event-time checks -  
663 // so that event delegation works in jQuery. -  
664 // Do the same for pointerenter/pointerleave and pointerover/pointerout -  
665 // 698 // Create mouseenter/leave events using mouseover/out and event-time checks
666 // Support: Safari 7 only -  
667 // Safari sends mouseenter too often; see: -  
668 // https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -  
669 // for the description of the bug (it existed in older Chrome versions as well). 699 // Support: Chrome 15+
670 jQuery.each( { 700 jQuery.each({
671 mouseenter: "mouseover", 701 mouseenter: "mouseover",
672 mouseleave: "mouseout", 702 mouseleave: "mouseout",
673 pointerenter: "pointerover", 703 pointerenter: "pointerover",
674 pointerleave: "pointerout" 704 pointerleave: "pointerout"
675 }, function( orig, fix ) { 705 }, function( orig, fix ) {
676 jQuery.event.special[ orig ] = { 706 jQuery.event.special[ orig ] = {
677 delegateType: fix, 707 delegateType: fix,
678 bindType: fix, 708 bindType: fix,
679   709  
680 handle: function( event ) { 710 handle: function( event ) {
681 var ret, 711 var ret,
682 target = this, 712 target = this,
683 related = event.relatedTarget, 713 related = event.relatedTarget,
684 handleObj = event.handleObj; 714 handleObj = event.handleObj;
685   715  
686 // For mouseenter/leave call the handler if related is outside the target. 716 // For mousenter/leave call the handler if related is outside the target.
687 // NB: No relatedTarget if the mouse left/entered the browser window 717 // NB: No relatedTarget if the mouse left/entered the browser window
688 if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { 718 if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
689 event.type = handleObj.origType; 719 event.type = handleObj.origType;
690 ret = handleObj.handler.apply( this, arguments ); 720 ret = handleObj.handler.apply( this, arguments );
691 event.type = fix; 721 event.type = fix;
692 } 722 }
693 return ret; 723 return ret;
694 } 724 }
695 }; 725 };
696 } ); 726 });
-   727  
-   728 // Support: Firefox, Chrome, Safari
-   729 // Create "bubbling" focus and blur events
-   730 if ( !support.focusinBubbles ) {
-   731 jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-   732  
-   733 // Attach a single capturing handler on the document while someone wants focusin/focusout
-   734 var handler = function( event ) {
-   735 jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
-   736 };
-   737  
-   738 jQuery.event.special[ fix ] = {
-   739 setup: function() {
-   740 var doc = this.ownerDocument || this,
-   741 attaches = data_priv.access( doc, fix );
-   742  
-   743 if ( !attaches ) {
-   744 doc.addEventListener( orig, handler, true );
-   745 }
-   746 data_priv.access( doc, fix, ( attaches || 0 ) + 1 );
-   747 },
-   748 teardown: function() {
-   749 var doc = this.ownerDocument || this,
-   750 attaches = data_priv.access( doc, fix ) - 1;
-   751  
-   752 if ( !attaches ) {
-   753 doc.removeEventListener( orig, handler, true );
-   754 data_priv.remove( doc, fix );
-   755  
-   756 } else {
-   757 data_priv.access( doc, fix, attaches );
-   758 }
-   759 }
-   760 };
-   761 });
-   762 }
-   763  
-   764 jQuery.fn.extend({
-   765  
-   766 on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
-   767 var origFn, type;
-   768  
-   769 // Types can be a map of types/handlers
-   770 if ( typeof types === "object" ) {
-   771 // ( types-Object, selector, data )
-   772 if ( typeof selector !== "string" ) {
-   773 // ( types-Object, data )
-   774 data = data || selector;
-   775 selector = undefined;
-   776 }
-   777 for ( type in types ) {
-   778 this.on( type, selector, data, types[ type ], one );
-   779 }
-   780 return this;
-   781 }
-   782  
-   783 if ( data == null && fn == null ) {
-   784 // ( types, fn )
-   785 fn = selector;
-   786 data = selector = undefined;
-   787 } else if ( fn == null ) {
-   788 if ( typeof selector === "string" ) {
-   789 // ( types, selector, fn )
-   790 fn = data;
-   791 data = undefined;
-   792 } else {
-   793 // ( types, data, fn )
-   794 fn = data;
-   795 data = selector;
-   796 selector = undefined;
-   797 }
-   798 }
-   799 if ( fn === false ) {
697   800 fn = returnFalse;
-   801 } else if ( !fn ) {
-   802 return this;
-   803 }
-   804  
698 jQuery.fn.extend( { 805 if ( one === 1 ) {
-   806 origFn = fn;
-   807 fn = function( event ) {
-   808 // Can use an empty set, since event contains the info
-   809 jQuery().off( event );
-   810 return origFn.apply( this, arguments );
-   811 };
-   812 // Use same guid so caller can remove using origFn
-   813 fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
699   814 }
-   815 return this.each( function() {
700 on: function( types, selector, data, fn ) { 816 jQuery.event.add( this, types, fn, data, selector );
701 return on( this, types, selector, data, fn ); 817 });
702 }, 818 },
703 one: function( types, selector, data, fn ) { 819 one: function( types, selector, data, fn ) {
704 return on( this, types, selector, data, fn, 1 ); 820 return this.on( types, selector, data, fn, 1 );
705 }, 821 },
706 off: function( types, selector, fn ) { 822 off: function( types, selector, fn ) {
707 var handleObj, type; 823 var handleObj, type;
708 if ( types && types.preventDefault && types.handleObj ) { 824 if ( types && types.preventDefault && types.handleObj ) {
709   -  
710 // ( event ) dispatched jQuery.Event 825 // ( event ) dispatched jQuery.Event
711 handleObj = types.handleObj; 826 handleObj = types.handleObj;
712 jQuery( types.delegateTarget ).off( 827 jQuery( types.delegateTarget ).off(
713 handleObj.namespace ? -  
714 handleObj.origType + "." + handleObj.namespace : 828 handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
715 handleObj.origType, -  
716 handleObj.selector, 829 handleObj.selector,
717 handleObj.handler 830 handleObj.handler
718 ); 831 );
719 return this; 832 return this;
720 } 833 }
721 if ( typeof types === "object" ) { 834 if ( typeof types === "object" ) {
722   -  
723 // ( types-object [, selector] ) 835 // ( types-object [, selector] )
724 for ( type in types ) { 836 for ( type in types ) {
725 this.off( type, selector, types[ type ] ); 837 this.off( type, selector, types[ type ] );
726 } 838 }
727 return this; 839 return this;
728 } 840 }
729 if ( selector === false || typeof selector === "function" ) { 841 if ( selector === false || typeof selector === "function" ) {
730   -  
731 // ( types [, fn] ) 842 // ( types [, fn] )
732 fn = selector; 843 fn = selector;
733 selector = undefined; 844 selector = undefined;
734 } 845 }
735 if ( fn === false ) { 846 if ( fn === false ) {
736 fn = returnFalse; 847 fn = returnFalse;
737 } 848 }
738 return this.each( function() { 849 return this.each(function() {
739 jQuery.event.remove( this, types, fn, selector ); 850 jQuery.event.remove( this, types, fn, selector );
740 } ); 851 });
-   852 },
-   853  
-   854 trigger: function( type, data ) {
-   855 return this.each(function() {
-   856 jQuery.event.trigger( type, data, this );
-   857 });
-   858 },
-   859 triggerHandler: function( type, data ) {
-   860 var elem = this[0];
-   861 if ( elem ) {
-   862 return jQuery.event.trigger( type, data, elem, true );
-   863 }
741 } 864 }
742 } ); 865 });
743   866  
744 return jQuery; 867 return jQuery;
745 } ); 868 });
746   869