sortarage
@sortarage
Я тучка-тучка-тучка, я вовсе не медведь

Как средствами JavaScript реализовать фоновое событие на всех страницах сайта?

День добрый.

Необходимо создать событие, которое будет фоново выполняться на всех страницах сайта, вне зависимости от конкретной страницы в данный момент. Насколько это возможно реализовать средствами JavaScript?

Если возможно, буду благодарен за примеры подобного кода. Страницы сайта - статичный html с парой скриптов, вроде слайдеров картинок и Метрики.

UPD: Мне нужно отслеживать выполнение цели на Яндекс.Метрике через выполнения события. И мне надо, чтобы это событие произошло ровно через 2 минуты после захода пользователя на сайт, вне зависимости его перемещения по страницам.
  • Вопрос задан
  • 2969 просмотров
Решения вопроса 2
@Quilin
Full-stack разработчик
Я бы советовал на событии onLoad (аналог jquery document.ready) вешать что-то вроде:

$(function () {
    var YMEventHandler = (function () {
        var _timerDelta = 100,
             _timerCookieName = "___TimerYM___"
             _timerElapse = 2 * 60 * 1000, // two minutes
        _timer = setInterval(function () {
             var timerValue = parseInt(_getTimerValue()) || 0;
             timerValue += _timerDelta;
             _setTimerValue(timerValue);
             if (timerValue >= _timerElapse) {
                 clearInterval(_timer);
                 // вызов того, что нужно было вызвать!!!
             }
        }, _timerDelta);

        function _getTimerValue() {
             return _getCookie(_timerCookieName);
        };

        function _setTimerValue(value) {
             _setCookie(_timerCookieName, value);
        };

        function _getCookie(name) {
            var matches = document.cookie.match(new RegExp("(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"));
            return matches ? decodeURIComponent(matches[1]) : undefined;
        };

        function _setCookie(name, value) {
            document.cookie = name + "=" + value;
        };

    })();
});


Это достаточно топорно, но работать вроде бы должно.
Ответ написан
mlnkv
@mlnkv
JavaScript Developer
$(function(){
    checkTime(function(){
        alert('2 minutes')
    });
});

function checkTime(callback){
    var time = 10; //время, в секундах
    if ( localStorage ) {        
        if (localStorage.userEnter == "end") return;
        if (!localStorage.userEnter) localStorage.userEnter = new Date().getTime();
        else if ((new Date().getTime() - localStorage.userEnter) > time * 1000 ) {
            callback && callback();
            localStorage.userEnter = "end";
        }
    }    
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
На статичном сайте это сделать нельзя. Только на FullAjax-сайтах.
Ответ написан
Вопрос задан несколько расплывчато. Насколько я понял, требуется выполнить какое-то действие через 2 минуты после входа посетителя на сайт, верно? Вход на сайт, с точки зрения JS - тоже понятие весьма расплывчатое. Нужно понять, что считать началом отсчета (начало загрузки страницы? полная загрузка страницы? какой-то другой момент?). И еще одна тонкость. Если посетитель будет перемещаться по сайту, то в момент перехода с одной страницы на другую будет некоторая пауза выполнения скрипта, которая может внести погрешность в "ровне 2 минуты". Например, пользователь в 1:59 уходит со страницы, следующая страница загружается 5 минут, следующий скрипт выполнится в 2:04.

Для сохранения временной метки я бы предложил сохранять временную метку старта в cookie и запускать таймер на 2 минуты. Если пользователь не переходит на другую страницу, срабатывает таймер и выполняет действие. Если пользователь переходит на другую страницу, скрипт читает временную метку из cookie и запускает таймер на (2 мин. - (текущее время - сохраненная метка)).
Ответ написан
k12th
@k12th
console.log(`You're pulling my leg, right?`);
принцип такой: по domReady кладем в localStorage флажок, в котором лежит таймстемп момента времени, в который должно выстрелить наше событие. Но если этот флажок уже есть, то запускаем наше событие через таймстемп - сейчас.

window.onload = function () {
    var when = localStorage.getItem('when'),
        handlerTimeout;

    if (when && !localStorage.getItem('done')) {
        when = parseInt(when); // localStorage хранит строки

        handlerTimeout = setTimeout(function () {
            // тут делаем полезную работу

            localStorage.removeItem('when');

            localStorage.setItem('done', true);

        }, when - Date.now());

    } else { // флага еще нет, первый заход
        localStorage.setItem('when', Date.now() + 2 * 60 * 1000); // через две минуты от сейчас
    }
};


В данном коде есть баг: событие не выстрелит, если пользователь будет торчать на первой же странице две минуты. Взаимодействие со сторонним кодом оставляю в качестве домашнего упражнения читателю:)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
17 апр. 2024, в 00:02
1000 руб./за проект
17 апр. 2024, в 00:00
1500 руб./за проект
16 апр. 2024, в 23:47
20000 руб./за проект