Javascript 将消息发送到Chrome扩展中的内容脚本

Javascript 将消息发送到Chrome扩展中的内容脚本,javascript,jquery,google-chrome-extension,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;

我试图将一条消息从后台脚本发送到内容脚本,但失败了

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

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


请帮我谢谢你

你的
manifest.json是什么样子的?createBanner.js是否列在
content\u脚本中?如果是这样,您将能够在每个页面上执行它,而无需为每个选项卡手动注入
executeScript
。 e、 g.(舱单中)


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)
            );
        }
    });
});

这不起作用,因为回调是在所有javascript执行之后执行的。这是我在运行此TypeError后遇到的错误:无法读取的属性“id”undefined@user3450622给我一点时间test@user3450622这对我很有效,但不是我想要的方式。我不及格!我将更新代码。@user3450622,我已经修复了。
"content_scripts": [
{
  "matches": ["http://*/*", "https://*/*"],
  "js": ["createBanner.js"]
}
]
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)
            );
        }
    });
});