我正在开发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
将消息记录到控制台,但是{{1}没有记录消息。
我会感谢一些帮助,谢谢!
答案 0 :(得分:4)
runtime.sendMessage()
(消息到后台脚本): runtime.sendMessage()
(Chrome / Firefox)方法用于将消息发送到在后台上下文中运行的脚本(后台脚本,弹出脚本等)。即使它用于从后台上下文中的脚本发送消息(例如,到communicate between a popup script and a background script),它也会被其他当前正在侦听的后台上下文脚本接收,但不会被发送它的脚本接收。
引用Google Chrome runtime.sendMessage()
documentation(强调我的):
如果发送到您的分机,
runtime.onMessage
活动将在您分机的每一帧中被触发(发件人的框架除外)...
tabs.sendMessage()
)如果您要将后台脚本中的消息发送到内容脚本,则应使用tabs.sendMessage()
(Chrome / Firefox)。或者,您可以使用connect()
和runtime
中的tabs
方法,然后为您提供端口(Chrome / Firefox)。
参考文献: