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