показать сообщение с помощью sharedWorker во всех вкладках - PullRequest
0 голосов
/ 27 июня 2018

Я хотел бы показать во всех вкладках сообщение. Поэтому я использую 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);

Я бы хотел видеть предупреждение на всех вкладках моего браузера, но оно есть только в одной ... какие-нибудь идеи?

1 Ответ

0 голосов
/ 27 мая 2019

Ваша переменная port относится к одной вкладке. Каждый раз, когда происходит событие «connect», вы подключаете другой порт к другой вкладке. Поэтому, если вы хотите отправить сообщение на все вкладки, вам нужно сохранить все порты, а затем отправить сообщение всем им. Как то так:

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);

В качестве альтернативы, Я написал библиотеку , которая позволяет легко отправлять сообщения между общим рабочим и вкладками - либо отправка сообщения непосредственно на одну вкладку, либо трансляция на все подключенные вкладки.

...