一尘不染

跨域postMessage在IE10中是否损坏?

html

我正在尝试做一个简单的postMessage例子…

  • 在IE10中
  • 窗口/标签页之间(相对于iframe)
  • 跨起源

删除这些条件中的任何一个,一切正常:-)

但是据我所知,postMessage只有两个窗口共享一个原点时,窗口间才在IE10中起作用。(事实上​​,而且很奇怪,这种行为比这更宽松:共享
宿主的 两个不同来源似乎也起作用)。

这是有记录的错误吗?有任何解决方法或其他建议吗?

(注意:此问题涉及问题,但答案是关于IE8和IE9的,而不是10)


更多详情+示例…

启动器页面

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

启动页面

<!DOCTYPE html>
<html>
  <script>
    window.opener.postMessage("Ahoy!", "*");
  </script>
</html>

这可以在以下网址使用:因为两个页面都位于相同的来源(jsbin.com)。但是将第二页移动到其他任何地方,在IE10中失败。


阅读 536

收藏
2020-05-10

共1个答案

一尘不染

当我最初发布此答案时,我错了:它实际上在IE10中不起作用。 显然,由于其他原因,人们发现此功能很有用,因此我将其留给后代使用。原始答案如下:


值得注意的是:该答案中的链接与postMessageIE8和IE9中独立窗口的跨域状态无关-
但是,它也是在IE10出现之前于2009年编写的。因此,我不会将其表示为已在IE10中修复。

至于postMessage它本身明显表明它在IE10中仍然被破坏,这似乎与您的演示相匹配。caniuse页面链接到本文,其中包含一个非常相关的引用:

Internet Explorer 8+部分支持跨文档消息传递:它当前适用于iframe,但不适用于新窗口。但是,Internet Explorer
10将支持MessageChannel。Firefox当前支持跨文档消息传递,但不支持MessageChannel。

因此,您最好的选择是拥有一个MessageChannel基本的代码路径,postMessage如果不存在,则回退到该路径。它不会获得IE8 /IE9的支持,但至少可以与IE10一起使用。

2020-05-10