2014-04-12 138 views
0

我试图从我的后台脚本发送消息到内容脚本并失败。发送消息到Chrome扩展中的内容脚本

这是我在后台脚本代码:

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

什么是你manifest.json样子?是在content_scripts中列出的createBanner.js?如果是这样,您将能够在每个页面上执行它,而无需为每个选项卡手动插入executeScript。 例如(在清单中)

"content_scripts": [ 
{ 
    "matches": ["http://*/*", "https://*/*"], 
    "js": ["createBanner.js"] 
} 
] 
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) 
      ); 
     } 
    }); 
}); 
+0

因为所有的JavaScript已被执行之后回调执行不起作用。这是我运行后得到的错误 TypeError:无法读取未定义的属性“ID” –

+0

@ user3450622给我第二个测试 – Xan

+0

@ user3450622它适用于我,但不以我想要的方式。我在关闭时失败!我会更新代码。 – Xan

相关问题