Internet explorer IE10中不工作的跨域窗口之间的postMessage(它适用于帧)

Internet explorer IE10中不工作的跨域窗口之间的postMessage(它适用于帧),internet-explorer,cross-domain,addeventlistener,postmessage,Internet Explorer,Cross Domain,Addeventlistener,Postmessage,我遵循本教程,创建了在Chrome和Firefox中工作但不在IE10中工作的跨域消息传递脚本。有人能给我一些关于如何修改IE8+的信息吗 在一台服务器上(例如:192.168.15.223)——接收器 //听众 window.addEventListener('message',函数(事件){ 如果(event.origin!=='http://120.0.0.211“)返回; document.getElementById('cc').innerHTML=event.data; },假);

我遵循本教程,创建了在Chrome和Firefox中工作但不在IE10中工作的跨域消息传递脚本。有人能给我一些关于如何修改IE8+的信息吗

在一台服务器上(例如:192.168.15.223)——接收器


//听众
window.addEventListener('message',函数(事件){
如果(event.origin!=='http://120.0.0.211“)返回;
document.getElementById('cc').innerHTML=event.data;
},假);
window.attachEvent('onmessage',函数(事件){
如果(event.origin!=='http://120.0.0.211“)返回;
document.getElementById('cc').innerHTML=event.data;
},假);
在192.18.15.223服务器上

还没有收到任何东西
在另一台服务器上(例如:120.0.0.211)——发送方


//创建弹出窗口
var域http://192.18.15.223';
var myPopup=window.open(域+'/receiver','myWindow','width=400,height=200');
//消息发送者
函数popup(){
var message='从120.0.0.211发送的消息:';
myPopup.postMessage(消息,域);//发送消息和目标URI
}
在120.0.0.211服务器上
发送消息!
上面的脚本在Chrome和Firefox中工作得很好,窗口弹出,消息可以接收,但是在IE(8+)中,它只弹出窗口,但消息没有接收(或者可能无法发送)

我的主要目的是让两个域发送和接收简单的数据(文本、单个照片等),而不是在后端包含太多的更改。因此,不考虑Web服务

任何帮助都将不胜感激

以下是一些可能有助于调查问题的链接

  • 这篇文章建议在IE上使用attachEvent,我已经在上面的代码中这样做了:

  • 此microsoft官方文档显示IE 8+应支持addEventListener:

  • 建议使用Jquery bind()替换addEventListener:


  • IE不支持跨域弹出窗口之间的postMessage(例如:window.open)。IE确实支持嵌入帧的postMessage(例如:top.frames)

    所以我最后把一个框架放进一个对话框,假装成一个弹出窗口。例如:

    
    $(“#对话框”)。对话框({
    自动打开:错误,
    莫代尔:是的,
    身高:300,
    体重:400,
    });
    函数openiframe(){
    $('dialog')。dialog('open');
    });
    在120.0.0.211服务器上

    发送消息!
    可能还有其他解决方案/技术用于跨域窗口之间的交换:

  • 使用像REST这样的Web服务,它实际上是一个服务器到服务器的转换,不再是一个服务器结构。但这是我们向另一台服务器发送消息的一种方式。对于某些框架,设置REST很容易,例如:cakephp


  • 您是否确保页面在IE8标准模式下运行(点击工具栏中的F12并验证)?您是否启用了脚本调试器、添加断点并在调试器中单步执行脚本?是的,我在IE8、9和10中对其进行了测试。在IE9,10中没有错误消息,但在IE8中显示:SCRIPT16386:行“myPopup.postMessage(message,domain);”不支持这样的接口。我发现了这个链接,它证明IE只能将邮件发送到嵌入的帧,而不能在窗口之间发送。啊,我没想到你在说另一扇窗户。:-)实际上,我几年前就在自己的博客上写过:谢谢Eric,看起来这是IE的老问题。IE兼容性陷阱的冰山一角。
    <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>
    
    <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>
    
    <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>