У меня есть требование об обмене сообщениями из веб-сокета между междоменными вкладками. Поэтому я установил iframe в каждой вкладке, которая прослушивает событие localalstorage. Когда главная вкладка получает сообщение веб-сокета, установите сообщение в localalstorage, а затем другие вкладки или называемые подчиненные вкладки получат событие localalstorage, которое вызовет некоторую реакцию на странице. Это хорошо работает в Chrome, но я столкнулся с проблемой в Edge и IE11. По какой-то причине я надеюсь сохранить все сообщения, поэтому ключи этих сообщений похожи на '__message_ [random UUID]'. В Edge и IE11 ведомые вкладки могут получить ключ события и сообщения, но значение сообщения обычно равно нулю.
Вот код в iframe.
window.addEventListener("message", function(e){
}
if(e.data.type === 'ws-message') {
var messageId_ = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0,
v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
localstorage.setItem('__message_'+messageId_ , JSON.stringify({topic: e.data.topic, message: e.data.message}));
}
})
и где прослушать событие:
window.addEventListener("storage", function(e){
if(e.key.indexOf('__message_') === 0 && e.newValue !== null && __node_id__ !== __master_tab__){
window.parent.postMessage({type: 'ws-message', message: JSON.parse(localstorage.getItem(e.key))}, '*');
}
})
Здесь я могу получить e.key
, но localstorage.getItem(e.key)
будет нулевым.
Сначала я думаю, что есть некоторая задержка, но когда я установил таймаут в событии прослушивания, ничего не изменилось.
PS: плотность приема сообщений Websocket выше, может быть в этом причина?