vanillajs-browser-helpers
Version:
Collection of convenience code snippets (helpers) that aims to make it a little easier to work with vanilla JS in the browser
58 lines (57 loc) • 1.97 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.delegateHandler = void 0;
var isEventTarget_1 = __importDefault(require("./isEventTarget"));
var on_1 = __importDefault(require("./on"));
var off_1 = __importDefault(require("./off"));
var matches_1 = __importDefault(require("./matches"));
/**
* Creates a function that triggers the given handler if the current event target
* matches the given selector
*
* @param selector - CSS Selector that matches the element to delegate the event to
* @param handler - Handler to trigger if selector selector match
* @return The delegate event handler
*
* @example
*
* ```ts
* const handler = delegateHandler('.my-element', (e: Event) => {});
* document.addEventHandler('click', handler);
* ```
*/
function delegateHandler(selector, handler) {
var cb = 'handleEvent' in handler
? handler.handleEvent
: handler;
return function (e) {
var target = e.target;
while (target && !matches_1.default(target, selector)) {
var parent_1 = target.parentElement;
if (!parent_1) {
return;
}
target = parent_1;
}
var evt = e;
evt.delegateTarget = target;
return cb.call(target, evt);
};
}
exports.delegateHandler = delegateHandler;
function delegate(target, eventNames, selector, handler, options) {
if (!isEventTarget_1.default(target)) {
options = handler;
handler = selector;
selector = eventNames;
eventNames = target;
target = document;
}
var delHandler = delegateHandler(selector, handler);
on_1.default(target, eventNames, delHandler, options);
return function () { return off_1.default(target, eventNames, delHandler); };
}
exports.default = delegate;