@@ -24,36 +24,62 @@ const modifiers = {
2424 pagedown : 34
2525}
2626
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+
2761export default function createDOMEvent ( type , options ) {
2862 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
4864
4965 // 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 )
5169
52- eventObject . initEvent ( eventType , bubbles , cancelable )
70+ const eventPrototype = Object . getPrototypeOf ( event )
5371 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+ }
5582 } )
56- eventObject . keyCode = modifiers [ modifier ]
5783
58- return eventObject
84+ return event
5985}
0 commit comments