UNPKG

@progress/kendo-charts

Version:

Kendo UI platform-independent Charts library

88 lines (66 loc) 2.84 kB
import isFunction from './is-function'; import isArray from './is-array'; import guid from '../core/utils/guid'; var elementEventHandlers = new WeakMap(); var ID = Symbol('id'); export function on(element, events, filter, handler, useCapture) { addEventListeners(element, events, filter, handler, useCapture); } export function off(element, events, filter, handler, useCapture) { removeEventListeners(element, events, filter, handler, useCapture); } function isString(value) { return typeof(value) === "string"; } function addEventListeners(element, events, filter, handler, useCapture) { var eventNames = isArray(events) ? events : (events || "").split(" "); eventNames.forEach(function(eventName) { addEventListener(element, eventName, filter, handler, useCapture); }); } function addEventListener(element, event, filter, handler, useCapture) { var eventHandler = handler; var eventFilter; if (filter && isFunction(filter) && !handler) { eventHandler = filter; } else if (filter && isString(filter) && isFunction(eventHandler)) { eventFilter = filter; } var attachedHandler = function(e) { var closestMatchingTarget = e.target ? e.target.closest(eventFilter) : null; if (!eventFilter || (eventFilter && e.target && closestMatchingTarget)) { var currentTarget = eventFilter ? closestMatchingTarget : e.currentTarget; // reassign the property as it is a getters only Object.defineProperty(e, "currentTarget", { value: currentTarget }); // keep a reference to the top-level target Object.defineProperty(e, "delegateTarget", { value: element }); eventHandler(e); } }; eventHandler[ID] = guid(); var eventHandlers = elementEventHandlers.get(element); if (!eventHandlers) { eventHandlers = new Map(); elementEventHandlers.set(element, eventHandlers); } eventHandlers.set(eventHandler[ID], attachedHandler); element.addEventListener(event, attachedHandler, Boolean(useCapture)); } function removeEventListeners(element, events, handler, useCapture) { var eventNames = isArray(events) ? events : (events || "").split(" "); eventNames.forEach(function(eventName) { removeEventListener(element, eventName, handler, useCapture); }); } function removeEventListener(element, event, handler, useCapture) { var eventHandlers = elementEventHandlers.get(element); if (eventHandlers && handler && handler[ID]) { var handlerId = handler[ID]; var attachedHandler = eventHandlers.get(handlerId); eventHandlers.delete(handlerId); if (attachedHandler) { element.removeEventListener(event, attachedHandler, Boolean(useCapture)); } } }