Показать сообщение с помощью sharedWorker во всех вкладках
Я хотел бы показать во всех вкладках сообщение. Поэтому я использую 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);
Я хотел бы видеть предупреждение на всех вкладках моего браузера, но оно есть только в одной... какие-нибудь идеи?
2 ответа
Твой 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);
В качестве альтернативы я написал библиотеку, которая позволяет легко отправлять сообщения между общим рабочим и вкладками - либо отправляя сообщение непосредственно на одну вкладку, либо транслируя на все подключенные вкладки.
Последние новости, вы можете использовать BroadcastChannel в SharedWorker для достижения