Skip to content

Instantly share code, notes, and snippets.

@Banochkin
Created August 9, 2021 00:44
Show Gist options
  • Save Banochkin/d136cf492f77cab9f603bf2b008515a9 to your computer and use it in GitHub Desktop.
Save Banochkin/d136cf492f77cab9f603bf2b008515a9 to your computer and use it in GitHub Desktop.
Delayed code download
(function() {
'use strict';
// Флаг, что Метрика уже загрузилась.
var loadedScript = false,
// Ваш идентификатор сайта в Яндекс.Метрика.
metricaId = 14881488,
// Переменная для хранения таймера.
timerId;
// Для бота Яндекса грузим Метрику сразу без "отложки",
// чтобы в панели Метрики были зелёные кружочки
// при проверке корректности установки счётчика.
if (navigator.userAgent.indexOf('YandexMetrika') > -1) {
loadScript();
} else {
// Подключаем Метрику, если юзер начал скроллить.
window.addEventListener('scroll', loadScript, {
passive: true
});
// Подключаем Метрику, если юзер коснулся экрана.
window.addEventListener('touchstart', loadScript);
// Подключаем Метрику, если юзер дернул мышкой.
document.addEventListener('mouseenter', loadScript);
// Подключаем Метрику, если юзер кликнул мышкой.
document.addEventListener('click', loadScript);
// Подключаем Метрику при полной загрузке DOM дерева,
// с "отложкой" в 1 секунду через setTimeout,
// если пользователь ничего вообще не делал (фоллбэк).
document.addEventListener('DOMContentLoaded', loadFallback);
}
function loadFallback() {
timerId = setTimeout(loadScript, 1000);
}
function loadScript(e) {
// Пишем отладку в консоль браузера.
if (e && e.type) {
// console.log(e.type);
} else {
// console.log('DOMContentLoaded');
}
// Если флаг загрузки Метрики отмечен,
// то ничего более не делаем.
if (loadedScript) {
return;
}
(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();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)}) (window, document, "script", "https://cdn.jsdelivr.net/npm/yandex-metrica-watch/tag.js", "ym");
ym(metricaId, "init", { clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true });
// ======
// Тут ещё код (пиксели, другие счётчики)
// ======
// Отмечаем флаг, что Метрика загрузилась,
// чтобы не загружать её повторно при других
// событиях пользователя и старте фоллбэка.
loadedScript = true;
// Очищаем таймер, чтобы избежать лишних утечек памяти.
clearTimeout(timerId);
// Отключаем всех наших слушателей от всех событий,
// чтобы избежать утечек памяти.
window.removeEventListener('scroll', loadScript);
window.removeEventListener('touchstart', loadScript);
document.removeEventListener('mouseenter', loadScript);
document.removeEventListener('click', loadScript);
document.removeEventListener('DOMContentLoaded', loadFallback);
}
})()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment