За последние 24 часа нас посетили 17105 программистов и 1627 роботов. Сейчас ищут 1811 программистов ...

Активность скриптов на Ajax сайте.

Тема в разделе "JavaScript и AJAX", создана пользователем Danil005, 21 янв 2018.

  1. Danil005

    Danil005 Активный пользователь

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Как сделать активным часть кода только на той странице, которая активна. Мне это надо, потому что если открыть две страницы, то сайт начнет выполнять 2 Ajax запроса и т.д.
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.797
    Симпатии:
    1.331
    Адрес:
    Лень
    Вариант сплыл в голове - выполнять скрипты если курсор наведен на контент сайта
     
  3. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    не решает, если есть циклически выполняющийся код на странице и его нужно затормозить при открытии сайта в другом табе.
    Тут может быть что-то на основе localStorage.
    Код (Javascript):
    1. let currentTime = 0;
    2. const time = () => (new Date()).getTime();
    3. const setNewTime = () => {
    4.     localStorage.setItem('active', currentTime = time());
    5. };
    6. const runAction = () => {
    7.     let timer = setInterval(() => {
    8.         if (currentTime == localStorage.getItem('active')) {
    9.             console.log('execute request');
    10.         } else {
    11.             console.log('standby');
    12.         }
    13.     }, 2000);
    14. };
    15. document.addEventListener('mousemove', setNewTime);
    16. document.addEventListener('keydown', setNewTime);
    17. document.addEventListener('scroll', setNewTime);
    18. document.addEventListener('DOMContentLoaded', () => {
    19.     setNewTime();
    20.     runAction();
    21. });
    Вместо Ajax-запросов в цикле, ставлю setInterval. Если началась движуха на соседней вкладке, то время в localStorage измениться и при следующей итерации, не совпадет с тем, что было присвоено переменной currentTime. Если вернемся на предыдущую вкладку и выполниться какое-либо событие, то произойдёт опять смена времени в LS и переменной currentTime для текущего таба, а в не активной будет несовпадение. Минусы и в таком подходе есть, но усталость не дает доработать до нужной кондиции.

    P.S. Ночное изложение мысли может и сбивчивое, но надеюсь смысл идеи донести получилось. :)
    --- Добавлено ---
    @Danil005, только не делайте Ajax-запросы в setInterval. Лучше запаковать код Ajax в функцию и после успешного завершения текущего запроса, подождать N секунд с вызовом этой же функции.
     
    Danil005 нравится это.
  4. Danil005

    Danil005 Активный пользователь

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    @Deonis по некоторым причинам, скрипт не работает, я переделал его таким образом:
    Код (Javascript):
    1. var currentTime = 0;
    2.     function time() {
    3.         return (new Date()).getTime();
    4.     }
    5.     function setNewTime() {
    6.         localStorage.setItem('active', currentTime = time());
    7.     }
    8.     function runAction() {
    9.         setInterval(function () {
    10.             if ( currentTime == localStorage.getItem('active') ) {
    11.                 console.log('execute request');
    12.             } else {
    13.                 console.log('standby');
    14.             }
    15.         }, 2000);
    16.     }
    17.     document.addEventListener('mousemove', setNewTime());
    18.     document.addEventListener('keydown', setNewTime());
    19.     document.addEventListener('scroll', setNewTime());
    20.     document.addEventListener('DOMContentLoaded',function () {
    21.         setNewTime();
    22.         runAction();
    23.     });
    И такая же проблема...
    --- Добавлено ---
    И вообще document.addEventListener срабатывает только при загрузки страницы...
    --- Добавлено ---
    Однако эта строка работает, если использовать window за место document.
    Код (Javascript):
    1. document.addEventListener('DOMContentLoaded',function () {
    2.         runAction();
    3.         setNewTime();
    4.     });
     
  5. Danil005

    Danil005 Активный пользователь

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Все, переделал код таким образом и все стало работать:
    Код (Javascript):
    1.  var currentTime = 0;
    2.     function time() {
    3.         return (new Date()).getTime();
    4.     }
    5.     function setNewTime() {
    6.         localStorage.setItem('active', currentTime = time());
    7.     }
    8.     function runAction() {
    9.         setInterval(function () {
    10.             if ( currentTime == localStorage.getItem('active') ) {
    11.                console.log('execute request');
    12.                currentTime = 0;
    13.             } else {
    14.                console.log('standby');
    15.             }
    16.         }, 2000);
    17.     }
    18.     $(document).on('mousemove', function () {setNewTime();});
    19.     $(document).on('keydown', function () {setNewTime();});
    20.     $(document).on('scroll', function () {setNewTime();});
    21.     $(function() {runAction();});
     
  6. Poznakomlus

    Poznakomlus Активный пользователь

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    Ошибка архитектуры. И на этой ошибке строятся костыли.
    Постарайтесь еще раз глянуть на задачу. К примеру кроме storage, могут быть сокеты, сессии и другой подход