Google chrome extension chrome.runtime.sendMessage未按预期工作

Google chrome extension chrome.runtime.sendMessage未按预期工作,google-chrome-extension,chromium,Google Chrome Extension,Chromium,我正在编写一个包含内容脚本和背景脚本的Chrome插件,我正在尝试让两者进行交流 在我的内容脚本中,我正在 chrome.runtime.sendMessage({greeting: "hello"}, function(response) { console.log(response.farewell); }); 在我的背景脚本中,我正在做 chrome.runtime.onMessage.addListener( function(request, sender, se

我正在编写一个包含内容脚本和背景脚本的Chrome插件,我正在尝试让两者进行交流

在我的内容脚本中,我正在

chrome.runtime.sendMessage({greeting: "hello"}, function(response) {
      console.log(response.farewell);
});
在我的背景脚本中,我正在做

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"});
    }
);
我的清单如下所示:

{
    "manifest_version": 2,
    "name": "Tesing Phase",
    "version": "1.0",
    "background": {
        "persistent": false,
        "scripts": ["bgscript.js"]
    },
    "content_scripts": [{
        "js": ["contentscript.js"],
        "all_frames": true,
        "run_at" : "document_start",
        "matches": ["*://*/*"]
    }],
    "web_accessible_resources": ["script.js"]
}
当我运行插件时,出现以下错误:

Uncaught TypeError: Object #<Object> has no method 'sendMessage' 
UncaughtTypeError:对象#没有方法“sendMessage”
我试着记录
chrome.runtime
,但没有方法
sendMessage
。我在Ubuntu上使用的是Chromium的25.0版。我也尝试过使用
sendRequest
,但它说它被贬低了,应该使用
sendMessage

有人能指出我在这里遗漏了什么吗?是否需要任何权限才能工作?

/(以及其他相关事件/方法,如)在Chrome 26中引入

如果您想编写一个与Chrome 20-25兼容的扩展,请使用
Chrome.extension.sendMessage

实现最佳兼容性的一种方法是自己定义
chrome.runtime
方法。例如,在其余代码(背景/内容脚本)之前运行以下代码:

if(!chrome.runtime){
//铬20-21
chrome.runtime=chrome.extension;
}else如果(!chrome.runtime.onMessage){
//铬22-25
chrome.runtime.onMessage=chrome.extension.onMessage;
chrome.runtime.sendMessage=chrome.extension.sendMessage;
chrome.runtime.onConnect=chrome.extension.onConnect;
chrome.runtime.connect=chrome.extension.connect;
}
然后您可以使用最新的API格式:

//绑定事件:
chrome.runtime.onMessage.addListener(函数(message、sender、sendResponse){
//做点什么
});
//发送消息:
chrome.runtime.sendMessage({问候语:'hello'});
如果您对修改
chrome.runtime
对象上的方法感到不舒服,可以使用以下方法:

var runtimeOrExtension=chrome.runtime&&chrome.runtime.sendMessage?
'运行时':'扩展';
//绑定事件:
chrome[runtimeOrExtension].onMessage.addListener(
功能(消息、发送者、sendResponse){
//做点什么
});
//发送消息:
chrome[runtimeOrExtension].sendMessage({问候语:'你好'});

非常感谢。它使用chrome.extension有效。我认为google chrome dev页面中缺少此信息。这看起来很好,但这种方法对chrome 31以下的版本仍然有效吗?还是需要进行调整?有人知道旧的不推荐的消息传递方法是否已经从最新版本的中完全删除了吗chrome@user280109它仍然有效。尽管你也可以只使用
chrome.runtime.
而不使用任何兼容层,因为几乎没有人使用chrome25-这要感谢谷歌的自动更新程序了。@robw谢谢你。顺便说一句,我发现一些用户仍然在使用chrome25,因为一些linux发行版的存储库中最多只有chromium25,我知道这是一种边缘情况,但我想还是需要考虑一下。对于linux,我认为在使用存储库时,自动更新不是那么自动。@user280109否。
onRequest
/
sendRequest
在Chrome19和更早版本中使用过。有关详细信息,请参阅。