@veams/component
Version:
Component Class for Components in Veams for static page apps
113 lines • 4.77 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
/**
* Represents a very simple on/off handler
* borrowed from @veams/query
*
* @module EventElement
*/
var componentEvents = [];
var EventElement = /** @class */ (function () {
/**
* VeamsQuery DOM wrapper object
*
* @param {Object} selector - selector (element)
*/
function EventElement(selector) {
this[0] = selector;
}
/**
* Attach an event handler function for one or more events to the selected elements
*
* @param {String} eventNames - name(s) of event(s) to be registered for matched set of elements
* @param {String} [selector] - selector string to filter descendants of selected elements triggering the event
* @param {Function} handler - event handler function
* @param {Boolean} [useCapture] - dispatch event to registered listeners before dispatching it to event target
* @return {Object} - VeamsQuery object
*/
EventElement.prototype.on = function (eventNames, selector, handler, useCapture) {
var i = 0;
var events = typeof eventNames === 'string' && eventNames.split(' ');
var targetSelector = typeof selector === 'string' ? selector : undefined;
var evtHandler = typeof selector === 'function' ? selector : typeof handler === 'function' ? handler : undefined;
var capture = typeof handler === 'boolean' ? handler : typeof useCapture === 'boolean' ? useCapture : false;
var delegateTarget;
if (!events) {
console.error('@veams/component :: on() - Event name not specified');
return this;
}
if (!evtHandler) {
console.error('@veams/component :: on() - Event handler not specified');
return this;
}
for (var j = 0; j < events.length; j++) {
var _a = events[j].split('.'), event_1 = _a[0], namespace = _a[1];
var handler_1 = function (e) {
if (targetSelector) {
delegateTarget = e.target.closest(targetSelector);
if (delegateTarget) {
evtHandler(e, delegateTarget);
}
}
else {
evtHandler(e, e.currentTarget);
}
};
this[0].addEventListener(event_1, handler_1, capture);
componentEvents.push({
node: this[0],
event: event_1,
namespace: namespace,
handler: handler_1,
originHandler: evtHandler,
selector: targetSelector
});
}
return this;
};
/**
* Detach an event handler for one or more events from the selected elements
*
* @param {String} eventNames - name(s) of event(s) to be unregistered for matched set of elements
* @param {String} [selector] - selector string to filter descendants of selected elements triggering the event
* @param {Function} [handler] - event handler
* @return {Object} - VeamsQuery object
*/
EventElement.prototype.off = function (eventNames, selector, handler) {
var i = 0;
var events = eventNames.split(' ');
var targetSelector = typeof selector === 'string' ? selector : undefined;
var evtHandler = typeof selector === 'function' ? selector : typeof handler === 'function' ? handler : undefined;
for (var j = 0; j < events.length; j++) {
var _a = events[j].split('.'), event_2 = _a[0], namespace = _a[1];
var k = componentEvents.length - 1;
for (k; k >= 0; --k) {
var unbindEvt = false;
if (componentEvents[k].node === this[0] && componentEvents[k].event === event_2 &&
componentEvents[k].namespace === namespace && componentEvents[k].selector === targetSelector) {
if (evtHandler) {
if (componentEvents[k].originHandler === evtHandler || componentEvents[k].handler === evtHandler) {
unbindEvt = true;
}
}
else {
unbindEvt = true;
}
if (unbindEvt) {
this[0].removeEventListener(event_2, componentEvents[k].handler);
componentEvents.splice(k, 1);
}
}
}
}
return this;
};
return EventElement;
}());
exports.EventElement = EventElement;
function default_1(selector) {
return new EventElement(selector);
}
exports.default = default_1;
;
//# sourceMappingURL=event-handler.js.map