【发布时间】:2013-04-20 01:35:20
【问题描述】:
我正在尝试制作一个简单的 postMessage 示例工作...
- 在 IE10 中
- 在窗口/选项卡之间(与 iframe 相比)
- 跨域
删除其中任何一个条件,一切正常:-)
但据我所知,窗口间postMessage 仅在两个窗口共享原点时才在 IE10 中工作。 (嗯,事实上——而且奇怪的是——这种行为比这稍微宽松一些:共享一个 主机 的两个不同来源似乎也可以工作。
这是一个记录在案的错误吗?任何解决方法或其他建议?
(注意:This question 涉及到这些问题,但its answer 是关于 IE8 和 IE9——而不是 10)
更多细节 + 示例...
启动页面demo
<!DOCTYPE html>
<html>
<script>
window.addEventListener("message", function(e){
console.log("Received message: ", e);
}, false);
</script>
<button onclick="window.open('http://jsbin.com/ameguj/1');">
Open new window
</button>
</html>
启动页面demo
<!DOCTYPE html>
<html>
<script>
window.opener.postMessage("Ahoy!", "*");
</script>
</html>
这适用于:http://jsbin.com/ahuzir/1——因为两个页面都托管在同一个来源 (jsbin.com)。但是将第二页移到其他任何地方,它在 IE10 中失败。
【问题讨论】:
-
请考虑将接受的答案更改为回答问题的答案,而不是在 MessageChannel 需要 postMessage 才能使其正常工作时将 MessageChannel 列为最佳选择的答案。我花了一个多小时玩 MessageChannel 才发现一个可行的解决方案是 iframe 代理。
-
如果你的 window.open 只是一个弹出对话框,你可以完全避免它并在 js modal 中使用 iframe。 jQuery Dialog 或 Bootstrap Modal 之类的东西是我实现它的方式。然后就可以在IE中使用
window.parent.postMessage了。 -
@Bosh 因为我的答案似乎在 2018 年有效并且不需要代理框架,您是否介意将其设置为公认的答案,因为它似乎对我们有帮助,不幸的是那些仍然必须支持旧的即
标签: html cross-browser compatibility internet-explorer-10 postmessage