Javascript-форум (https://javascript.ru/forum/)
-   Internet Explorer (https://javascript.ru/forum/css-html-internet-explorer/)
-   -   IE cross-window cross-domain messaging (https://javascript.ru/forum/css-html-internet-explorer/56872-ie-cross-window-cross-domain-messaging.html)

Octane 07.07.2015 20:09

IE cross-window cross-domain messaging
 
Реально ли организовать обмен сообщениями между окнами с разных доменов в IE?

Deff 07.07.2015 20:19

Octane,
Ну древний как мир кроссбраузерный метод - во фрейме создаем фрейм с домена с главной страницы и всовывая данные в window.name(Ну или динамически через hash ссылки )

Созданный внутренний фрейм по загрузке отдаёт данные на главную.

http://javascript.ru/ajax/cross-domain-scripting
Есть старый фреймворк dojo для кроссдомена

Octane 07.07.2015 23:29

Пришел к такому решению:
  • site1.com открывает в iframe статичный файл site2.com/proxy.html
  • site1.com выполняет iframe.contentWindow.postMessage('open: site2.com', '*')
  • proxy.html в ответ на это сообщение выполняет win = window.open('site2.com')
  • proxy.html создает функцию win.crossPostMessage = function(data) { parent.postMessage(data, '*') }
  • site2.com выполняет window.crossPostMessage('json')
  • site1.com получает сообщение json

Deff 08.07.2015 00:04

Octane,
Ну по идее, если флеш допустим, проще всего кроссобмен через флеш куки используя тот же dojo,
не нужны костыли вспомогательной страницы
==========================
Для перспективы, удобнее создать страницу на неком третьем домене на постоянной основе
со скриптом записи/cчитывания данных в localStorage по хешу ссылки (Возвращает данные через тот же хеш)
Для больших объемов данных(максимальный размер хеша ~ 2Кb) предусматриваем концевой спец. символ продолжения приема/передачи (достаточно просто, если использовать кодирование URIcomponent)

Octane 08.07.2015 02:41

Очень не хочется флеш :(

Мой вариант фигня, потому что window.open выполняется не в trusted event…
Хотя можно попробовать позиционировать iframe над кнопкой и по клику открывать окно.

Octane 08.07.2015 03:42

Цитата:

Сообщение от Deff
Для перспективы, удобнее создать страницу на неком третьем домене на постоянной основе
со скриптом записи/cчитывания данных в localStorage по хешу ссылки (Возвращает данные через тот же хеш)

В теории я себе это так представил:
- site1.com открывает в iframe1 site1.com/proxy.html
- site1.com открывает site2.com
- site2.com открывает в iframe2 site1.com/proxy.html
- site2.com выполняет iframe2.contentWindow.postMessage('json', '*');
- iframe2 получает сообщение json
- iframe2 записывает это сообщение в localStorage
- iframe1 получает сообщение json по событию storage
- iframe1 выполняет parent.postMessage(json, '*')
- site1.com получает сообщение json

Завтра попробую работоспособность.

Deff 08.07.2015 05:20

Ну по идее есть ещё событие смены хеш внутри фрейма для отслеживания начала передачи,
или старый метод, использования трех хешей:
#start, #data+данные, #stop;
В фрейме ставят два div #start и #stop разнесённые по высоте, отслеживаем onscroll при начале - конце посылки

Octane 08.07.2015 13:27

чет не догоню про хэши фреймов, как это между окнами использовать

Deff 08.07.2015 16:07

Octane,
Ну забить...
=================
я говорил о некой универсальной странице для подобных меssag
Которой кидают hash вида:
#data + ccылка на страницу(с нужного домена) для записи в Storage + данные
Универсальная страница создаёт(если уже не создан) внутри себя фрейм с этой ссылкой и перекидывает данные в hash указанной ссылки
=====================
Тогда было б два единых скрипта - для универсальной страницы и для страниц передающих данные в Storage на нужный домен
=====================
Хеш передача удобна при неоднократных месагах на определённый домен (чат к примеру), не нужно пересоздавать новый фрейм на универсальной странице

Octane 08.07.2015 18:36

что-то трюк с localStorage пока что не получается, фреймы не синхронизируют localStorage, но последние изменения отправляются в соседнее окно с тем же адресом, событие вообще только в своем окне срабатывает


Часовой пояс GMT +3, время: 19:47.