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+) оно только всплывает, но сообщение не получено (или может быть не может быть отправлено).
Моя главная цель - сделать так, чтобы два домена отправляли и получали простые данные (тексты, одиночные фотографии и т. Д.), Не включая слишком много изменений в бэкэнде. Так что веб-сервис не считается.
Любая помощь будет признательна!
Вот несколько ссылок, которые могут быть полезны для изучения проблем.
Этот пост предлагает использовать attachEvent в IE, что я уже делал в кодах выше: addEventListener в Internet Explorer
Этот официальный документ Microsoft показывает, что IE 8+ должен поддерживать addEventListener: http://msdn.microsoft.com/en-us/library/ie/cc197057(v=vs.85).aspx
Рекомендуется использовать Jquery bind() для замены addEventListener: jQuery-эквивалент JavaScript-метода addEventListener
1 ответ
IE не поддерживает postMessage между междоменными всплывающими окнами (например:window.open). IE поддерживает postMessage для встроенных фреймов (например, top.frames).
В итоге я помещаю рамку в диалог, делая вид, что всплывающие окна. например:
<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>
Это могут быть другие решения / технологии для коммутации между междоменными окнами:
Обмен ресурсами между источниками (CORS) с использованием Ajax.
Использование Webservice, такого как REST, который на самом деле представляет собой коммутацию сервер-сервер, а не структуру server-broswer-server. Но это способ, которым мы можем отправить какое-то сообщение на другой сервер. Для некоторых фреймворков легко настроить REST, например: cakephp