Files
2025-01-03 23:10:59 +00:00

75 lines
1.9 KiB
JavaScript

let matches = window.Element.prototype.matches
let closest = (element, selector) => element.closest(selector)
let WinEvent = (inType, params) => new window.Event(inType, params)
let createCustomEvent = (eventName, params) => {
const cEvent = new window.CustomEvent(eventName, params)
return cEvent
}
/* istanbul ignore next */
function polyfill () {
if (!window.Element.prototype.matches) {
matches = window.Element.prototype.msMatchesSelector ||
window.Element.prototype.webkitMatchesSelector
}
if (!window.Element.prototype.closest) {
closest = (element, selector) => {
if (!document.documentElement.contains(element)) {
return null
}
do {
if (matches.call(element, selector)) {
return element
}
element = element.parentElement || element.parentNode
} while (element !== null && element.nodeType === 1)
return null
}
}
if (!window.Event || typeof window.Event !== 'function') {
WinEvent = (inType, params) => {
params = params || {}
const e = document.createEvent('Event')
e.initEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable))
return e
}
}
if (typeof window.CustomEvent !== 'function') {
const originPreventDefault = window.Event.prototype.preventDefault
createCustomEvent = (eventName, params) => {
const evt = document.createEvent('CustomEvent')
params = params || { bubbles: false, cancelable: false, detail: null }
evt.initCustomEvent(eventName, params.bubbles, params.cancelable, params.detail)
evt.preventDefault = function () {
if (!this.cancelable) {
return
}
originPreventDefault.call(this)
Object.defineProperty(this, 'defaultPrevented', {
get: function () { return true }
})
}
return evt
}
}
}
polyfill()
export {
closest,
WinEvent,
createCustomEvent
}