如何使用runtime.connect和从background.js向所有内容脚本发送消息 postMessage用于长期连接。
chrome文档说明了这个
chrome.runtime.onConnect.addListener(function(port) {
console.assert(port.name == "knockknock");
port.onMessage.addListener(function(msg) {
if (msg.joke == "Knock knock")
port.postMessage({question: "Who's there?"});
else if (msg.answer == "Madame")
port.postMessage({question: "Madame who?"});
else if (msg.answer == "Madame... Bovary")
port.postMessage({question: "I don't get it."});
});
});
它会向所有content_script发送消息吗? 我在某处读到所有内容脚本通过唯一端口连接到扩展,我只是混淆了如何向所有content_script发送消息
答案 0 :(得分:1)
正如评论中提到的devnull69,要向所有已打开的端口发送消息,您需要跟踪它们。
但使用阵列会有点问题。如何删除断开连接的端口?
我发现这个问题很有趣,并编写了这段代码:
var openPorts = ( function() {
var index = 0;
var ports = {};
var op = {
getPorts: function() {
var result = {};
for(var id in ports){
result[id] = ports[id];
}
return result;
},
getPortsArray: function() {
var result = [];
for(var id in ports){
result.push(ports[id]);
}
return result;
},
get: function(id) {
return ports[id];
},
add: function(port) {
var id = index;
ports[id] = port;
port.onDisconnect.addListener(function() {
op.remove(id);
});
index++;
return id;
},
remove: function(id) {
delete ports[id];
},
messageAll: function(message) {
for(var id in ports){
ports[id].postMessage(message);
}
}
};
return op;
})();
这是一个可以使用增量ID存储端口的对象,例如push for a array,一旦onDisconnect
被触发,它们就会自动被删除。
您可以多次添加端口,并且所有方法都将返回重复项,但同一端口的所有记录都将被删除,因为onDisconnect
事件将调用所有删除侦听器。最好保持记录的独特性。
openPorts.add(port)
- 添加端口的函数,将返回其记录ID
在openPorts
内。openPorts.get(id)
- 用于通过记录ID获取Port对象的函数。openPorts.remove(id)
- 通过id手动删除端口记录的功能;将不会关闭该端口openPorts.getPorts()
- 按记录ID openPorts.getPortsArray()
- 返回一个包含所有开放端口的数组,如果有人想要迭代它们。openPorts.messageAll(message)
- 向openPorts
使用示例:
chrome.runtime.onConnect.addListener( function(port) { openPorts.add(port); } );
// ...
openPorts.messageAll({hello: "world"});