Моя веб-страница
var bc = new BroadcastChannel('Consumer');
bc.onmessage = function(event) {
alert("a");
}
bc.postMessage("hello");
Он передает сообщение, и страница также требуется для получения того же сообщения.
Однако это не сработает. Я что-то пропустил?
Вы можете создать два экземпляра BroadcastChannel на своей странице. Можно использовать в качестве вещателя для сообщений, а другой - для приема сообщений.
var broadcaster = new BroadcastChannel('Consumer');
var messageReceiver= new BroadcastChannel('Consumer');
messageReceiver.onmessage = function(event) {
alert(event.data);
}
broadcaster.postMessage("hello");
См. Это в действии: https://jsfiddle.net/h56d3y27/
Или завернутый в класс многократного использования: (примечание: класс не поддерживается всеми браузерами. См. Https://caniuse.com/#search=class для совместимости браузера)
class AllInclusiveBroadcaster {
constructor(listener, channelName) {
if (!channelName) channelName = "channel";
this.broadcaster = new BroadcastChannel(channelName);
this.messageReceiver = new BroadcastChannel(channelName);
this.messageReceiver.onmessage = (event) => {
listener(event.data);
}
}
postmessage(data) {
this.broadcaster.postMessage(data);
}
}
var broadcaster = new AllInclusiveBroadcaster((data) => alert(data));
broadcaster.postmessage("Hello BroadcastChannel");
См. Также в действии JSFiddle
Вы можете отправить событие (назовите его как угодно), например, с документами, с теми же data
... затем у вас есть один обработчик, который прослушивает сообщения BroadcastChannel и имя события, которое вы создали выше
в следующем, код создает и прослушивает fakeBroadcastMessage
создала функцию для отправки сообщения bc и "локального" сообщения
var bc = new BroadcastChannel('Consumer');
function handleBroadcastMessage(event) {
// do things here
}
bc.addEventHandler('message', handleBroadcastMessage);
document.addEventListener('fakeBroadcastMessage', handleBroadcastMessage);
function sendMessage(data) {
bc.postMessage(data);
var ev = new Event('fakeBroadcastMessage');
ev.data = data;
document.dispatchEvent(ev);
}
sendMessage('hello');
@Gqqnbig Я протестировал с вашим предложением создать 2 объекта, но я нашел 1 ограничение в вашем предложении. Когда мы открываем другую вкладку, она вызывает onmessage дважды на каждой вкладке.