Chrome / Firefox 扩展 - 内容脚本不监听消息

Chrome / Firefox extension - Content script not listening for messages

我正在为 Chrome 和 Firefox 开发一个扩展,但我遇到了一个问题。

基本上,我正在尝试使用 chrome.runtime.onMessage.addListener(...) 获取内容脚本来收听消息,但它似乎不起作用。

我通过从内容脚本发送消息来测试它。后台脚本 (ml.js) 有一个工作正常的侦听器,但内容脚本中的 lsitener 只是没有收到消息。

您可以在this Gist(或以下)中查看代码。

manifest.json:

{
    "manifest_version": 2,
    "name": "Messaging Extension",
    "version": "1.0.0",
    "background": {
        "scripts": ["ml.js"]
    },
    "content_scripts": [
        {
            "matches": ["*://*.google.co.uk/*"],
            "js": ["cs.js"],
            "run_at": "document_end"
        }
    ]
}

ml.js:

// When receive message...
chrome.runtime.onMessage.addListener(function(message) {
    if (message.key) {
        console.log('ML: First message received')
        // Send another message
        chrome.runtime.sendMessage({
            'foo': 'bar'
        })
    }
})

cs.js:

// Send message to ml.js
chrome.runtime.sendMessage({
    'key': 'value'
})
chrome.runtime.onMessage.addListener(function(message) {
    console.log('CS: Second message received')
})

在 Firefox 中测试时(通过在 about:debugging 加载附加组件然后访问 Google),cs.js 发送了消息,ml.js 记录了消息到控制台,但是 cs.js 没有记录消息。

非常感谢您的帮助,谢谢!

使用 runtime.sendMessage()(消息 后台脚本):

runtime.sendMessage() (Chrome/Firefox) method is used to send messages to scripts that are running in the background context (background scripts, popup scripts, etc). Even when it is used to send messages from a script that is in the background context (e.g. to ),它将被其他当前正在监听的后台上下文脚本接收,而不是发送它的脚本。

引用Google Chrome runtime.sendMessage() documentation(强调我的):

If sending to your extension, the runtime.onMessage event will be fired in every frame of your extension (except for the sender's frame)...

正在向您的内容脚本发送消息(tabs.sendMessage())

如果您想从后台脚本向内容脚本发送消息,您应该使用 tabs.sendMessage() (Chrome/Firefox). Alternately, you can use the connect() methods in runtime and tabs, which then provide you with a port (Chrome/Firefox)。

参考文献: