IE cross-window cross-domain messaging
Реально ли организовать обмен сообщениями между окнами с разных доменов в IE?
|
Octane,
Ну древний как мир кроссбраузерный метод - во фрейме создаем фрейм с домена с главной страницы и всовывая данные в window.name(Ну или динамически через hash ссылки ) Созданный внутренний фрейм по загрузке отдаёт данные на главную. http://javascript.ru/ajax/cross-domain-scripting Есть старый фреймворк dojo для кроссдомена |
Пришел к такому решению:
|
Octane,
Ну по идее, если флеш допустим, проще всего кроссобмен через флеш куки используя тот же dojo, не нужны костыли вспомогательной страницы ========================== Для перспективы, удобнее создать страницу на неком третьем домене на постоянной основе со скриптом записи/cчитывания данных в localStorage по хешу ссылки (Возвращает данные через тот же хеш) Для больших объемов данных(максимальный размер хеша ~ 2Кb) предусматриваем концевой спец. символ продолжения приема/передачи (достаточно просто, если использовать кодирование URIcomponent) |
Очень не хочется флеш :(
Мой вариант фигня, потому что window.open выполняется не в trusted event… Хотя можно попробовать позиционировать iframe над кнопкой и по клику открывать окно. |
Цитата:
- 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 Завтра попробую работоспособность. |
Ну по идее есть ещё событие смены хеш внутри фрейма для отслеживания начала передачи,
или старый метод, использования трех хешей: #start, #data+данные, #stop; В фрейме ставят два div #start и #stop разнесённые по высоте, отслеживаем onscroll при начале - конце посылки |
чет не догоню про хэши фреймов, как это между окнами использовать
|
Octane,
Ну забить... ================= я говорил о некой универсальной странице для подобных меssag Которой кидают hash вида: #data + ccылка на страницу(с нужного домена) для записи в Storage + данные Универсальная страница создаёт(если уже не создан) внутри себя фрейм с этой ссылкой и перекидывает данные в hash указанной ссылки ===================== Тогда было б два единых скрипта - для универсальной страницы и для страниц передающих данные в Storage на нужный домен ===================== Хеш передача удобна при неоднократных месагах на определённый домен (чат к примеру), не нужно пересоздавать новый фрейм на универсальной странице |
что-то трюк с localStorage пока что не получается, фреймы не синхронизируют localStorage, но последние изменения отправляются в соседнее окно с тем же адресом, событие вообще только в своем окне срабатывает
|
Цитата:
|
неа, в IE не возникает события
|
Вот такая штука завелась:
- 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') |
Octane,
Да Цитата:
|
Не не, между site1.com и site1.com/proxy.html нет никакой связи, ни parent, ни opener, только localStorage
|
Octane,
А ежли изначально в site1.com ячейку в localStorage установить - типо 'default', события при изменении/удалении этой ячейки во фрейме site1.com/proxy.htm не возникнет на site1.com? Типо шаманю... Бывают такие фичи у ИЕ... |
Я в каком то полифиле видел коммент, что в IE при изменении одного и того же ключа не возникнет событие, пробовал разные ставить, ничего не помогает
|
Octane,
А если ключ удалять ? (во фрейме) А писать в другой - а первый ключ чисто для события |
Сейчас еще раз попробовал в IE11, не все так плохо:
site2.com загружает в iframe site1.com/proxy.html 1. site1.com выполняет localStorage.setItem(…), в iframe не возникает события onstorage 2. iframe выполняет localStorage.setItem(…), на site1.com возникает событие onstorage Впринципе можно использовать без интервала в одну сторону. |
Цитата:
Есть древняя метода уведомления iframe о событии окном-установщиком фрейма, - изменяя типоразмеры(пропорции) фрейма , можно уведомить о нескольких событиях. Onresize в iframe типично работает, - тестируем пропорции(отношение длины к высоте) |
Остановился на варианте:
- 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') |
Красиво, 8 операций, мон наверно слепить - плагин для двухстороннего обмена (для фрейма и скрипта перед ним, он же включает чтение со storage в случае обратного обмена)
|
Часовой пояс GMT +3, время: 04:11. |