我正在处理Chrome扩展程序,该扩展程序将采用换行符分隔的URL列表,并在新选项卡中打开它们。我已经完成了所有这些工作,但也希望有一个关闭选项卡的选项。下面的代码有效,但是在打开所有标签后立即关闭所有标签,我希望它是一个迭代过程(打开1,等待1秒,关闭它,打开2等等)我不喜欢不明白为什么下面的代码不是那样表现的,并且会欣赏一些解释/提示/解决方案。
JS:
document.getElementById('openButton').onclick = openLinks;
function openLinks()
{
var links = document.getElementById('linkInput').value;
var arr = links.split('\n')
if (document.getElementById("close").checked)
{
for (i = 0; i < arr.length; i++)
{
chrome.tabs.create({url: arr[i], active:false}, function(tab)
{
setTimeout(function()
{
chrome.tabs.remove(tab.id);
}, 1000);
});
sleep();
}
}
else
{
for (i = 0; i < arr.length; i++)
{
chrome.tabs.create({url: arr[i], active:false});
sleep()
}
}
}
function sleep() {
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
if ((new Date().getTime() - start) > 1000){
break;
}
}
}
HTML:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<h2 align="center">Link Opener</h2>
<textarea id="linkInput" rows="10" cols="60">Paste Links Here</textarea>
<table>
<tr>
<td>
<input type="checkbox" name="close" id="close">Autoclose tabs
</td>
<td>
<button type="button" id="openButton">Open</button>
</td>
</tr>
</table>
<script src="background.js"></script>
</body>
</html>
答案 0 :(得分:1)
chrome.tabs.create()
是一个异步函数。这意味着在创建任何选项卡并调用回调之前,整个循环完成。
请勿使用此sleep()
功能。它不允许在等待时执行其他排队操作,不必要地烧毁CPU,并且它不保证它会等待一秒钟(1e7
迭代可以更快地完成,可能)。你应该设置超时。这样,您可以一次构建异步队列,然后让浏览器整理延迟。
function openTab(url, autoclose){
return function(){ // The closure is needed to bind arr[i]
chrome.tabs.create({url: url, active:false}, function(tab){
if(autoclose) {
setTimeout( function() {
chrome.tabs.remove(tab.id);
}, 1000);
}
});
}
}
var autoclose = document.getElementById("close").checked;
for (i = 0; i < arr.length; i++)
{
setTimeout( openTab(arr[i], autoclose), 1000*i);
}
这将立即安排标签,但它们将以1秒的间隔打开。如果autoclose
为真,那么每个标签也会在一秒后关闭。