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, но последние изменения отправляются в соседнее окно с тем же адресом, событие вообще только в своем окне срабатывает

Deff 08.07.2015 18:48

Цитата:

Сообщение от Octane
фреймы не синхронизируют localStorage,

Т .е при записи в localStorage во фрейме - это событие в ином окне с этого же домена не отслеживается ?

Octane 08.07.2015 19:14

неа, в IE не возникает события

Octane 08.07.2015 19:20

Вот такая штука завелась:

- site1.com выполняет localStorage.removeItem('cross-window-postMessage-data')
- site1.com открывает в новом окне site2.com
- site2.com открывает в iframe site1.com/proxy.html
- site2.com выполняет iframe.contentWindow.postMessage('json', '*')
- proxy.html получает сообщение 'json' по событию message
- proxy.html выполняет localStorage.setItem('cross-window-postMessage-data', 'json')
- site1.com в интервале выполняет localStorage.getItem('cross-window-postMessage-data')

Deff 08.07.2015 19:37

Octane,
Да
Цитата:

- site1.com в интервале выполняет localStorage.getItem('cross-window-postMessage-data')
Это как-то не Айс...может проще вызывать функцию top.window.имя() из site1.com/proxy.htm и отдавать напрямую в top.window ?

Octane 08.07.2015 19:39

Не не, между site1.com и site1.com/proxy.html нет никакой связи, ни parent, ни opener, только localStorage

Deff 08.07.2015 20:00

Octane,
А ежли изначально в site1.com ячейку в localStorage установить - типо 'default', события при изменении/удалении этой ячейки во фрейме site1.com/proxy.htm не возникнет на site1.com?
Типо шаманю... Бывают такие фичи у ИЕ...

Octane 08.07.2015 20:14

Я в каком то полифиле видел коммент, что в IE при изменении одного и того же ключа не возникнет событие, пробовал разные ставить, ничего не помогает

Deff 08.07.2015 20:24

Octane,
А если ключ удалять ? (во фрейме) А писать в другой - а первый ключ чисто для события

Octane 09.07.2015 13:52

Сейчас еще раз попробовал в IE11, не все так плохо:

site2.com загружает в iframe site1.com/proxy.html

1. site1.com выполняет localStorage.setItem(…), в iframe не возникает события onstorage
2. iframe выполняет localStorage.setItem(…), на site1.com возникает событие onstorage

Впринципе можно использовать без интервала в одну сторону.

Deff 09.07.2015 13:56

Цитата:

Сообщение от Octane
в iframe не возникает события onstorage

Это да, некоторые события в iframe - режутся, и не только в ИЕ
Есть древняя метода уведомления iframe о событии окном-установщиком фрейма, - изменяя типоразмеры(пропорции) фрейма , можно уведомить о нескольких событиях. Onresize в iframe типично работает, - тестируем пропорции(отношение длины к высоте)

Octane 10.07.2015 01:44

Остановился на варианте:
- site1.com при запуске выполняет localStorage.removeItem('postMessage-data')
- site1.com открывает в новом окне site2.com
- site2.com открывает в iframe site1.com/postmessage.html
- site2.com выполняет iframe.contentWindow.postMessage(json, 'https://site1.com')
- postmessage.html получает сообщение json по событию onmessage
- postmessage.html выполняет localStorage.setItem('postMessage-data', json)
- site1.com получает сообщение json по событию onstorage из event.newValue, проверив event.key и event.url
- site1.com выполняет localStorage.removeItem('postMessage-data')

Deff 10.07.2015 03:15

Красиво, 8 операций, мон наверно слепить - плагин для двухстороннего обмена (для фрейма и скрипта перед ним, он же включает чтение со storage в случае обратного обмена)


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