Отправка сообщения всем открытым окнам/вкладкам с использованием JavaScript

Я слышал, что HTML5 имеет window.postMessage(), но, похоже, для этого требуется наличие дескриптора в окне (или вкладке, по всему этому вопросу). Что делать, если я хочу транслировать все открытые окна? Возможно ли это?

(То, что я пытаюсь сделать, - это предупредить другие окна без каких-либо обходов сервера, когда пользователь делает что-то в одном окне, которое влияет на других, чтобы они могли обновлять свой контент. Однако, хотя некоторые окна могут быть открыты из существующих - позволяя мне перехватывать и хранить ссылки на них - некоторые свежие окна могут открываться вручную пользователем, а затем выбранная закладка или URL-адрес. В этом случае, похоже, не существует способа перехвата и хранить ссылки.)

Ответ 1

IMO это невозможно, используя postMessage. Как насчет использования sessionStorage localStorage? Запись на него должна генерировать событие хранения, которое должно распространяться на все окна, использующие одно и то же хранилище сеансов.

Ответ 2

Я написал библиотеку, чтобы сделать это: intercom.js (по тем же причинам, которые вы указали).

В настоящее время мы используем его для трансляции уведомлений обо всех окнах, поэтому только одно окно должно поддерживать подключение сокета к серверу. Как некоторые другие предложили, он использует localStorage API.

Использование действительно просто:

var intercom = Intercom.getInstance();

$('a').on('click', function() {
     intercom.emit('notice', {message: 'Something just happened!');
});

Чтобы поймать сообщение,

intercom.on('notice', function(notice) {
    console.log(notice.message);
});

Интерфейс предназначен для имитации socket.io.