Режим сохранения Javascript в браузерах

Я сделал небольшой код на JavaScript, который воспроизводит музыку на веб-сайте потоковой музыки (tidal, spotify napster и т. Д.) И меняется каждые x секунд. Когда последняя песня прослушивается, она зацикливается и воспроизводит первую песню в списке воспроизведения. (Я сделал это, потому что на tidal.com веб-мастер не реализовал функциональность для зацикливания всего плейлиста).

Я ввел свой javascript, используя Greasemonkey и Tampermonkey на firefox и chrome, и у меня возникли проблемы, когда у меня открыто 10 вкладок (так что цикл 10 javascript работает вместе). Я новичок, так что, возможно, мой код действительно плохой, просто скажите мне.

Так что код не сложен, я получаю элемент DOM, который позволит мне управлять песнями (следующая / пауза / первая песня), и я.click() на этих кнопках, когда мои условия выполняются. Он работает, когда у меня открыта ОДНА вкладка, и я вижу, что он выполняет свою функцию.

Но проблема в том, что когда я запускаю его с 10 или 15 открытыми вкладками, мой браузер, кажется, останавливает мой javascript, потому что меня нет на странице. Я вижу, что как только я возвращаюсь на страницу, сценарий просыпается и работает. (Например, иногда я возвращаюсь на страницу и вижу песню, которая находится в 2:00, в то время как я устанавливаю в своем коде следующий код, когда время составляет 35 с..)

Итак: мой код полностью глючит или это браузер? Chrome/Firefox делают то же самое. И кстати, я проверял, вводя непосредственно с консоли ( F12), и это то же самое.

//First track of the playlist
var firstTrack;

//Next button
var next;
//current time
var time; 
var lastTrackPlaying; //null if we are not on the last track

var paused; //null if we are playing


function initVar() {

 firstTrack = document.querySelector("button[title='Lire']");
 next = document.getElementsByClassName("play-controls__next js-next")[0];
  
  setInterval(checkTime,5000); //every 5sec, call checkTime
  
}
 

function checkTime() {
 time = document.getElementsByClassName("js-progress")[0].innerHTML; 
 time = 60*Number(time[0]) + Number( time[2] + time[3]); //convert the time to int format
 lastTrackPlaying = document.querySelector("tr[class='js-tracklist__row ui-draggable ui-draggable-handle is-active is-playing'][data-track-id='86656183']");
 paused = document.getElementsByClassName("play-controls__main-button js-main-button play-controls__main-button--paused")[0];

 if( (lastTrackPlaying != null) && ( time >= 35  ) ) firstTrack.click(); //we are on last song, play first

 else if (  time >= 35 ) next.click(); //next song if 35 sec spent

 else if ( paused != null) firstTrack.click(); //if the playlist is paused, play the first song

}



setTimeout(initVar, 5000); //start the code with 5sec delay ( the website load )

1 ответ

Это происходит потому, что браузеры имеют тенденцию замедлять интервалы на неактивных вкладках для оптимизации производительности.

Проверьте MDN для setInterval:

Неактивные вкладки Требуется Gecko 5.0(Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)

Начиная с Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2), интервалы фиксируются для срабатывания не чаще одного раза в секунду в неактивных вкладках.

Другие вопросы по тегам