postMessage между междоменными окнами не работает в IE10 (работает для фреймов)

Я следовал этому руководству http://davidwalsh.name/window-postmessage и создал междоменные сценарии обмена сообщениями, которые работают в Chrome и Firefox, но не в IE 10. Может ли кто-нибудь дать мне несколько советов о том, как изменить его для IE 8+?

На одном сервере (например: 192.168.15.223)- получатель

<script>
//listener
window.addEventListener('message',function(event) {
    if(event.origin !== 'http://120.0.0.211') return;
    document.getElementById('cc').innerHTML = event.data;
},false);

window.attachEvent('onmessage',function(event) {
    if(event.origin !== 'http://120.0.0.211') return;
    document.getElementById('cc').innerHTML = event.data;
},false);
</script>
<p>At 192.18.15.223 server</p>
<div id='cc'>Nothing received yet</div>

На другом сервере (например: 120.0.0.211)- отправитель

<script>
//create popup window
var domain = 'http://192.18.15.223';
var myPopup = window.open(domain + '/receiver','myWindow','width=400,height=200');
//message sender
function popup(){
    var message = 'A message sent from 120.0.0.211:';
    myPopup.postMessage(message,domain); //send the message and target URI 
}
</script>
<div id="bb">At 120.0.0.211 server</div>
<button type="button" onclick="popup()">send the message!</button>

Вышеуказанные скрипты прекрасно работают в Chrome и Firefox, всплывающее окно и сообщение можно получить, однако в IE(8+) оно только всплывает, но сообщение не получено (или может быть не может быть отправлено).

Моя главная цель - сделать так, чтобы два домена отправляли и получали простые данные (тексты, одиночные фотографии и т. Д.), Не включая слишком много изменений в бэкэнде. Так что веб-сервис не считается.

Любая помощь будет признательна!

Вот несколько ссылок, которые могут быть полезны для изучения проблем.

  1. Этот пост предлагает использовать attachEvent в IE, что я уже делал в кодах выше: addEventListener в Internet Explorer

  2. Этот официальный документ Microsoft показывает, что IE 8+ должен поддерживать addEventListener: http://msdn.microsoft.com/en-us/library/ie/cc197057(v=vs.85).aspx

  3. Рекомендуется использовать Jquery bind() для замены addEventListener: jQuery-эквивалент JavaScript-метода addEventListener

1 ответ

Решение

IE не поддерживает postMessage между междоменными всплывающими окнами (например:window.open). IE поддерживает postMessage для встроенных фреймов (например, top.frames).

В итоге я помещаю рамку в диалог, делая вид, что всплывающие окна. например:

С помощью диалога Jquery UI

<script>
$("#dialog").dialog({
    autoOpen: false,
    modal: true,
    height: 300,
weight: 400,
});

function openiframe(){
   $('#dialog').dialog('open');
});
</script>

<p>At 120.0.0.211 server</p>
<button type="button" onclick="openiframe()">send the message!</button>
<div id="dialog">
   <iframe id="iframe" src="http://192.168.15.223/smallframe"></iframe>
</div>

Это могут быть другие решения / технологии для коммутации между междоменными окнами:

  1. Обмен ресурсами между источниками (CORS) с использованием Ajax.

  2. Использование Webservice, такого как REST, который на самом деле представляет собой коммутацию сервер-сервер, а не структуру server-broswer-server. Но это способ, которым мы можем отправить какое-то сообщение на другой сервер. Для некоторых фреймворков легко настроить REST, например: cakephp

Другие вопросы по тегам