chrome.runtime.sendMessage无法按预期工作

Jib*_*ose 13 chromium google-chrome-extension

我正在编写一个带有内容脚本和后台脚本的Chrome插件,我正在尝试让两者进行通信.

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

chrome.runtime.sendMessage({greeting: "hello"}, function(response) {
      console.log(response.farewell);
});
Run Code Online (Sandbox Code Playgroud)

在我的后台脚本中,我正在做

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"});
    }
);
Run Code Online (Sandbox Code Playgroud)

我的清单看起来像这样:

{
    "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"]
}
Run Code Online (Sandbox Code Playgroud)

当我运行我的插件时,我收到以下错误:

Uncaught TypeError: Object #<Object> has no method 'sendMessage' 
Run Code Online (Sandbox Code Playgroud)

我尝试记录chrome.runtime,没有方法sendMessage.我在Ubuntu上使用Chromium 25.0版.我也试过使用sendRequest,但它说它已经折旧了,sendMessage应该使用.

谁能指出我在这里缺少的东西?是否需要任何权限才能工作?

Rob*_*b W 34

chrome.runtime.sendMessage/ onMessage(和其他相关事件/方法,如connect)在Chrome 26中引入.

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

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

if (!chrome.runtime) {
    // Chrome 20-21
    chrome.runtime = chrome.extension;
} else if(!chrome.runtime.onMessage) {
    // Chrome 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;
}
Run Code Online (Sandbox Code Playgroud)

然后您可以使用最新的API格式:

// Bind event:
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
    // Do something
});

// Send message:
chrome.runtime.sendMessage({greeting: 'hello'});
Run Code Online (Sandbox Code Playgroud)

如果你觉得不舒服与上修改方法chrome.runtime的对象,你可以用下面的办法,而不是:

var runtimeOrExtension = chrome.runtime && chrome.runtime.sendMessage ?
                         'runtime' : 'extension';

// Bind event:
chrome[runtimeOrExtension].onMessage.addListener(
  function(message, sender, sendResponse) {
    // Do something
});

// Send message:
chrome[runtimeOrExtension].sendMessage({greeting: 'hello'});
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢.它使用chrome.extension.I认为谷歌chrome开发页面中缺少此信息. (2认同)