scratch – Diff between revs 58 and 125

Subversion Repositories:
Rev:
Show entire fileIgnore whitespace
Rev 58 Rev 125
Line 1... Line 1...
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",
Line 8... Line 9...
8   9  
-   10 "./core/init",
9 "./core/init", 11 "./data/accepts",
10 "./selector" 12 "./selector"
11 ], function( jQuery, document, documentElement, rnothtmlwhite, slice, dataPriv ) { -  
12   -  
Line 13... Line 13...
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)|click/,
Line 17... Line 18...
17 rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, 18 rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
18 rtypenamespace = /^([^.]*)(?:\.(.+)|)/; 19 rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
19   20  
Line 20... Line 21...
20 function returnTrue() { 21 function returnTrue() {
21 return true; 22 return true;
22 } 23 }
Line 23... Line -...
23   -  
24 function returnFalse() { -  
25 return false; 24  
26 } 25 function returnFalse() {
27   26 return false;
28 // Support: IE <=9 only 27 }
29 // See #13393 for more info 28  
Line 30... Line -...
30 function safeActiveElement() { -  
31 try { -  
32 return document.activeElement; -  
33 } catch ( err ) { } -  
34 } -  
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 } 29 function safeActiveElement() {
92 return elem.each( function() { 30 try {
93 jQuery.event.add( this, types, fn, data, selector ); 31 return document.activeElement;
94 } ); 32 } catch ( err ) { }
95 } 33 }
Line 105... Line 43...
105 add: function( elem, types, handler, data, selector ) { 43 add: function( elem, types, handler, data, selector ) {
Line 106... Line 44...
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,
Line 110... Line 48...
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 ) {
Line 119... Line 57...
119 handleObjIn = handler; 57 handleObjIn = handler;
120 handler = handleObjIn.handler; 58 handler = handleObjIn.handler;
121 selector = handleObjIn.selector; 59 selector = handleObjIn.selector;
122 } 60 }
Line 123... Line -...
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++;
Line 133... Line 65...
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 ) ) { -  
140 eventHandle = elemData.handle = function( e ) { 71 if ( !(eventHandle = elemData.handle) ) {
141   72 eventHandle = elemData.handle = function( e ) {
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;
Line 146... Line 77...
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-- ) {
Line 153... Line 84...
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  
Line 167... Line 98...
167   98  
168 // Update special based on newly reset type 99 // Update special based on newly reset type
Line 169... Line 100...
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 ),
Line 180... Line 111...
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
Line 184... Line 115...
184 if ( !( handlers = events[ type ] ) ) { 115 if ( !(handlers = events[ type ]) ) {
185 handlers = events[ type ] = []; -  
186 handlers.delegateCount = 0; 116 handlers = events[ type ] = [];
187   -  
188 // Only use addEventListener if the special events handler returns false 117 handlers.delegateCount = 0;
189 if ( !special.setup || 118  
190 special.setup.call( elem, data, namespaces, eventHandle ) === false ) { 119 // Only use addEventListener if the special events handler returns false
191   120 if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
192 if ( elem.addEventListener ) { 121 if ( elem.addEventListener ) {
Line 193... Line 122...
193 elem.addEventListener( type, eventHandle ); 122 elem.addEventListener( type, eventHandle, false );
Line 220... Line 149...
220 remove: function( elem, types, handler, selector, mappedTypes ) { 149 remove: function( elem, types, handler, selector, mappedTypes ) {
Line 221... Line 150...
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,
Line 225... Line 154...
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) ) {
Line 228... Line 157...
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-- ) {
Line 235... Line 164...
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  
Line 245... Line 174...
245 } 174 }
Line 246... Line 175...
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 ] || []; -  
250 tmp = tmp[ 2 ] && 178 handlers = events[ type ] || [];
Line 251... Line 179...
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;
Line 255... Line 183...
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 ) && -  
260 ( !tmp || tmp.test( handleObj.namespace ) ) && 187 ( !handler || handler.guid === handleObj.guid ) &&
Line 261... Line 188...
261 ( !selector || selector === handleObj.selector || 188 ( !tmp || tmp.test( handleObj.namespace ) ) &&
262 selector === "**" && handleObj.selector ) ) { 189 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
263 handlers.splice( j, 1 ); 190 handlers.splice( j, 1 );
Line 272... Line 199...
272 } 199 }
Line 273... Line 200...
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 ) { -  
277 if ( !special.teardown || 203 if ( origCount && !handlers.length ) {
278 special.teardown.call( elem, namespaces, elemData.handle ) === false ) { -  
279   204 if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
280 jQuery.removeEvent( elem, type, elemData.handle ); 205 jQuery.removeEvent( elem, type, elemData.handle );
Line 281... Line 206...
281 } 206 }
282   207  
283 delete events[ type ]; 208 delete events[ type ];
Line 284... Line 209...
284 } 209 }
285 } 210 }
-   211  
286   212 // Remove the expando if it's no longer used
287 // Remove data and the expando if it's no longer used 213 if ( jQuery.isEmptyObject( events ) ) {
288 if ( jQuery.isEmptyObject( events ) ) { 214 delete elemData.handle;
Line 289... Line 215...
289 dataPriv.remove( elem, "handle events" ); 215 data_priv.remove( elem, "events" );
Line 290... Line 216...
290 } 216 }
291 }, 217 },
-   218  
-   219 trigger: function( event, data, elem, onlyHandlers ) {
Line 292... Line -...
292   -  
293 dispatch: function( nativeEvent ) { 220  
294   -  
295 // Make a writable jQuery.Event from the native event object -  
Line 296... Line 221...
296 var event = jQuery.event.fix( nativeEvent ); 221 var i, cur, tmp, bubbleType, ontype, handle, special,
-   222 eventPath = [ elem || document ],
297   223 type = hasOwn.call( event, "type" ) ? event.type : event,
-   224 namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
Line -... Line 225...
-   225  
-   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  
298 var i, j, ret, matched, handleObj, handlerQueue, 275 // Determine event propagation path in advance, per W3C events spec (#9951)
299 args = new Array( arguments.length ), 276 // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
-   277 if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
-   278  
-   279 bubbleType = special.delegateType || type;
-   280 if ( !rfocusMorph.test( bubbleType + type ) ) {
-   281 cur = cur.parentNode;
-   282 }
-   283 for ( ; cur; cur = cur.parentNode ) {
300 handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], 284 eventPath.push( cur );
Line -... Line 285...
-   285 tmp = cur;
-   286 }
-   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 );
301 special = jQuery.event.special[ event.type ] || {}; 355  
Line 302... Line 356...
302   356 var i, j, ret, matched, handleObj,
303 // Use the fix-ed jQuery.Event rather than the (read-only) native event 357 handlerQueue = [],
304 args[ 0 ] = event; 358 args = slice.call( arguments ),
Line 317... Line 371...
317 // Determine handlers 371 // Determine handlers
318 handlerQueue = jQuery.event.handlers.call( this, event, handlers ); 372 handlerQueue = jQuery.event.handlers.call( this, event, handlers );
Line 319... Line 373...
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() ) {
Line 323... Line 377...
323 event.currentTarget = matched.elem; 377 event.currentTarget = matched.elem;
324   378  
325 j = 0; -  
Line 326... Line 379...
326 while ( ( handleObj = matched.handlers[ j++ ] ) && 379 j = 0;
327 !event.isImmediatePropagationStopped() ) { 380 while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
328   381  
Line 329... Line 382...
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).
Line 331... Line 384...
331 if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { 384 if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
332   385  
Line 333... Line 386...
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 ) {
Line 353... Line 406...
353   406  
354 return event.result; 407 return event.result;
Line 355... Line 408...
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 = [],
Line 360... Line 413...
360 delegateCount = handlers.delegateCount, 413 delegateCount = handlers.delegateCount,
361 cur = event.target; -  
362   -  
363 // Find delegate handlers -  
364 if ( delegateCount && 414 cur = event.target;
365   -  
366 // Support: IE <=9 -  
367 // Black-hole SVG <use> instance trees (trac-13180) -  
368 cur.nodeType && 415  
369   -  
370 // Support: Firefox <=42 -  
371 // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) -  
372 // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click 416 // Find delegate handlers
Line 373... Line 417...
373 // Support: IE 11 only 417 // Black-hole SVG <use> instance trees (#13180)
Line 374... Line -...
374 // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) -  
375 !( event.type === "click" && event.button >= 1 ) ) { 418 // Avoid non-left-click bubbling in Firefox (#3861)
376   419 if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
377 for ( ; cur !== this; cur = cur.parentNode || this ) { 420  
378   -  
379 // Don't check non-elements (#13208) 421 for ( ; cur !== this; cur = cur.parentNode || this ) {
380 // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) 422  
Line 381... Line 423...
381 if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { 423 // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
382 matchedHandlers = []; 424 if ( cur.disabled !== true || event.type !== "click" ) {
Line 383... Line 425...
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 }
Line 398... Line 440...
398 } 440 }
399 if ( matchedHandlers.length ) { -  
400 handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); 441 if ( matches.length ) {
401 } 442 handlerQueue.push({ elem: cur, handlers: matches });
402 } 443 }
Line 403... Line 444...
403 } 444 }
404 } 445 }
Line 405... Line 446...
405   446 }
406 // Add the remaining (directly-bound) handlers 447  
407 cur = this; -  
-   448 // Add the remaining (directly-bound) handlers
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 } -  
411   451 }
412 return handlerQueue; 452  
413 }, 453 return handlerQueue;
414   454 },
415 addProp: function( name, hook ) { -  
416 Object.defineProperty( jQuery.Event.prototype, name, { 455  
417 enumerable: true, 456 // Includes some event props shared by KeyEvent and MouseEvent
418 configurable: true, 457 props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
419   -  
420 get: jQuery.isFunction( hook ) ? 458  
Line 421... Line 459...
421 function() { 459 fixHooks: {},
-   460  
-   461 keyHooks: {
-   462 props: "char charCode key keyCode".split(" "),
-   463 filter: function( event, original ) {
-   464  
422 if ( this.originalEvent ) { 465 // Add which for key events
423 return hook( this.originalEvent ); 466 if ( event.which == null ) {
424 } 467 event.which = original.charCode != null ? original.charCode : original.keyCode;
-   468 }
-   469  
-   470 return event;
-   471 }
425 } : 472 },
426 function() { 473  
-   474 mouseHooks: {
-   475 props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
-   476 filter: function( event, original ) {
427 if ( this.originalEvent ) { 477 var eventDoc, doc, body,
-   478 button = original.button;
-   479  
-   480 // Calculate pageX/Y if missing and clientX/Y available
-   481 if ( event.pageX == null && original.clientX != null ) {
-   482 eventDoc = event.target.ownerDocument || document;
428 return this.originalEvent[ name ]; 483 doc = eventDoc.documentElement;
-   484 body = eventDoc.body;
-   485  
429 } 486 event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
430 }, 487 event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
431   488 }
432 set: function( value ) { 489  
433 Object.defineProperty( this, name, { 490 // Add which for click: 1 === left; 2 === middle; 3 === right
-   491 // Note: button is not normalized, so don't use it
-   492 if ( !event.which && button !== undefined ) {
-   493 event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
-   494 }
-   495  
-   496 return event;
434 enumerable: true, 497 }
-   498 },
-   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
-   506 var i, prop, copy,
-   507 type = event.type,
435 configurable: true, 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 }
-   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
436 writable: true, 529 if ( !event.target ) {
Line 437... Line 530...
437 value: value 530 event.target = document;
438 } ); 531 }
439 } -  
440 } ); 532  
441 }, 533 // Support: Safari 6.0+, Chrome<28
442   534 // Target should not be a text node (#504, #13143)
443 fix: function( originalEvent ) { 535 if ( event.target.nodeType === 3 ) {
444 return originalEvent[ jQuery.expando ] ? -  
445 originalEvent : 536 event.target = event.target.parentNode;
446 new jQuery.Event( originalEvent ); 537 }
447 }, 538  
448   539 return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
449 special: { 540 },
Line 471... Line 562...
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;
Line 496... Line 586...
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 };
Line 503... Line 616...
503   616  
504 jQuery.removeEvent = function( elem, type, handle ) { -  
505   -  
506 // This "if" is needed for plain objects 617 jQuery.removeEvent = function( elem, type, handle ) {
507 if ( elem.removeEventListener ) { 618 if ( elem.removeEventListener ) {
508 elem.removeEventListener( type, handle ); 619 elem.removeEventListener( type, handle, false );
509 } 620 }
Line 510... Line 621...
510 }; 621 };
511   -  
512 jQuery.Event = function( src, props ) { 622  
513   623 jQuery.Event = function( src, props ) {
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) ) {
Line 516... Line 626...
516 return new jQuery.Event( src, props ); 626 return new jQuery.Event( src, props );
517 } 627 }
Line 523... Line 633...
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 && -  
528   637 src.defaultPrevented === undefined &&
529 // Support: Android <=2.3 only 638 // Support: Android<4.0
530 src.returnValue === false ? 639 src.returnValue === false ?
531 returnTrue : 640 returnTrue :
Line 532... Line -...
532 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; 641 returnFalse;
543   642  
544 // Event type 643 // Event type
545 } else { 644 } else {
Line 557... Line 656...
557 // Mark it as fixed 656 // Mark it as fixed
558 this[ jQuery.expando ] = true; 657 this[ jQuery.expando ] = true;
559 }; 658 };
Line 560... Line 659...
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 = { -  
564 constructor: jQuery.Event, 662 jQuery.Event.prototype = {
565 isDefaultPrevented: returnFalse, 663 isDefaultPrevented: returnFalse,
566 isPropagationStopped: returnFalse, 664 isPropagationStopped: returnFalse,
567 isImmediatePropagationStopped: returnFalse, -  
Line 568... Line 665...
568 isSimulated: false, 665 isImmediatePropagationStopped: returnFalse,
569   666  
Line 570... Line 667...
570 preventDefault: function() { 667 preventDefault: function() {
Line 571... Line 668...
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();
Line 577... Line 674...
577 } 674 }
Line 578... Line 675...
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  
Line 584... Line 681...
584 if ( e && !this.isSimulated ) { 681 if ( e && e.stopPropagation ) {
Line 585... Line 682...
585 e.stopPropagation(); 682 e.stopPropagation();
586 } 683 }
587 }, 684 },
Line 588... Line 685...
588 stopImmediatePropagation: function() { 685 stopImmediatePropagation: function() {
589 var e = this.originalEvent; 686 var e = this.originalEvent;
590   687  
Line 591... Line -...
591 this.isImmediatePropagationStopped = returnTrue; -  
592   -  
593 if ( e && !this.isSimulated ) { -  
594 e.stopImmediatePropagation(); -  
595 } -  
596   -  
597 this.stopPropagation(); -  
598 } -  
599 }; -  
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; 688 this.isImmediatePropagationStopped = returnTrue;
653 } -  
654   -  
655 return 0; -  
656 } 689  
657   -  
658 return event.which; -  
659 } -  
660 }, jQuery.event.addProp ); 690 if ( e && e.stopImmediatePropagation ) {
661   691 e.stopImmediatePropagation();
662 // Create mouseenter/leave events using mouseover/out and event-time checks 692 }
663 // so that event delegation works in jQuery. 693  
664 // Do the same for pointerenter/pointerleave and pointerover/pointerout 694 this.stopPropagation();
665 // 695 }
Line 681... Line 711...
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;
Line 685... Line 715...
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 };
-   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;
Line -... Line 781...
-   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 }
696 } ); 799 if ( fn === false ) {
-   800 fn = returnFalse;
-   801 } else if ( !fn ) {
Line -... Line 802...
-   802 return this;
-   803 }
697   804  
-   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
698 jQuery.fn.extend( { 813 fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
-   814 }
699   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 ) { -  
707 var handleObj, type; 822 off: function( types, selector, fn ) {
708 if ( types && types.preventDefault && types.handleObj ) { 823 var handleObj, type;
709   824 if ( types && types.preventDefault && types.handleObj ) {
710 // ( event ) dispatched jQuery.Event -  
711 handleObj = types.handleObj; 825 // ( event ) dispatched jQuery.Event
712 jQuery( types.delegateTarget ).off( -  
713 handleObj.namespace ? 826 handleObj = types.handleObj;
714 handleObj.origType + "." + handleObj.namespace : 827 jQuery( types.delegateTarget ).off(
715 handleObj.origType, 828 handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
716 handleObj.selector, 829 handleObj.selector,
717 handleObj.handler 830 handleObj.handler
718 ); 831 );
719 return this; -  
720 } 832 return this;
721 if ( typeof types === "object" ) { 833 }
722   834 if ( typeof types === "object" ) {
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; -  
728 } 839 return this;
729 if ( selector === false || typeof selector === "function" ) { 840 }
730   841 if ( selector === false || typeof selector === "function" ) {
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 }
-   849 return this.each(function() {
-   850 jQuery.event.remove( this, types, fn, selector );
-   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];
738 return this.each( function() { 861 if ( elem ) {
739 jQuery.event.remove( this, types, fn, selector ); 862 return jQuery.event.trigger( type, data, elem, true );
Line 740... Line 863...
740 } ); 863 }
741 } 864 }