IE8对发送到iFrame的postMessage是否有任何特定限制?

IE8对发送到iFrame的postMessage是否有任何特定限制?,iframe,internet-explorer-8,postmessage,Iframe,Internet Explorer 8,Postmessage,我有一个带有iframe的web应用程序,它需要与其宿主页面进行通信。iframe和主机位于不同的域和协议上(iframe是https,主页http)。我使用postMessage从外部页面获取少量状态(用户跟踪)到iframe 加载iframe后,它会向首页发送一条短消息,请求访问者ID: if($.w.top!=$.w)$.f.postMessage($.w.top,'Get visitorId'); ($.f.postMessage(w,m)只是postMessage的包装器,如果w.p

我有一个带有iframe的web应用程序,它需要与其宿主页面进行通信。iframe和主机位于不同的域和协议上(iframe是https,主页http)。我使用postMessage从外部页面获取少量状态(用户跟踪)到iframe

加载iframe后,它会向首页发送一条短消息,请求访问者ID:

if($.w.top!=$.w)$.f.postMessage($.w.top,'Get visitorId');
($.f.postMessage(w,m)只是postMessage的包装器,如果w.postMessage的typeof=='undefined',它什么也不做)。在外部页面上,我们有一个消息侦听器:

//设置事件侦听器,以便我们可以在任何IFrame
//我们内心要求我们的探视者
$.f.listen($.w,'message',giveVisitorId);
函数giveVisitorId(事件){
$.w['zzzzz']=event.source;
如果(event.data=='Get visitorId'){
警报('即将使用visitorid从'+window.location.href+'回复,typeof event.source.postMessage为'+typeof(event.source.postMessage));
event.source.postMessage('visitorId='+$.v.visitorId'*');
}
}
内部框架有一个为响应注册的侦听器:

$.f.listen($.w,'message',receiveVisitorId);
函数receiveVisitorId(事件){
警报('receiveVisitorId调用时使用:'+event.data+'in window'+window.location.href);
var s=event.data.split('=');
如果(s[0]==='visitorId'和&s.length==2){
$.v.visitorId=s[1];
$.w.clearTimeout(放弃);
rest();
}
}
这一切都像在OSX上的chrome和firefox上一样正常工作(当iframe加载时,我们会收到两个警报,一个来自receiveVisitorId,另一个来自giveVisitorId);然而,在XP上的IE8上,我们只收到第一个警报(来自giveVisitorId)

这是够奇怪的,因为似乎发出的邮件有效,而进入的邮件无效;真正令人困惑的是,如果我们转到控制台并运行
zzzzz.postMessage('hi','*')
receiveVisitorId中的警报会按预期发生!(注意,我们在window.zzz中保存了event.source)

有人知道为什么会这样吗

注:$.w.listen和$.w.postMessage的定义,供参考:

监听:功能(el、ev、fn){
if(typeof$.w.addEventListener!=“未定义”){
el.addEventListener(ev、fn、false);
}
else if(typeof$.w.attachEvent!==“未定义”){
el.attachEvent(‘on’+ev,fn);
}
},
postMessage:function(w,m){
if(w.postMessage的类型!==“未定义”){
w、 邮递信息(m,“*”);
}
},

我们解决了这个问题。问题是我们在内部iframe中的
$.f.postMessage
之后调用
$.f.listen
;因此,当外部窗口向内部发布消息时,侦听器尚未连接。我不知道为什么IE会出现这种情况,而不是chrome或firefox,但我们只是把它归结为浏览器之间的时间差异