UNPKG

mvdom

Version:

deprecated - Moved to dom-native package

188 lines 7.32 kB
import { asNodeArray, ensureMap, ensureSet, splitAndTrim } from './utils'; export function addOnEvents(target, source) { return Object.assign(target || {}, source); } export function on(els, types, arg1, arg2, arg3) { let opts; let listener; let selector; if (arg1 instanceof Function) { listener = arg1; opts = arg2; } else { selector = arg1; listener = arg2; opts = arg3; } let eventOptions; if (opts && (opts.passive != null || opts.capture != null)) { eventOptions = {}; if (opts.passive != null) { eventOptions.passive = opts.passive; } if (opts.capture != null) { eventOptions.capture = opts.capture; } } if (els == null) { return; } const typeArray = splitAndTrim(types, ","); typeArray.forEach(function (type) { const typeSelectorKey = buildTypeSelectorKey(type, selector); asNodeArray(els).forEach(function (el) { let _listener = listener; if (selector) { _listener = function (evt) { let tgt = null; const target = evt.target; const currentTarget = evt.currentTarget; const ctx = (opts) ? opts.ctx : null; if (target && target.matches(selector)) { evt.selectTarget = target; listener.call(ctx, evt); } else { tgt = evt.target.parentNode; while (tgt !== null && tgt !== currentTarget && tgt !== document) { if (tgt.matches(selector)) { evt.selectTarget = tgt; listener.call(ctx, evt); tgt = null; break; } tgt = tgt.parentNode; } } }; } else if (opts && opts.ctx) { _listener = function (evt) { listener.call(opts.ctx, evt); }; } const listenerRef = { type: type, listener: listener, _listener: _listener, }; if (selector) { listenerRef.selector = selector; } if (opts && opts.ns) { listenerRef.ns = opts.ns; let listenerRefSetByNs = ensureMap(el, "listenerRefsByNs"); let listenerRefSet = ensureSet(listenerRefSetByNs, opts.ns); listenerRefSet.add(listenerRef); } let listenerDic = ensureMap(el, "listenerDic"); let listenerRefByListener = ensureMap(listenerDic, typeSelectorKey); listenerRefByListener.set(listener, listenerRef); el.addEventListener(type, _listener, eventOptions); }); }); } export function off(els, type_or_opts, selector_or_listener, maybe_listener) { if (els == null) { return; } const opts = (type_or_opts && type_or_opts.ns) ? type_or_opts : null; const type = (opts === null) ? type_or_opts : null; let selector = null; let listener; const tof = typeof selector_or_listener; if (tof === 'function') { selector = null; listener = selector_or_listener; } else if (tof === 'string') { selector = selector_or_listener; listener = maybe_listener; } if (opts && opts.ns) { const ns = opts.ns; asNodeArray(els).forEach(function (el) { const listenerDic = el.listenerDic; const listenerRefsByNs = el.listenerRefsByNs; let listenerRefSet; if (listenerRefsByNs && listenerDic) { listenerRefSet = listenerRefsByNs.get(ns); if (listenerRefSet) { listenerRefSet.forEach(function (listenerRef) { el.removeEventListener(listenerRef.type, listenerRef._listener); const typeSelectorKey = buildTypeSelectorKey(listenerRef.type, listenerRef.selector); const listenerRefMapByListener = listenerDic.get(typeSelectorKey); if (listenerRefMapByListener && listenerRefMapByListener.has(listenerRef.listener)) { listenerRefMapByListener.delete(listenerRef.listener); } else { console.log("INTERNAL ERROR should have a listener in el.listenerDic for " + typeSelectorKey); } }); listenerRefsByNs.delete(ns); } } }); return; } const typeSelectorKey = buildTypeSelectorKey(type, selector); asNodeArray(els).forEach(function (el) { const listenerRefMapByListener = (el.listenerDic) ? el.listenerDic.get(typeSelectorKey) : null; if (!listenerRefMapByListener) { console.log("WARNING - Cannot do .off() since this type-selector '" + typeSelectorKey + "' event was not bound with .on(). We will add support for this later."); return; } if (typeof listener === "undefined" && type) { listenerRefMapByListener.forEach(function (listenerRef) { el.removeEventListener(type, listenerRef._listener); }); el.listenerDic.delete(typeSelectorKey); } else { const listenerRef = (listener) ? listenerRefMapByListener.get(listener) : null; if (!listenerRef) { console.log("WARNING - Cannot do .off() since no listenerRef for " + typeSelectorKey + " and function \n" + listener + "\n were found. Probably was not registered via on()"); return; } el.removeEventListener(type, listenerRef._listener); listenerRefMapByListener.delete(listener); } }); } const customDefaultProps = { bubbles: true, cancelable: true }; export function trigger(els, type, evtInit) { if (els == null) { return; } asNodeArray(els).forEach(function (el) { const evt = new CustomEvent(type, Object.assign({}, customDefaultProps, { selectTarget: el }, evtInit)); el.dispatchEvent(evt); }); } export function bindOnEvents(el, eventDics, opts) { eventDics = (eventDics instanceof Array) ? eventDics : [eventDics]; for (const eventDic of eventDics) { for (const selector in eventDic) { bindOnEvent(el, selector, eventDic[selector], opts); } } } export function bindOnEvent(el, typeAndSelector, fn, opts) { let selectorSplitted = typeAndSelector.trim().split(";"); let type = selectorSplitted[0].trim(); let selector = null; if (selectorSplitted.length > 1) { selector = selectorSplitted[1].trim(); } on(el, type, selector, fn, opts); } function buildTypeSelectorKey(type, selector) { return (selector) ? (type + "--" + selector) : type; } //# sourceMappingURL=event.js.map