通过运行以下脚本(在我的Chrome扩展程序中),我得到了一些意想不到的结果:
chrome.windows.getAll({populate: true}, function(wnds)
{
for(var w = 0; w < wnds.length; w++)
{
var tabs = wnds[w].tabs;
for(var t = 0; t < tabs.length; t++)
{
var tab = tabs[t];
var tabUrl = tab.url;
try
{
chrome.tabs.executeScript(tab.id, {
file: "content.js",
allFrames: true,
matchAboutBlank: true
}, function(arrRes)
{
if(chrome.runtime.lastError)
{
console.error("INJ ERR: " + chrome.runtime.lastError.message);
}
else
{
console.log("INJ OK: " + tabUrl);
}
});
}
catch(e)
{
}
}
}
});
当脚本单独运行时,我在控制台日志屏幕中得到以下内容:
但是当我使用调试器逐步执行它时,它会输出类似这样的内容(或每页的正确信息):
我显然期待第二个结果。那么我做错了什么?
答案 0 :(得分:1)
您需要为executeScript
的每次调用创建一个闭包,这样每次调用回调函数时都会获得正确的tabUrl
值。您的代码现在的方式,所有调用将使用tabUrl
的最后一个值。解决这个问题的一种方法是:
chrome.windows.getAll({populate: true}, function(wnds)
{
for(var w = 0; w < wnds.length; w++)
{
var tabs = wnds[w].tabs;
for(var t = 0; t < tabs.length; t++)
(function()
{
var tab = tabs[t];
var tabUrl = tab.url;
try
{
chrome.tabs.executeScript(tab.id, {
file: "content.js"
}, function(arrRes)
{
if(chrome.runtime.lastError)
{
console.error("INJ ERR: " + chrome.runtime.lastError.message);
}
else
{
console.log("INJ OK: " + tabUrl);
}
});
}
catch(e)
{
}
})();
}
});