在Chrome扩展程序中向内容脚本发送消息

时间:2014-04-12 16:41:03

标签: javascript jquery google-chrome-extension

我正在尝试将我的后台脚本中的消息发送到内容脚本并在其中失败。

以下是我在后台脚本中的代码:

    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和我的后台脚本之间来回发送消息。

请帮助谢谢

2 个答案:

答案 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"]
}
]