1441 |
ariadna |
1 |
{"version":3,"file":"event-handler.min.js","sources":["../../../src/bootstrap/dom/event-handler.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index'\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\n\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getElementEvents(element) {\n const uid = makeEventUid(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, { delegateTarget: element })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue\n }\n\n hydrateObj(event, { delegateTarget: target })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n}\n\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events)\n .find(event => event.callable === callable && event.delegationSelector === delegationSelector)\n}\n\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string'\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : (handler || delegationFunction)\n let typeEvent = getTypeEvent(originalTypeEvent)\n\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent\n }\n\n return [isDelegated, callable, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n callable = wrapFunction(callable)\n }\n\n const events = getElementEvents(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null)\n\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff\n\n return\n }\n\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = isDelegated ?\n bootstrapDelegationHandler(element, handler, callable) :\n bootstrapHandler(element, callable)\n\n fn.delegationSelector = isDelegated ? handler : null\n fn.callable = callable\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, isDelegated)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false)\n },\n\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getElementEvents(element)\n const storeElementEvent = events[typeEvent] || {}\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return\n }\n\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null)\n return\n }\n\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n }\n }\n\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n\n let jQueryEvent = null\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n const evt = hydrateObj(new Event(event, { bubbles, cancelable: true }), args)\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value\n } catch {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value\n }\n })\n }\n }\n\n return obj\n}\n\nexport default EventHandler\n"],"names":["namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","nativeEvents","Set","makeEventUid","element","uid","getElementEvents","findHandler","events","callable","delegationSelector","Object","values","find","event","normalizeParameters","originalTypeEvent","handler","delegationFunction","isDelegated","typeEvent","getTypeEvent","has","addHandler","oneOff","wrapFunction","fn","relatedTarget","delegateTarget","contains","call","this","handlers","previousFunction","replace","selector","domElements","querySelectorAll","target","parentNode","domElement","hydrateObj","EventHandler","off","type","apply","bootstrapDelegationHandler","bootstrapHandler","addEventListener","removeHandler","removeEventListener","Boolean","removeNamespacedHandlers","namespace","storeElementEvent","handlerKey","entries","includes","on","one","inNamespace","isNamespace","startsWith","elementEvent","keys","slice","keyHandlers","length","trigger","args","$","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","Event","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","evt","cancelable","preventDefault","dispatchEvent","obj","meta","key","value","defineProperty","configurable","get"],"mappings":"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"}
|