1

我在谷歌浏览器上做一个小扩展,我想创建一个新标签,进入 url "sample"+i+".com",在这个 url 上启动一个内容脚本,将当前标签更新为 "sample"+( i+1)+".com",然后启动相同的脚本。我查看了 stackoverflow 上的问答,然后用谷歌搜索,但没有找到可行的解决方案。这是我实际的 background.js 代码(它有效),当我尝试执行 chrome.tabs.update Chrome 直接启动时,它会创建两个选项卡(i=21 和 i=22)并为每个 url 加载我的内容脚本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次,所以我不能这样做。

谢谢你。

4

2 回答 2

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);});
于 2012-11-04T17:17:32.310 回答
0

在将选项卡更新到下一个 url 之前,您需要确保选项卡已完成加载,并且您的内容脚本已完成运行。实现此目的的一种方法是从内容脚本向后台页面发送消息。您可以在内容脚本中包含以下内容:

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"});
于 2012-11-05T16:04:23.647 回答