5

Śledziłem ten poradnik http://davidwalsh.name/window-postmessage i stworzył skrypty wiadomości domen krzyż, który działa w Chrome i Firefox, ale nie w IE 10. Czy ktoś może dać mi jakieś przeboje na jak zmodyfikować go dla IE 8+?postMessage między oknami między domenami nie pracuje w IE10 (działa na ramkach)

Na jednym serwerze (np: 192.168.15.223) - odbiornik

<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> 

Na innym serwerze (np: 120.0.0.211) - nadawcy

<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> 

Przede skryptów działa idealnie w Chrome i Firefox, pojawia się okno i można odebrać wiadomość, jednak w IE (8+) pojawia się tylko okno, ale wiadomość nie jest odbierana (lub może nie być wysyłana).

Moim głównym celem jest uczynienie dwie domeny wysyłać i odbierać proste dane (teksty, zdjęcia pojedyncze itp), a nie w tym zbyt dużo zmian na backend. Więc usługa sieciowa nie jest brana pod uwagę.

Każda pomoc będzie doceniona!

Oto kilka linków, które mogą pomóc w zbadaniu problemów.

  1. Ten post suggess korzystając attachEvent na IE, które już miało miejsce w kodach powyżej: addEventListener in Internet Explorer

  2. Ten dokument pokazuje Microsoft oficjalnie IE 8+ powinny wspierać addEventListener: http://msdn.microsoft.com/en-us/library/ie/cc197057(v=vs.85).aspx

  3. to zalecane przy użyciu jQuery bind() aby zastąpić addEventListener: jQuery equivalent of JavaScript's addEventListener method

+0

Czy upewniłeś się, że twoja strona działa w trybie standardów IE8 (hit F12 i sprawdź na pasku narzędzi)? Czy włączyłeś debuggera skryptu, dodasz punkt przerwania i przejdziesz przez skrypt w debugerze? – EricLaw

+0

Tak, przetestowałem go w IE8,9 i 10.W IE9,10 brak komunikatów o błędach, jednak w IE 8 pokazuje: SCRIPT16386: Żaden taki interfejs nie jest obsługiwany dla linii "myPopup.postMessage (message, domain);". – KingBowen

+0

Znalazłem ten link, który udowodnił, że IE może tylko wysyłać wiadomość do osadzonych ramek, a nie między oknami. http://blogs.msdn.com/b/thebeebs/archive/2011/12/21/postmessage-popups-and-ie.aspx – KingBowen

Odpowiedz

3

IE nie obsługuje postMessage pomiędzy oknami popup między domenami (np: window.open). IE obsługuje postMessage dla osadzonych ramek (np. Top.frames).

więc skończyć umieszczając ramkę do okna, udając się jak okna wyskakujące. np:

With the help of Jquery UI dialog

<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> 

To może być inne rozwiązania/technologie tam dla komutacji między oknami cross-domain:

  1. Cross-Origin Resource Sharing (CORS) using Ajax.

  2. Korzystanie z usługi Webservice, takiej jak REST, która faktycznie jest komutacją serwer-serwer, a nie strukturą serwer-serwer-bros. Ale jest to sposób, w jaki możemy wysłać wiadomość na inny serwer. W przypadku niektórych frameworków łatwo jest ustawić REST, np .: cakephp