1

我想在所有标签中显示一条消息。所以我为此使用 sharedWorker :

//sharedworker

var worker = new SharedWorker('/js/realtime.js');
worker.port.addEventListener("message", function(e) {
    alert(e.data);
}, false);

worker.port.start();

// post a message to the shared web worker
worker.port.postMessage("name");

和 realtime.js:

var connections = 0; // count active connections

self.addEventListener("connect", function (e) {

    var port = e.ports[0];
    connections++;

    port.addEventListener("message", function (e) {
        port.postMessage("Hello " + e.data + " (port #" + connections + ")");
    }, true);

    port.start();

}, true);

我想在浏览器的所有选项卡中看到警报,但它只有一个……有什么想法吗?

4

2 回答 2

2

您的port变量指的是单个选项卡。每次“连接”事件触发时,您都会将另一个端口连接到另一个选项卡。因此,如果要向所有选项卡发送消息,则需要存储所有端口,然后将消息发送给所有选项卡。像这样的东西:

const ports = [];

self.addEventListener("connect", function (e) {
    ports.push(e.ports[0]);

    port.addEventListener("message", function (e) {
        for (var i = 0; i < ports.length; i++) {
            ports[i].postMessage("Hello " + e.data + " (port #" + i + ")");
        }
    }, true);

    port.start();

}, true);

或者,我编写了一个库,可让您轻松地在共享工作人员和选项卡之间发送消息 - 将消息直接发送到一个选项卡,或广播到所有连接的选项卡。

于 2019-05-27T15:19:39.590 回答
0

最新消息,可以使用SharedWorker中的BroadcastChannel来实现

于 2021-09-01T09:33:33.013 回答