这是我的后台脚本。我可以通过弹出脚本向它发送消息。换句话说,控制台记录"你好"在后台页面。
// background.js
chrome.runtime.onConnect.addListener(function(port){
port.onMessage.addListener(function(msg) {
if (msg.greeting == "hello") {
var port = chrome.tabs.connect(0, {name: "mycontentscript"});
port.postMessage({greeting:"hello"});
console.log('hello');
}
});
});
但是,我无法从后台脚本获取消息到我的内容脚本。这是我的内容脚本。警报未显示。
// content.js
var port = chrome.runtime.connect({name:"mycontentscript"});
port.onMessage.addListener(function(message,sender){
if (message.greeting == "hello") {
alert('hello');
}
});
我做错了什么?感谢。
答案 0 :(得分:2)
在创建端口后,您似乎忘记了在内容脚本中建立连接,只是postMessage
,并在后台页面的runtime.onConnect.addListener()
中重用该端口。
background.js
chrome.runtime.onConnect.addListener(function(port) {
port.onMessage.addListener(function(msg) {
if (msg.greeting == "hello") {
port.postMessage({ greeting: "hello" });
console.log('hello');
}
});
});
content.js
var port = chrome.runtime.connect({ name: "mycontentscript" });
port.postMessage({greeting: "hello"});
port.onMessage.addListener(function(message) {
if (message.greeting == "hello") {
alert('hello');
}
});
答案 1 :(得分:0)
我不知道我的情况是否与您的情况完全一样,但我还写了一个Chrome扩展程序,其中后台页面向客户端发送消息。
在我的content script中,我执行以下操作:
chrome.runtime.sendMessage('requestData', this.updateData.bind(this));
在我的background script中,我有:
chrome.runtime.onMessage.addListener(function (msg, sender, sendResponse) {
sendResponse({
messages : inboxMessages,
userId : user_id
});
});
然后我的内容脚本收到消息:
this.updateData = function(data) {
//...
}
希望对你有帮助!
答案 2 :(得分:0)
在background.js中:
chrome.runtime.onConnect.addListener(function(port){//here you've got the port
port.onMessage.addListener(function(msg) {
if (msg.greeting == "hello") {
//and here you're making a new, unneeded port, for which nobody is listening.
//Use the one you've got.
var port = chrome.tabs.connect(0, {name: "mycontentscript"});
port.postMessage({greeting:"hello"});
console.log('hello');
}
});
});
使用chrome.tabs.connect从后台启动连接,并将chrome.runtime.onConnect侦听器放在选项卡的content.js中,或者像使用的那样从选项卡启动连接,并使用在background的onConnect侦听器。只需删除
即可 var port=chrome.tabs.connect(0, {name: "mycontentscript});
线。