1

Тема: clearInterval не працює у Firefox

Доброго дня,
вивчаю JS, вигадую собі нескладні задачі, щоб практикуватись, але  зіткнувся з незрозумілою ситуацією.

Задум: при завантаженні сторінки певна функція (metronom) виконується кожні N секунд. Коли перейдемо на іншу вкладку браузера, функція перестає виконуватись. Коли повертаємось на вкладку - вона знову виконується, кожні N сек.

    var timer; 

function execute() { 
    var date = new Date();
    console.log( date.getMinutes() + ' : ' + date.getSeconds() );
}

function metronom() {
    execute();  
    timer=setInterval(execute,3000);
}

window.onfocus = function () { 
    metronom(); 
} 

window.onblur = function () {  
    clearInterval(timer); 
    delete timer; // пробую власноручно видалити timer, не допомагає
    console.log("sleep...");   
}

window.onload = function() { 
    metronom(); 
}

Результат мав би бути таким:

32:26
32:29
32:32 // покидаю вкладку на 10 секунд
sleep...
32:42 // повертаюсь
32:45

І все працює, у Хромі та Опері. Але не у Файрфоксі 60. Там функція metronom продовжує виконуватись, коли вкладка неактивна:

32:26
32:29
32:32 // покидаю вкладку на 10 секунд
32:35 // цього бути не повинно
32:38 // цього бути не повинно
32:41 // цього бути не повинно
32:42 // повертаюсь
32:44 // ще й спрацьовує частіше ніж звично.

Я так розумію, не спрацьовує clearInterval, навіть якщо його власноруч видалити. Тому функція виконується "в фоні".
Гуглив, не знайшов якихось особливих взаємин між Firefox i clearInterval.

Підкажіть, будь ласка, де шукати причину, і що гуглити.
Дякую.

2

Re: clearInterval не працює у Firefox

Перевірив - firefox працює: https://jsfiddle.net/bvcjf7w4/4/

Подякували: nazar1

3

Re: clearInterval не працює у Firefox

на жаль, у мене не працює. Пробував на 2х Firefox 60, у вінді і лінуксі, на локалхості і на сервері, і по вашому посиланню теж.
Хром, до речі, по посиланню теж не зупиняє роботу функції.

4

Re: clearInterval не працює у Firefox

Чомусь onblur не спрацьовує, тобто браузер все ще вважає, що фокус належить тій вкладинці.
Спробуйте детальніше розписати, що саме ви робите - натискаєте мишкою чи клавіатурою переходите на іншу вкладинку; а ще - які у вас є розширення встановлені в браузерах, що можуть на поведінку вкладинок впливати. Можливо, викиньте все, пов'язане з таймерами, і зосередьтеся на onfocus/onblur.

5 Востаннє редагувалося nazar (18.06.2018 17:51:08)

Re: clearInterval не працює у Firefox

що саме ви робите - натискаєте мишкою чи клавіатурою переходите на іншу вкладинку

просто клацав мишкою на іншій вкладинці. Щойно спробував ctrl+tab'ом - той же результат.

які у вас є розширення встановлені в браузерах

мінімальний набір - ublock, ghostery, video download helper. Якщо вимкнути, не допомагає.

Можливо, викиньте все, пов'язане з таймерами, і зосередьтеся на onfocus/onblur

якщо, наприклад, змінювати заголовок сторінки по onblur, то все чудово працює, у всіх браузерах. Але мені все-таки треба, щоб на відкритій вкладинці час від часу виконувалась певна функція, і як це зробити крім setInterval, я не знаю.

Може зайдемо з іншого боку: в мене простий сайт, який намагаюсь оптимізувати.
Кожна сторінка робить mysql-запити раз на хвилину, і вони досить громіздкі. Деякі користувачі відкривають багато вкладинок, і не дивляться на них. Запити виконуються, ресурси з'їдаються, користі нуль. Тому я шукаю спосіб, щоб відсікти непотрібні запити, щоб тільки активна вкладинка регулярно зверталась до сервера, інші - ні.
onMouseOver на body не підходить, бо браузер може бути відкритий не на весь екран, або курсор біля кнопки "Пуск".
Може є інший спосіб це зробити, - якщо так, підкажіть, будь ласка, хоча би напрямок, далі гугл допоможе.
Дякую.

6

Re: clearInterval не працює у Firefox

koala написав:

Перевірив - firefox працює: https://jsfiddle.net/bvcjf7w4/4/

В мене теж все працює.

nazar написав:

на жаль, у мене не працює ... , і по вашому посиланню теж.

Народ, телепатично бачу, що ви повідкривали console своїх firefox'ів і переключаєтесь між консольою і іншою вкладкою. У firefox'і якщо фокус на консолі, то фокусу немає на вкладці.
Або відкрили jsfiddle і не віддали фокус нижній правій прямокутній області, в якій сидить документ і працює js код.

koala написав:

Чомусь onblur не спрацьовує ...

Як це у вас получається. Я би хотів відтворити цей ефект в себе. Опишіть детально.

7

Re: clearInterval не працює у Firefox

leofun01 написав:
koala написав:

Чомусь onblur не спрацьовує ...

Як це у вас получається. Я би хотів відтворити цей ефект в себе. Опишіть детально.

У мене якраз не виходить, див. вище - все працює.

8

Re: clearInterval не працює у Firefox

Ніколи таким не цікавився, але, виявляється, є
https://developer.mozilla.org/en-US/doc … _specified
і
https://developer.mozilla.org/en-US/doc … bility_API

Подякували: leofun01, nazar2

9 Востаннє редагувалося nazar (19.06.2018 08:31:10)

Re: clearInterval не працює у Firefox

У firefox'і якщо фокус на консолі, то фокусу немає на вкладці

тоді відлік мав би зупинитись, а проблема власне в тому, що він не зупиняється.

Або відкрили jsfiddle і не віддали фокус нижній правій прямокутній області

фокус віддав, залишив вкладинку на 15 сек, результат - зупинка на 3 сек., тобто ніякої зупинки немає.

fff
41 : 13
41 : 14
41 : 16
sleep...
41 : 19
41 : 21
41 : 22

додав "visibilitychange", переконався що firefox добре фіксує, коли я покидаю вкладинку і повертаюсь, але відлік далі йде:

18:8
sleep...
hidden // покинув вкладинку
18:11 // ?
18:14 // ?
visible // повернувся на вкладинку
18:16

10

Re: clearInterval не працює у Firefox

розібрався, все чудово працює через

if (document.visibilityState == 'visible') // працюємо
else if (document.visibilityState == 'hidden') // відпочиваємо

koala, дуже дякую, що тицьнули носом у мануал!