【发布时间】:2014-01-30 23:23:48
【问题描述】:
似乎window.postMessage在IE 11上仍然坏消息时
- 在窗口和带有 window.open 的子弹出窗口/选项卡之间
- 当它从不同的域发送时[或在某些情况下是相同的域,c.f.更新 16/01]
IE 8/9/10 存在类似问题,但此功能在 IE 11 中从 IE 10 中的“部分支持”标记为“支持”
有一个适用于 chrome/ff 但不适用于 IE 的代码示例:
$(document).ready(function() {
$('#log').append('listening...');
window.addEventListener("message", function(e){
$('#log').append("Received message: " + JSON.stringify(e.data));
}, false);
$('button').click(function() {
window.open('http://jsbin.com/eQeSeros/1', 'popup','menubar=no, status=no, scrollbars=no, menubar=no, width=200, height=100');
});
});
child popup (jsbin):(如果不是由 jsfiddle 打开将不起作用)
$(document).ready(function() {
$('body').append('sending...');
window.opener.postMessage("Hello?", "http://fiddle.jshell.net");
$('body').append('sent...');
});
我从Is cross-origin postMessage broken in IE10? 的帖子中读到,我们可以使用MessageChannel 而不是postMessage,但是阅读文档,我没有找到如何在我的真实案例中使用它,因为你必须通过端口到子窗口。
在我需要发送消息之前有一个重定向链,所以即使我可以发送一个端口,我也会丢失最初/在重定向之前发送的任何 js 对象。
有替换的想法吗?
14/01 更新:我正在考虑在窗口/选项卡标题中传递我的数据,并定期从父级检查此标题...但这将是一个相当肮脏的把戏。 p>
更新 16/01:真正糟糕的部分是,即使消息是从同一个域发送的,但在被另一个域重定向之后,它也会中断。
示例如下: http://jsfiddle.net/L4YzG/13/ 打开弹出窗口 http://jsbin.com/eQeSeros/4/edit 重定向到 http://jsfiddle.net/mxS8Q/2/(发布消息)
如果您直接通过最终 url 重定向到 http://jsfiddle.net/mxS8Q/2/show 更改 url 弹出窗口,这适用于 IE,因为在打开和发布之间没有其他域
我仍在研究我的窗口标题肮脏的把戏。当它在另一个域上时,我们无法接收窗口的标题,但如果它在 jsfiddle 上返回,则标题可用(postMessage 没有以前的问题)。下面是示例:http://jsfiddle.net/L4YzG/14/ ...这可能是一个替代解决方案,但我刚刚看到了一些关于在 cookie 中传递数据的内容,它只需要进行测试。
04/02 更新:如果最终域相同但不是跨域,则传递标题中的信息是不够的。我想注入一个同域的 iframe 来传递这些信息,但我也不能共享子窗口对象(postMessage 需要一个可序列化的对象)。
最后我尝试在注入的 iframe 和子窗口之间共享一个 cookie(在 js 中创建和接收),这在 chrome 和 ff 上运行良好,但仍然无法通过 IE 正确接收。添加 P3P 标头后它工作正常,这似乎是真正的解决方案。 Safari 似乎对这种技术有一些问题,所以我只保留这种技术作为后备。
【问题讨论】:
-
你能分享一些关于你的cookie解决方案的细节吗?
标签: javascript internet-explorer cross-browser cross-domain postmessage