使用计时器打开和关闭chrome中的选项卡

时间:2014-07-28 19:52:00

标签: javascript google-chrome google-chrome-extension

我正在处理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>

1 个答案:

答案 0 :(得分:1)

chrome.tabs.create()是一个异步函数。这意味着在创建任何选项卡并调用回调之前,整个循环完成。

  1. 你慢慢地,通过一个非常低效的循环将标签创建放入队列中。
  2. 你的功能退出。
  3. 队列被处理(非常快),每个实例都将超时添加到队列中(大约在同一时间)。
  4. 在一秒钟内,所有标签都会关闭,因为超时几乎同时发生。

  5. 请勿使用此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为真,那么每个标签也会在一秒后关闭。