Отправка сообщения во все открытые окна / вкладки с помощью JavaScript [дублировать]
-
11-09-2019 - |
Вопрос
На этот вопрос уже есть ответ здесь:
- Связь между вкладками или окнами 9 ответов
Я слышал, что HTML5 имеет window.postMessage()
, но, похоже, для этого требуется наличие дескриптора в окне (или вкладке, на протяжении всего этого вопроса), в которое вы отправляете сообщение.Что делать, если я хочу транслировать во все открытые окна?Возможно ли это?
(Что я пытаюсь сделать, так это предупреждать другие окна без каких-либо обходов сервера, когда пользователь делает что-то в одном окне, что влияет на другие, чтобы они могли обновлять свой контент.Однако, хотя некоторые окна могут быть открыты из существующих, что позволяет мне перехватывать и сохранять ссылки на них, некоторые новые окна могут быть открыты пользователем вручную, а затем выбрана закладка или введен URL-адрес.В этом случае, похоже, не существует способа перехватывать и сохранять ссылки.)
Решение
ИМО, это невозможно с помощью postMessage.Как насчет использования Хранилище сеансовЛокальное хранилище?Запись в него должна сгенерировать событие storage, которое должно быть распространено на все окна, совместно использующие одно и то же хранилище сеансов.
Другие советы
Я написал библиотеку именно для этого: 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.
Я рекомендую использовать https://github.com/studentIvan/dueljs Краткий обзор: http://dueljs.studentivan.ru и документы: https://dueljs.readthedocs.org/en/latest/