Межстраничное общение в WWW?
Есть ли способ сделать межпроцессное взаимодействие на стороне клиента между несколькими веб-страницами в JavaScript? В идеале я хотел бы выполнить это без какого-либо сложного обновления состояния сервера, проверки связи и т. Д. И заставить его работать исключительно на клиенте. Если бы я мог сделать этот кросс-браузер, я был бы на небесах, ха-ха. Есть идеи? Спасибо!
2 ответа
Есть много способов сделать межоконный обмен информацией. Это Window.postMessage, Local Storage, WebRTC и в настоящее время Shared Web Workers.
У каждого из них есть свои преимущества / недостатки:
- Локальное хранилище работает только на страницах того же источника (источник - протокол:// сайт: порт). Он также передает сообщение каждому открытому окну того же источника, поэтому он медленный, если у вас открыто много страниц. К сожалению, это единственная технология с несколькими окнами, поддерживаемая в IE11 и ниже.
- Совместно используемые работники поддерживаются только в Chrome и Firefox (и также поддерживаются только источники одного и того же файла, а файл worker.js должен загружаться из одного источника). Вы также должны "ретранслировать" трафик связи с одной страницы на другую.
- Window.postMessage работает только между родительскими / дочерними окнами, но поддерживает перекрестное происхождение!
Взаимодействие между двумя независимыми веб-сайтами действительно неуклюже. Вы должны либо выполнить window.open() с первого веб-сайта и использовать postMessage для взаимодействия со вторым веб-сайтом, либо настроить эту сложную архитектуру, в которой вы используете скрытые фреймы на каждом сайте для общения с размещенной веб-страницей. на тот же адрес веб-сайта, и эти iframes затем общаются друг с другом через локальное хранилище или Shared Worker. Это называется "узлом связи". (Довольно сложно, правда?)
Хуже всего то, что межстраничное общение было расценено как уязвимость безопасности и в значительной степени избегалось. Если бы у некоторых был свой путь, я думаю, что postMessage из разных источников будет удален. То, что я хотел бы видеть, - это некоторые усовершенствования протокола и некоторые oAuth-подобные методы, созданные для того, чтобы мы могли защитить эту технику и сделать ее разумной. В будущем будет много движения данных к клиенту, и разделение их между веб-страницами станет критическим.
Тем не менее, не переделывать колесо. Есть несколько библиотек, которые делают возможными межоконные коммуникации.
- Endpoint.js - разработанная мной библиотека (заявление об отказе от ответственности), которая обеспечивает связь между окнами (с несколькими источниками), вкладками, веб-работниками, клиент-сервером, а также IPC между процессами. Это также создает специальную оверлейную сеть, которая позволяет всем этим методам передавать информацию друг другу.
- crosstab - реализует описанный выше подход "концентратор связи".
- ozp-iwc - платформа IPC от OZone Widget Framework. Включает локальное хранилище и PostMessage
Попробуйте этот код для автора сообщения
function sendMessage(name, value) {
var expires = "";
document.cookie = name + "=" + value + expires + "; path=/";
}
sendMessage("test", "hello world!")
Откройте второе окно и попробуйте прослушивание этого сообщения
function getMessage(c_name) {
if (document.cookie.length > 0) {
c_start = document.cookie.indexOf(c_name + "=");
if (c_start != -1) {
c_start = c_start + c_name.length + 1;
c_end = document.cookie.indexOf(";", c_start);
if (c_end == -1) {
c_end = document.cookie.length;
}
return unescape(document.cookie.substring(c_start, c_end));
}
}
return "";
}
function check() {
var message = getMessage('test');
var element = document.getElementById('output');
element.innerHTML = message;
}
window.setInterval(check, 1000);
Он отлично работает на Chrome, вы также должны убедиться, что он работает в других основных браузерах, особенно в IE