return e.defaultPrevented
})()
+let defaultPreventedPreservedOnDispatch = true
+
// CustomEvent polyfill for IE (see: https://mzl.la/2v76Zvn)
if (typeof window.CustomEvent !== 'function') {
window.CustomEvent = (event, params) => {
}
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
if (isNative) {
evt = document.createEvent('HTMLEvents')
- evt.initEvent(typeEvent, true, true)
+ evt.initEvent(typeEvent, bubbles, true)
} else {
evt = new CustomEvent(event, {
bubbles,
if (defaultPrevented) {
evt.preventDefault()
+
+ if (!defaultPreventedPreservedOnDispatch) {
+ Object.defineProperty(evt, 'defaultPrevented', {
+ get: () => true
+ })
+ }
}
if (nativeDispatch) {
EventHandler.trigger(element, 'foobar.namespace')
})
+ QUnit.test('should mirror preventDefault for native events', function (assert) {
+ assert.expect(2)
+
+ var element = document.createElement('div')
+ document.body.appendChild(element)
+
+ $(element).on('click', function (event) {
+ event.preventDefault()
+ assert.ok(true, 'first listener called')
+ })
+ element.addEventListener('click', function (event) {
+ assert.ok(event.defaultPrevented, 'defaultPrevented is true in second listener')
+ })
+
+ EventHandler.trigger(element, 'click')
+ document.body.removeChild(element)
+ })
+
QUnit.test('on should add event listener', function (assert) {
assert.expect(1)