如何使用runtime.connect将消息从background.js发送到所有内容脚本

时间:2014-05-15 09:32:23

标签: google-chrome-extension

如何使用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发送消息

1 个答案:

答案 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"});