@@ -24,36 +24,62 @@ const modifiers = {
24
24
pagedown : 34
25
25
}
26
26
27
+ function createEvent (
28
+ type ,
29
+ modifier ,
30
+ { eventInterface, bubbles, cancelable } ,
31
+ options
32
+ ) {
33
+ const SupportedEventInterface =
34
+ typeof window [ eventInterface ] === 'function'
35
+ ? window [ eventInterface ]
36
+ : window . Event
37
+
38
+ const event = new SupportedEventInterface ( type , {
39
+ // event properties can only be added when the event is instantiated
40
+ // custom properties must be added after the event has been instantiated
41
+ ...options ,
42
+ bubbles,
43
+ cancelable,
44
+ keyCode : modifiers [ modifier ]
45
+ } )
46
+
47
+ return event
48
+ }
49
+
50
+ function createOldEvent (
51
+ type ,
52
+ modifier ,
53
+ { eventInterface, bubbles, cancelable }
54
+ ) {
55
+ const event = document . createEvent ( 'Event' )
56
+ event . initEvent ( type , bubbles , cancelable )
57
+ event . keyCode = modifiers [ modifier ]
58
+ return event
59
+ }
60
+
27
61
export default function createDOMEvent ( type , options ) {
28
62
const [ eventType , modifier ] = type . split ( '.' )
29
- const {
30
- eventInterface,
31
- bubbles,
32
- cancelable
33
- } = eventTypes [ eventType ] || defaultEventType
34
-
35
- if ( typeof window . Event === 'function' ) {
36
- const SupportedEventInterface =
37
- typeof window [ eventInterface ] === 'function'
38
- ? window [ eventInterface ]
39
- : window . Event
40
-
41
- return new SupportedEventInterface ( eventType , {
42
- bubbles,
43
- cancelable,
44
- ...options ,
45
- keyCode : modifiers [ modifier ]
46
- } )
47
- }
63
+ const meta = eventTypes [ eventType ] || defaultEventType
48
64
49
65
// Fallback for IE10,11 - https://stackoverflow.com/questions/26596123
50
- const eventObject = document . createEvent ( 'Event' )
66
+ const event = typeof window . Event === 'function'
67
+ ? createEvent ( eventType , modifier , meta , options )
68
+ : createOldEvent ( eventType , modifier , meta )
51
69
52
- eventObject . initEvent ( eventType , bubbles , cancelable )
70
+ const eventPrototype = Object . getPrototypeOf ( event )
53
71
Object . keys ( options || { } ) . forEach ( key => {
54
- eventObject [ key ] = options [ key ]
72
+ const propertyDescriptor =
73
+ Object . getOwnPropertyDescriptor ( eventPrototype , key )
74
+
75
+ const canSetProperty = ! (
76
+ propertyDescriptor &&
77
+ propertyDescriptor . setter === undefined
78
+ )
79
+ if ( canSetProperty ) {
80
+ event [ key ] = options [ key ]
81
+ }
55
82
} )
56
- eventObject . keyCode = modifiers [ modifier ]
57
83
58
- return eventObject
84
+ return event
59
85
}
0 commit comments