VKirill

60sec - Yandex.Metrika + UA + GA 4

Sep 19th, 2022 (edited)
3,702
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <script>
  2. var settings = {
  3.     /* Настройки которые надо менять */
  4.     need: 30, // Сюда вписываем через какое количество секунд повторно отправлять цель, по умолчанию стоит 60, но можно указать и 30
  5.     checkTime: 10, // секунды. период проверки.
  6.     //желательно, чтобы need было кратно checkTime
  7.     IDmetrika: 90057536, // Сюда вписываем ИД Счетчика Яндекс Метрики
  8.     code_gtm: true, //Скрипт вставляете с помощью GTM пишем True, если вставляете напрямую на сайт пишем False (в данном случае и Google Analytics требуется вставлять напрямую на сайт)
  9.     // При False в настройках Tilda счетчика UA не забудьте "Включить gtag.js"
  10.     /* Настройки которые надо менять */
  11. }
  12.  
  13. /*
  14. ## Инструкция по добавлению целей в Яндекс.Метрику ##
  15. Если вы указываете в функции NEED шаг в 30 секунд, то в Метрике вы можете отслеживать цели с шагом в 30 секунд и цели событий добавляйте такие:
  16. 30sec
  17. 60sec
  18. 90sec
  19. 120sec
  20. 150sec и т.д.
  21.  
  22. Если вы указываете в функции NEED шаг в 60 секунд, то в Метрике вы можете отслеживать цели с шагом в 30 секунд и цели событий добавляйте такие:
  23. 60sec
  24. 120sec
  25. 180sec
  26. 240sec и т.д.
  27. */
  28.  
  29. /* БОЛЬШЕ В КОДЕ НИЧЕГО НЕ ТРОГАЕМ, ЦЕЛИ ТОЖЕ НЕ ПРАВИМ */
  30. function gtag(){dataLayer.push(arguments);}
  31.  
  32. var metricsFn = function () {
  33.     console.log(ActiveScore.timer);
  34.     console.log(ActiveScore.need);
  35.     var c1 = this.getCookie(this.cookieName);
  36.     console.log(c1);
  37.     if (ActiveScore.timer >= ActiveScore.need) {
  38.         console.log("событие отправилось");
  39.         /* Тут перечислять все что нужно будет вызвать по достижению цели */
  40.         ym(settings.IDmetrika, "reachGoal", this.cookieName.slice(0, -3));
  41.        
  42.     if (settings.code_gtm == true) {
  43.         dataLayer.push({'event': this.cookieName.slice(0, -3)});
  44.     } else {
  45.         gtag('event', 'Timer', {'event_category' : 'Page Timer', 'event_action' : this.cookieName.slice(0, -3)});
  46.     }
  47.        
  48.         /* Тут перечислять все что нужно будет вызвать по достижению цели */
  49.     }
  50. };
  51.  
  52. var ActiveScore = {
  53.     need: settings.need,
  54.     checkTime: settings.checkTime,
  55.     loop: true,
  56.     counter: 0,
  57.     cookieName: "60sec_ap",
  58.     sendFn: null,
  59.     parts: 0,
  60.     active_parts: 0,
  61.     timer: 0,
  62.     events: [
  63.         "touchmove",
  64.         "blur",
  65.         "focus",
  66.         "focusin",
  67.         "focusout",
  68.         "load",
  69.         "resize",
  70.         "scroll",
  71.         "unload",
  72.         "click",
  73.         "dblclick",
  74.         "mousedown",
  75.         "mouseup",
  76.         "mousemove",
  77.         "mouseover",
  78.         "mouseout",
  79.         "mouseenter",
  80.         "mouseleave",
  81.         "change",
  82.         "select",
  83.         "submit",
  84.         "keydown",
  85.         "keypress",
  86.         "keyup",
  87.         "error",
  88.     ],
  89.  
  90.     setEvents: function () {
  91.         for (var index = 0; index < this.events.length; index++) {
  92.             var eName = this.events[index];
  93.             window.addEventListener(eName, function (e) {
  94.                 if (e.isTrusted && ActiveScore.period.events == false) {
  95.                     ActiveScore.period.events = true;
  96.                 }
  97.             });
  98.         }
  99.     },
  100.  
  101.     period: {
  102.         start: 0,
  103.         end: 0,
  104.         events: false,
  105.     },
  106.  
  107.     init: function (fn) {
  108.         this.calcParts();
  109.         this.setEvents();
  110.         this.setStartCounter();
  111.         if (this.checkCookie()) {
  112.             this.sendFn = fn;
  113.             this.start();
  114.         }
  115.     },
  116.  
  117.     readLastCookie: function () {
  118.         var absurdlyLarge = 100000;
  119.         for (var i = 1; i < absurdlyLarge; i++) {
  120.             var cookie = this.getCookie(i * this.need + 'sec_ap');
  121.             if (cookie != this.parts * this.parts) return { i: i, cookie: cookie };
  122.         }
  123.         return { i: 1, cookie: 0 };
  124.     },
  125.  
  126.     setStartCounter: function () {
  127.         var lastCookie = this.readLastCookie();
  128.         this.counter = lastCookie.i - 1;
  129.         this.active_parts = Number(lastCookie.cookie);
  130.         this.cookieName = (this.counter + 1) * this.need + "sec_ap";
  131.     },
  132.  
  133.     calcParts: function () {
  134.         this.parts = Math.ceil(this.need / this.checkTime);
  135.     },
  136.  
  137.     setPeriod: function () {
  138.         this.period.start = this.microtime();
  139.         this.period.end = this.period.start + this.checkTime;
  140.         this.period.events = false;
  141.     },
  142.  
  143.     microtime: function () {
  144.         var now = new Date().getTime() / 1000;
  145.         var s = parseInt(now);
  146.         return s;
  147.     },
  148.  
  149.     start: function () {
  150.         this.setPeriod();
  151.         this.runPeriod();
  152.     },
  153.  
  154.     timeoutId: null,
  155.  
  156.     checkPeriod: function () {
  157.         if (this.period.events == true) {
  158.             this.active_parts = this.active_parts + 1;
  159.             // console.log('В этой секции были действия');
  160.         } else {
  161.             // console.log('В этой секции НЕБЫЛО действия');
  162.         }
  163.         this.timer = this.active_parts * this.checkTime;
  164.         console.log(
  165.             this.active_parts + " / " + this.parts + " [" + this.timer + "]"
  166.         );
  167.  
  168.         if (this.checkSecs()) {
  169.         } else {
  170.             this.start();
  171.         }
  172.         this.setCookie(this.cookieName, this.active_parts);
  173.     },
  174.  
  175.     checkSecs: function () {
  176.         if (this.timer >= this.need) {
  177.             this.send();
  178.             if (this.loop == true) {
  179.                 this.counter++;
  180.                 this.timer = 0;
  181.                 this.active_parts = 0;
  182.                 this.cookieName = (this.counter + 1) * this.need + "sec_ap";
  183.                 return false;
  184.             } else {
  185.                 // console.log('Завершили проверку активности');
  186.                 return true;
  187.             }
  188.         }
  189.         return false;
  190.     },
  191.  
  192.     timeoutFn: function () {
  193.         ActiveScore.checkPeriod();
  194.     },
  195.  
  196.     runPeriod: function () {
  197.         this.timeoutId = setTimeout(this.timeoutFn, this.checkTime * 1000);
  198.     },
  199.  
  200.     send: function () {
  201.         if (this.getCookie(this.cookieName) == this.parts * this.parts) {
  202.             this.setStartCounter();
  203.         } else {
  204.             this.setCookie(this.cookieName, this.active_parts * this.active_parts);
  205.         }
  206.         this.sendFn();
  207.     },
  208.  
  209.     checkCookie: function () {
  210.         var c = this.getCookie(this.cookieName);
  211.         if (c == null) {
  212.             return true;
  213.         } else {
  214.             if (c == '') return true;
  215.             c = parseInt(c);
  216.             if (c >= this.parts) {
  217.                 // console.log('Скрипт даже не запустился...');
  218.                 if (this.loop == true) {
  219.                     return true;
  220.                 }
  221.                 return false;
  222.             } else {
  223.                 this.active_parts = c;
  224.                 return true;
  225.             }
  226.         }
  227.     },
  228.  
  229.     setCookie: function (name, value, days) {
  230.         var expires = "";
  231.         if (days) {
  232.             var date = new Date();
  233.             date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);
  234.             expires = "; expires=" + date.toUTCString();
  235.         }
  236.         document.cookie = name + "=" + (value || "") + expires + "; path=/";
  237.     },
  238.     getCookie: function (name) {
  239.         var nameEQ = name + "=";
  240.         var ca = document.cookie.split(";");
  241.         for (var i = 0; i < ca.length; i++) {
  242.             var c = ca[i];
  243.             while (c.charAt(0) == " ") c = c.substring(1, c.length);
  244.             if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
  245.         }
  246.         return null;
  247.     },
  248.     eraseCookie: function (name) {
  249.         document.cookie =
  250.             name + "=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;";
  251.     },
  252. };
  253.  
  254. ActiveScore.init(metricsFn);
  255. </script>
Advertisement
Add Comment
Please, Sign In to add comment