Permalink
Cannot retrieve contributors at this time
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
185 lines (148 sloc)
4.88 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| define( [ | |
| "../core", | |
| "../var/document", | |
| "../data/var/dataPriv", | |
| "../data/var/acceptData", | |
| "../var/hasOwn", | |
| "../event" | |
| ], function( jQuery, document, dataPriv, acceptData, hasOwn ) { | |
| "use strict"; | |
| var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; | |
| jQuery.extend( jQuery.event, { | |
| trigger: function( event, data, elem, onlyHandlers ) { | |
| var i, cur, tmp, bubbleType, ontype, handle, special, | |
| eventPath = [ elem || document ], | |
| type = hasOwn.call( event, "type" ) ? event.type : event, | |
| namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; | |
| cur = tmp = elem = elem || document; | |
| // Don't do events on text and comment nodes | |
| if ( elem.nodeType === 3 || elem.nodeType === 8 ) { | |
| return; | |
| } | |
| // focus/blur morphs to focusin/out; ensure we're not firing them right now | |
| if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { | |
| return; | |
| } | |
| if ( type.indexOf( "." ) > -1 ) { | |
| // Namespaced trigger; create a regexp to match event type in handle() | |
| namespaces = type.split( "." ); | |
| type = namespaces.shift(); | |
| namespaces.sort(); | |
| } | |
| ontype = type.indexOf( ":" ) < 0 && "on" + type; | |
| // Caller can pass in a jQuery.Event object, Object, or just an event type string | |
| event = event[ jQuery.expando ] ? | |
| event : | |
| new jQuery.Event( type, typeof event === "object" && event ); | |
| // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) | |
| event.isTrigger = onlyHandlers ? 2 : 3; | |
| event.namespace = namespaces.join( "." ); | |
| event.rnamespace = event.namespace ? | |
| new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : | |
| null; | |
| // Clean up the event in case it is being reused | |
| event.result = undefined; | |
| if ( !event.target ) { | |
| event.target = elem; | |
| } | |
| // Clone any incoming data and prepend the event, creating the handler arg list | |
| data = data == null ? | |
| [ event ] : | |
| jQuery.makeArray( data, [ event ] ); | |
| // Allow special events to draw outside the lines | |
| special = jQuery.event.special[ type ] || {}; | |
| if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { | |
| return; | |
| } | |
| // Determine event propagation path in advance, per W3C events spec (#9951) | |
| // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) | |
| if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { | |
| bubbleType = special.delegateType || type; | |
| if ( !rfocusMorph.test( bubbleType + type ) ) { | |
| cur = cur.parentNode; | |
| } | |
| for ( ; cur; cur = cur.parentNode ) { | |
| eventPath.push( cur ); | |
| tmp = cur; | |
| } | |
| // Only add window if we got to document (e.g., not plain obj or detached DOM) | |
| if ( tmp === ( elem.ownerDocument || document ) ) { | |
| eventPath.push( tmp.defaultView || tmp.parentWindow || window ); | |
| } | |
| } | |
| // Fire handlers on the event path | |
| i = 0; | |
| while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { | |
| event.type = i > 1 ? | |
| bubbleType : | |
| special.bindType || type; | |
| // jQuery handler | |
| handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && | |
| dataPriv.get( cur, "handle" ); | |
| if ( handle ) { | |
| handle.apply( cur, data ); | |
| } | |
| // Native handler | |
| handle = ontype && cur[ ontype ]; | |
| if ( handle && handle.apply && acceptData( cur ) ) { | |
| event.result = handle.apply( cur, data ); | |
| if ( event.result === false ) { | |
| event.preventDefault(); | |
| } | |
| } | |
| } | |
| event.type = type; | |
| // If nobody prevented the default action, do it now | |
| if ( !onlyHandlers && !event.isDefaultPrevented() ) { | |
| if ( ( !special._default || | |
| special._default.apply( eventPath.pop(), data ) === false ) && | |
| acceptData( elem ) ) { | |
| // Call a native DOM method on the target with the same name as the event. | |
| // Don't do default actions on window, that's where global variables be (#6170) | |
| if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { | |
| // Don't re-trigger an onFOO event when we call its FOO() method | |
| tmp = elem[ ontype ]; | |
| if ( tmp ) { | |
| elem[ ontype ] = null; | |
| } | |
| // Prevent re-triggering of the same event, since we already bubbled it above | |
| jQuery.event.triggered = type; | |
| elem[ type ](); | |
| jQuery.event.triggered = undefined; | |
| if ( tmp ) { | |
| elem[ ontype ] = tmp; | |
| } | |
| } | |
| } | |
| } | |
| return event.result; | |
| }, | |
| // Piggyback on a donor event to simulate a different one | |
| // Used only for `focus(in | out)` events | |
| simulate: function( type, elem, event ) { | |
| var e = jQuery.extend( | |
| new jQuery.Event(), | |
| event, | |
| { | |
| type: type, | |
| isSimulated: true | |
| } | |
| ); | |
| jQuery.event.trigger( e, null, elem ); | |
| } | |
| } ); | |
| jQuery.fn.extend( { | |
| trigger: function( type, data ) { | |
| return this.each( function() { | |
| jQuery.event.trigger( type, data, this ); | |
| } ); | |
| }, | |
| triggerHandler: function( type, data ) { | |
| var elem = this[ 0 ]; | |
| if ( elem ) { | |
| return jQuery.event.trigger( type, data, elem, true ); | |
| } | |
| } | |
| } ); | |
| return jQuery; | |
| } ); |