@progress/kendo-charts
Version:
Kendo UI platform-independent Charts library
88 lines (66 loc) • 2.84 kB
JavaScript
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));
}
}
}