Chrome扩展程序sendMessage错误从内容脚本到背景html

时间:2013-04-08 20:18:31

标签: google-chrome-extension

我刚刚将我的chrome扩展程序更新为json版本2,并且我正在尝试让我的扩展程序再次运行。问题是sendRequest一路贬值。所以我将https://developer.chrome.com/extensions/messaging.html中的代码复制到我的脚本中并将其修改为我自己的变量名称,但它不起作用。

然后我回去并输入原始代码,它仍然无效。我已经阅读了多个相似的问题[并希望这不会被复制,因为它们都不是我的情况]。

的manifest.json:

{
   "background": {
        "page": "background.html"
        },
    ... ... ...
   "content_scripts": [ {
      "css": [ "style.css" ],
      "js": [ "jq.js", "script.js" ],
      "matches": [ "http://*.craigslist.org/*/*.htm*" ]
   } ],
   ... ... ...
   "permissions": [ "tabs", "http://*.craigslist.org/*/*.htm*" ],
   "manifest_version": 2,
   "update_url": "http://clients2.google.com/service/update2/crx",
   "version": "3.0"
}

background.html:

<html>
<script type='text/javascript'>
   chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    console.log(sender.tab ?
                "from a content script:" + sender.tab.url :
                "from the extension");
    if (request.greeting == "hello")
      sendResponse({farewell: "goodbye"});
  });
    });
</script>
</html>

的script.js:

chrome.runtime.sendMessage({greeting: "hello"}, function(response) {
  console.log(response.farewell);
});

现在我在[craigslist]上运行一个页面,然后转到控制台,这就是错误:

Port error: Could not establish connection. Receiving end does not exist.
TypeError: Cannot read property 'farewell' of undefined
    at chrome-extension://dhmjefbokfkjpdbigkadjpgjeflchgea/script.js:9:23

我在Ubuntu 12.10 64位上使用Chrome测试版(Google Chrome:27.0.1453.15(官方版本191758)测试版)

2 个答案:

答案 0 :(得分:31)

您正在从后台和内容脚本发送消息,但根本不尝试接收消息。尝试在其中一个或两个地方收听消息。此外,内联代码为against the CSP,因此将其全部移至外部文件。

例如:

<强>的manifest.json

"background": {
    "scripts": ["background.js"]
},

<强> background.js

chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
  sendResponse({farewell:"goodbye"});
});

<强>的script.js

chrome.runtime.sendMessage({greeting: "hello"}, function(response) {
  console.log(response.farewell);
});

此外,chrome.tabs.getSelected()也已弃用,因此请改用chrome.tabs.query()

答案 1 :(得分:0)

后台脚本

chrome.tabs.getAllInWindow(null, function(tabs) {
      $.each(tabs, function() {
        chrome.tabs.sendRequest(this.id, {"action":"action_name"} );
      });
    });

内容脚本

chrome.extension.onRequest.addListener(function(request, sender, sendResponse){
  if(request.action === 'action_name')
  {
    alert('handle event in the content script!!!!')
  }
});