如何使chrome.tabs.update与内容脚本一起使用

时间:2012-11-04 16:58:39

标签: google-chrome-extension

我在谷歌浏览器上进行了一些扩展,我想创建一个新选项卡,继续使用网址“示例”+ i +“。com”,在此网址上启动内容脚本,将当前标签更新为“示例” “+(i + 1)+”。com“,并启动相同的脚本。我在stackoverflow上看了Q& A,我谷歌但是我没有找到合适的解决方案。这是我实际的background.js代码(它有效),它创建了两个选项卡(i = 21和i = 22)并为每个url加载我的内容脚本,当我尝试执行chrome.tabs.update Chrome直接启动时一个i = 22的选项卡(脚本只能运行一次):

function extraction(tab) {
for (var i =21; i<23;i++)
    {
        chrome.storage.sync.set({'extraction' : 1}, function() {}); //for my content script
        chrome.tabs.create({url: "http://example.com/"+i+".html"}, function() {});
    } 
}
chrome.browserAction.onClicked.addListener(function(tab) {extraction(tab);});

如果有人可以帮助我,内容脚本和manifest.json不是问题。我想做那15000次,所以我不能这样做。

谢谢。

2 个答案:

答案 0 :(得分:0)

我猜chrome.tabs.create是一个异步函数,因此您需要创建一个单独的函数,以便每次都复制i变量:

试试这个:

var func = function(i)
{
        chrome.storage.sync.set({'extraction' : 1}, function() {}); //for my content script
        chrome.tabs.create({url: "http://example.com/"+i+".html"}, function() {});
}

function extraction(tab) {
for (var i =21; i<23;i++)
    {
      func(i);
    } 
}
chrome.browserAction.onClicked.addListener(function(tab) {extraction(tab);});

答案 1 :(得分:0)

在将标签更新为下一个网址之前,您需要确保标签已完成加载,并且内容脚本已完成运行。实现这一目标的一种方法是通过从内容脚本向后台页面发送消息。您可以在内容脚本中包含以下内容:

chrome.extension.sendMessage("finished");

在后台脚本中,您可以执行以下操作:

var current = 21, end = 23;
chrome.extension.onMessage.addListener(
  function(request, sender) {
    if( request == "finished" && current <= end ) {
      chrome.tabs.update( sender.tab.id,
                       {url: "http://example.com/"+current+".html"});
      current++;
    }
  }
);
chrome.tabs.create({url: "http://example.com/"+current+".html"});