Shoora
3/31/2019 - 5:12 PM

js для добавления целей яндекс-метрики

js для добавления целей яндекс-метрики

/**
 * Модуль для множественного добавления целей яндекс-метрики
 *
 * @param <string> counterId - идентификатор счётчика
 * @param <array> goals - массив целей со структурой:
 *
 *  [
 *    {
 *      element: DOM-node или node-list,
 *      event: событие,
 *      target: идентификатор цели яндекс-метрики,
 *    },
 *    ...
 *  ]
 */
class Goals {
  constructor(counterId, goals) {
    this.counterId = counterId;
    this.goals = goals;
    this.attemptsCount = 0;
    this.loaded = false;
  }

  init() {
    if (this.attemptsCount < 20 && this.checkMetrika()) {
      console.warn('Яндекс-метрика: счётчик метрики успешно инициализирован!'); // eslint-disable-line
      this.addGoals();
    } else if (!this.loaded) {
      setTimeout(() => {
        this.init();
      }, 200);
    } else {
      console.warn(`Яндекс-метрика: не удалось загрузить счётчик Яндекс-метрики. Количество попыток: ${this.attemptsCount}`); // eslint-disable-line
    }
  }

  checkMetrika() {
    const counter = window[`yaCounter${this.counterId}`];
    if (!counter) {
      console.warn(`Яндекс-метрика: счётчик с id ${this.counterId} недоступен на этой странице, повторная проверка через секунду`); // eslint-disable-line
      this.attemptsCount++;
      return false;
    }

    this.loaded = true;
    return true;
  }

  addGoals() {
    this.goals.forEach((item) => {
      // проверяем получили ли мы nodeList или отдельный элемент
      if (item.element && typeof item.element.length === 'number') {
        [].forEach.call(item.element, (listItem) => {
          listItem.addEventListener(item.event, () => {
            this.counter.reachGoal(item.target);
          });
        });
      } else if (item.element) {
        item.element.addEventListener(item.event, () => {
          this.counter.reachGoal(item.target);
        });
      } else {
        console.warn(`Яндекс-метрика: элемент для цели ${item.target} недоступен`); // eslint-disable-line
      }
    });
  }
}

export default Goals;