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)。
参考文献:
- Message Passing (Chrome)
- Communicating with background scripts(火狐)
我正在为 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)。
参考文献:
- Message Passing (Chrome)
- Communicating with background scripts(火狐)