Синхронное сообщение от локального хранилища потеряно в IE11 - PullRequest
0 голосов
/ 04 июля 2019

У меня есть требование об обмене сообщениями из веб-сокета между междоменными вкладками. Поэтому я установил 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 выше, может быть в этом причина?

1 Ответ

0 голосов
/ 04 июля 2019

Я просто нахожу некоторые подсказки. Когда я оставляю uuid для каждого сообщения, что означает, что все сообщения имеют один и тот же ключ __message_, и каждый раз, когда приходит новое сообщение, я изменяю значение вместо сохранения его как нового, тогда оно работает хорошо. Так что я думаю, что большое количество сообщений вызывает проблему, упомянутую выше.

...