我正在尝试将我的后台脚本中的消息发送到内容脚本并在其中失败。
以下是我在后台脚本中的代码:
iterator=0;
chrome.tabs.query({},function(tabs){
for(var i=0; i<tabs.length; i=i+1){
chrome.tabs.executeScript(tabs[i].id,{file: 'createBanner.js'});
}
for (var i=0; i<tabs.length; i=i+1){
chrome.tabs.sendMessage(tabs[i].id,{
action: "currentPicNumber",picNumber: iterator
});
}
});
在我的内容脚本(createBanner.js)中,我有:
chrome.runtime.onMessage.addListener(function(request,response,sendResponse){
if(request.action=="currentPicNumber"){
console.log(request.picNumber.toString());
}
});
当我运行它时,控制台没有显示任何内容。我希望能够在createBanner.js和我的后台脚本之间来回发送消息。
请帮助谢谢
答案 0 :(得分:1)
chrome.tabs.executeScript
是异步的。在调用sendMessage
时,脚本尚未准备好接收它。
您可以为executeScript
指定一个回调,该回调仅在注入JavaScript执行后运行(即处理程序已注册)。为了使clojure正常工作,我使用了一个返回回调函数的高阶函数messageCallback
。
因此,您的代码将如下所示:
function messageCallback(tabId, picNumber){
return function(){
chrome.tabs.sendMessage(
tabId,
{action: "currentPicNumber", picNumber: picNumber}
);
};
}
chrome.browserAction.onClicked.addListener( function(){
chrome.tabs.query({},function(tabs){
for(i in tabs){
chrome.tabs.executeScript(
tabs[i].id,
{file: 'createBanner.js'},
messageCallback(tabs[i].id, iterator)
);
}
});
});
答案 1 :(得分:0)
manifest.json
看起来像什么?是否在content_scripts
中列出了createBanner.js?如果是这样,您将能够在每个页面上执行它,而无需为每个选项卡手动注入executeScript
。
例如(在清单中)
"content_scripts": [
{
"matches": ["http://*/*", "https://*/*"],
"js": ["createBanner.js"]
}
]