/** * парсит текущие UTM метки и дает возможность к ним обращаться через класс * @type type */ class UTMParser { constructor() { // Получение параметров строки запроса this.queryString = window.location.search; // Создание объекта для хранения utm меток this.utmObject = {}; // Проверка наличия параметров utm в строке запроса if (this.queryString) { // Разделение строки запроса на отдельные параметры const queryArray = this.queryString.substr(1).split('&'); // Обход каждого параметра и сохранение utm меток в объекте queryArray.forEach(param => { const pair = param.split('='); const key = decodeURIComponent(pair[0]); const value = decodeURIComponent(pair[1]); if (key.indexOf('utm_') === 0) { this.utmObject[key] = value; } }); } } // Метод для получения значения utm метки по ключу get(key) { return this.utmObject[key] || ''; } /** * добавляет параметр в список параметров * @param {type} key - параметр * @param {type} value - значение * @returns {undefined} */ addParam(key, value) { this.utmObject[key] = value; } // Метод для создания строки запроса с utm метками toString() { let queryString = ''; // Обход каждого параметра в объекте utm меток и добавление его в строку запроса for (const [key, value] of Object.entries(this.utmObject)) { queryString += `${encodeURIComponent(key)}=${encodeURIComponent(value)}&`; } return queryString ? `${queryString.slice(0, -1)}` : ''; } } // подключение метрики (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments);}; m[i].l=1*new Date(); for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }} k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a);}) (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym"); let YandexMetrika = { startTime : (new Date()).getTime(), _counters : [], _reachedGoals : [], _clientID : null, //ID клиента init : function(counterID, webVisor) { this._counters.push(counterID); ym(counterID, "init", { clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor: webVisor }); // если не удалось считать, то пробуем другой метод fClientID = (clientID) => { this._clientID = clientID; console.log("YAClientID = " + clientID); }; ym(counterID, 'getClientID', fClientID); }, /** * @public * @description один раз фиксирует достижение цели в счетчике. Если цель срабатывает несколько раз, то игнорит повторные достижения * @param {String} goalName - имя счетчика * @returns {undefined} */ reachGoalOnce : function(goalName) { if (!this._reachedGoals[goalName]) { this.reachGoal(goalName); } }, /** * Возвращает ID клиента в яндексе * @returns {YandexMetrika._clientID} */ getYandexClientID : function() { // если не известен ID клиента, пытаемся его получить if (!this._clientID) { // получаем clientID метрики let yaCounter = window["yaCounter" + this._counters[0]]; if (yaCounter && yaCounter.getClientID) { this._clientID = yaCounter.getClientID(); } } return this._clientID; }, /** * @public * @description фиксирует достижение цели в счетчике * @param {String} goalName - имя счетчика * @returns {undefined} */ reachGoal : function(goalName) { console.log("YandexMetrika.reachGoal: " + goalName); this._reachedGoals[goalName] = 1; for (let i=0; i < this._counters.length; i++) ym(this._counters[i], 'reachGoal', goalName); }, /** * @public * @description возвращает счетчик метрики. Если их несколько, то первый * @returns {undefined} */ getCounter : function() { for (let i=0; i < this._counters.length; i++) return this._counters[i]; }, /** * @public * @description возвращает ID клиента метрики * @param {function} callBack - метод, который будет вызван в асинхронном режиме и ему будет передан clientID * @returns {undefined} */ getClientID : function(callBack) { for (let i=0; i < this._counters.length; i++){ ym(this._counters[i], 'getClientID', callBack); return; } callBack(null); } }; /** * Функция, которая выполняется в случае клика по кнопке, отслеживаемой метрикой * Находит класс, который начинается на MetrikaGoal- * Отрезает хвост MetrikaGoal- * Отдает отчет метрике о выполненной цели * @return {goalName} */ function clickOnMetrikaButton(event) { let prefix = "MetrikaGoal-"; let prefixLength = prefix.length; let clickedButton = event.target; let arrayClasses = clickedButton.classList; for (var i = 0; i < arrayClasses.length; i++) { let currentClass = arrayClasses[i]; if (currentClass.startsWith("MetrikaGoal-")) { let ID = currentClass.substring(prefixLength); YandexMetrika.reachGoal(ID); } } } document.addEventListener("DOMContentLoaded", function() { YandexMetrika.init("94761585", 1); /** * Задает OnClick всем кнопкам с классом MetrikaButton */ let allMetrikaButton = document.querySelectorAll(".MetrikaButton"); for (var i = 0; i < allMetrikaButton.length; i++) { allMetrikaButton[i].addEventListener("click", clickOnMetrikaButton); } } );