1

我在 JavaScript 中编写了一个小代码,它在流媒体音乐网站(潮汐、spotify napster 等)上播放音乐并每 x 秒更改一次。当最后一首歌曲正在收听时,它会循环播放播放列表的第一首歌曲。(我这样做是因为 tidal.com 网站管理员没有实现循环整个播放列表的功能)。

我在 firefox 和 chrome 上使用 Greasemonkey 和 Tampermonkey 注入了我的 javascript,当我打开 10 个标签时我遇到了问题(所以 10 个 javascript 循环一起工作)。我是初学者,所以也许我的代码真的很糟糕,告诉我。

所以代码并不复杂,我得到了允许我控制歌曲(下一首/暂停/第一首歌曲)的 DOM 元素,当我的条件为真时,我在这些按钮上单击()。当我打开一个选项卡时它可以工作,我可以看到它正在发挥它的作用。

但问题是,当我在打开 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 )

4

1 回答 1

0

发生这种情况是因为浏览器倾向于减慢非活动选项卡中的间隔以优化性能。

查看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) 开始,在非活动标签中,间隔被限制为每秒不超过一次。

于 2018-04-14T15:45:17.960 回答