initEventHandler()

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
    });
  }