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;