From 53ca76ebc0fa2737e7344efedabb28b2a0d6be53 Mon Sep 17 00:00:00 2001 From: Alessandro Chitolina Date: Tue, 19 Sep 2017 22:58:06 +0200 Subject: Workaround for M$ Edge resetting defaultPrevented flag upon dispatchEvent --- js/src/dom/eventHandler.js | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (limited to 'js/src') diff --git a/js/src/dom/eventHandler.js b/js/src/dom/eventHandler.js index a69ab6136..b72684f81 100644 --- a/js/src/dom/eventHandler.js +++ b/js/src/dom/eventHandler.js @@ -16,6 +16,8 @@ const workingDefaultPrevented = (() => { return e.defaultPrevented })() +let defaultPreventedPreservedOnDispatch = true + // CustomEvent polyfill for IE (see: https://mzl.la/2v76Zvn) if (typeof window.CustomEvent !== 'function') { window.CustomEvent = (event, params) => { @@ -46,6 +48,20 @@ if (typeof window.CustomEvent !== 'function') { } window.CustomEvent.prototype = window.Event.prototype +} else { + // MSEdge resets defaultPrevented flag upon dispatchEvent call if at least one listener is attached + defaultPreventedPreservedOnDispatch = (() => { + const e = new CustomEvent('Bootstrap', { + cancelable: true + }) + + const element = document.createElement('div') + element.addEventListener('Bootstrap', () => null) + + e.preventDefault() + element.dispatchEvent(e) + return e.defaultPrevented + })() } // Event constructor shim @@ -276,7 +292,7 @@ const EventHandler = { if (isNative) { evt = document.createEvent('HTMLEvents') - evt.initEvent(typeEvent, true, true) + evt.initEvent(typeEvent, bubbles, true) } else { evt = new CustomEvent(event, { bubbles, @@ -291,6 +307,12 @@ const EventHandler = { if (defaultPrevented) { evt.preventDefault() + + if (!defaultPreventedPreservedOnDispatch) { + Object.defineProperty(evt, 'defaultPrevented', { + get: () => true + }) + } } if (nativeDispatch) { -- cgit v1.2.3