in src/pro-src/rules.js [145:218]
initEventHandler(rules, withViz = true) {
const trigger = rules.trigger || {};
const eventListenersForThisTrigger = [];
trigger.eventListeners.forEach((listener) => {
if (!listener.selector || !listener.event) {
logger.warn("You're missing a selector or an event on an event listener");
return;
}
let elemList = null;
try {
elemList = document.querySelectorAll(listener.selector);
} catch (e) {
logger.warn(`${listener.selector} is not a valid selector string`);
}
if (elemList.length > 0) {
elemList.forEach((elem) => {
// We create it empty, because it depends on what happens later in this method.
// By the time this callback is called, it will be a different method.
let removalMethod = () => {};
const conditionChecker = () => {
window[RULES_HANDLER_SINGLETON].verifyConditions(
rules,
false,
listener.visualization ? listener.selector : undefined,
removalMethod
);
};
const eventListener = {
elem,
event: listener.event,
conditionChecker,
id: Math.random()
};
this.eventListeners.push(eventListener);
eventListenersForThisTrigger.push(eventListener);
elem.addEventListener(listener.event, conditionChecker);
if (this.verifyConditions(rules, true) && listener.visualization !== 'none' && withViz) {
removalMethod = this.addViz(listener, elem);
onRemove(elem, removalMethod);
}
});
}
});
const timeoutId = Math.random();
this.resetListenersTimeouts.push({
timeout: setTimeout(() => {
// this removes the timeout that just triggered.
window[RULES_HANDLER_SINGLETON].resetListenersTimeouts = window[RULES_HANDLER_SINGLETON]
.resetListenersTimeouts.filter(timeout => timeout.id !== timeoutId);
RulesHandler.removeEventListeners(eventListenersForThisTrigger);
// this removes the event listners that we just removed from the list used by the cleanup.
// No need to clean them up anymore.
window[RULES_HANDLER_SINGLETON].eventListeners = window[RULES_HANDLER_SINGLETON]
.eventListeners
.filter(listener => !eventListenersForThisTrigger
.some(eListener => eListener.id === listener.id)
);
// We recall this method without placing the vizs,
// to replace the listeners on new elements that might have appeared.
this.initEventHandler(rules, false);
}, this.triggerEventListenerUpdateRate),
id: timeoutId
});
}