44
55import { objectForEach } from '../object'
66import { catchFunctionErrors } from '../error'
7-
87import { tagNameLower } from './info'
9- import { addDisposeCallback } from './disposal'
8+
109import options from '../options'
1110
1211// Represent the known event types in a compact way, then at runtime transform it into a hash with event name as key (for fast lookup)
1312const knownEvents = { } ,
1413 knownEventTypesByEventName = { }
1514
16- const keyEventTypeName =
17- options . global . navigator && / F i r e f o x \/ 2 / i. test ( options . global . navigator . userAgent ) ? 'KeyboardEvent' : 'UIEvents'
18-
19- knownEvents [ keyEventTypeName ] = [ 'keyup' , 'keydown' , 'keypress' ]
15+ knownEvents [ 'UIEvents' ] = [ 'keyup' , 'keydown' , 'keypress' ]
2016
2117knownEvents [ 'MouseEvents' ] = [
2218 'click' ,
@@ -45,14 +41,6 @@ function isClickOnCheckableElement(element: Element, eventType: string) {
4541 return inputType == 'checkbox' || inputType == 'radio'
4642}
4743
48- function hasIEAttachEvents (
49- el : Element
50- ) : el is Element & { attachEvent : ( event : string , handler : EventListener ) => void } & {
51- detachEvent : ( event : string , handler : EventListener ) => void
52- } {
53- return typeof ( el as any ) . attachEvent === 'function' && typeof ( el as any ) . detachEvent === 'function'
54- }
55-
5644export function registerEventHandler (
5745 element : Element ,
5846 eventType : string ,
@@ -67,18 +55,6 @@ export function registerEventHandler(
6755 jQuery ( element ) . on ( eventType , wrappedHandler )
6856 } else if ( typeof element . addEventListener === 'function' ) {
6957 element . addEventListener ( eventType , wrappedHandler , eventOptions )
70- } else if ( hasIEAttachEvents ( element ) ) {
71- const attachEventHandler = function ( event ) {
72- wrappedHandler . call ( element , event )
73- }
74- const attachEventName = 'on' + eventType
75- element . attachEvent ( attachEventName , attachEventHandler )
76-
77- // IE does not dispose attachEvent handlers automatically (unlike with addEventListener)
78- // so to avoid leaks, we have to remove them manually. See bug #856
79- addDisposeCallback ( element , function ( ) {
80- element . detachEvent ( attachEventName , attachEventHandler )
81- } )
8258 } else {
8359 throw new Error ( "Browser doesn't support addEventListener or attachEvent" )
8460 }
@@ -88,19 +64,13 @@ function hasClick(element: Element): element is Element & { click(): void } {
8864 return typeof ( element as any ) . click === 'function'
8965}
9066
91- function hasFireEvent ( element : Element ) : element is Element & { fireEvent ( eventType : string ) : void } {
92- return typeof ( element as any ) . click === 'function'
93- }
94-
9567export function triggerEvent ( element : Element , eventType : string ) : void {
9668 if ( ! ( element && element . nodeType ) ) {
9769 throw new Error ( 'element must be a DOM node when calling triggerEvent' )
9870 }
9971
10072 // For click events on checkboxes and radio buttons, jQuery toggles the element checked state *after* the
10173 // event handler runs instead of *before*. (This was fixed in 1.9 for checkboxes but not for radio buttons.)
102- // IE doesn't change the checked state when you trigger the click event using "fireEvent".
103- // In both cases, we'll use the click method instead.
10474 const useClickWorkaround = isClickOnCheckableElement ( element , eventType )
10575
10676 if ( ! options . useOnlyNativeEvents && options . jQuery && ! useClickWorkaround ) {
@@ -132,8 +102,6 @@ export function triggerEvent(element: Element, eventType: string): void {
132102 }
133103 } else if ( useClickWorkaround && hasClick ( element ) ) {
134104 element . click ( )
135- } else if ( hasFireEvent ( element ) ) {
136- element . fireEvent ( 'on' + eventType )
137105 } else {
138106 throw new Error ( "Browser doesn't support triggering events" )
139107 }
0 commit comments