UNPKG

@lesjoursfr/browser-tools

Version:

Some browser tools for events & DOM manipulation.

103 lines (102 loc) 3.08 kB
let eventsGuid = 0; /** * Parse an event type to separate the type & the namespace * @param {string} string */ function parseEventType(string) { const [type, ...nsArray] = string.split("."); return { type, ns: nsArray ?? null, }; } /** * Set an event listener on the node. * @param {Window|Document|HTMLElement} node * @param {string} events * @param {Function} handler */ function addEventListener(node, events, handler) { if (node.ljbtEvents === undefined) { node.ljbtEvents = {}; } for (const event of events.split(" ")) { const { type, ns } = parseEventType(event); const handlerGuid = (++eventsGuid).toString(10); node.addEventListener(type, handler); node.ljbtEvents[handlerGuid] = { type, ns, handler }; } } /** * Remove event listeners from the node. * @param {Window|Document|HTMLElement} node * @param {string} events * @param {Function|undefined} handler */ function removeEventListener(node, events, handler) { if (node.ljbtEvents === undefined) { node.ljbtEvents = {}; } for (const event of events.split(" ")) { const { type, ns } = parseEventType(event); for (const [guid, handlerObj] of Object.entries(node.ljbtEvents)) { if (handlerObj.type !== type && type !== "*") { continue; } if ((ns === null || handlerObj.ns?.includes(ns[0])) && (handler === undefined || (typeof handler === "function" && handler === handlerObj.handler))) { delete node.ljbtEvents[guid]; node.removeEventListener(handlerObj.type, handlerObj.handler); } } } } /** * Set an event listener on every node. * @param {Window|Document|HTMLElement|NodeList} nodes * @param {string} events * @param {Function} handler */ export function on(nodes, events, handler) { if (nodes instanceof NodeList) { for (const node of nodes) { addEventListener(node, events, handler); } } else { addEventListener(nodes, events, handler); } } /** * Remove event listeners from the node. * @param {Window|Document|HTMLElement|NodeList} nodes * @param {string} events * @param {Function|undefined} handler */ export function off(nodes, events, handler) { if (nodes instanceof NodeList) { for (const node of nodes) { removeEventListener(node, events, handler); } } else { removeEventListener(nodes, events, handler); } } /** * Trigger the Event on the node. * @param {Window|Document|HTMLElement} node * @param {string|Event} event * @param {Object|undefined} payload */ export function trigger(node, event, payload) { node.dispatchEvent(typeof event === "string" ? new CustomEvent(event, { detail: payload }) : event); } /** * Check if the event is a TouchEvent * @param {Event} e * @returns {boolean} true if the event is a TouchEvent */ export function isTouchEvent(e) { return window.TouchEvent && e instanceof TouchEvent; }