VKirill

Untitled

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