最新公告
  • 欢迎您光临网站无忧模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 解决postMessage在IE11跨域无法通信问题

    正文概述 掘金(KidLau)   2021-02-13   983

    曾经遇过一个case,公司原有的一套系统需要和新系统做交互,流程是从旧系统打开新窗口加载新系统,然后在新系统触发某些操作时,发送信息回旧系统并处理。HTML5有一个postMessage的API可以支持跨窗口通信。参考MDN做了一个简单的POC。

    // 旧系统 http://www.a.com
    const win = window.open('http://www.b.com')
    win.postMessage('Hello from a.', 'http://www.b.com');
    
    function receiveMessage (event) {
      if (event.origin !== "http://www.b.com") {
        return;
      }
    
      // event.source是我们通过window.open打开的弹出页面win
      // event.data是win发送给当前页面的消息'Hello from b.'
    }
    
    window.addEventListener('message', receiveMessage, false);
    
    // 新系统 http://www.b.com
    function receiveMessage (event) {
      if (event.origin !== 'http://www.a.com') {
        return;
      }
    
      // event.source就当前弹出页的来源页面(http://www.a.com)
      // event.data是'Hello from a.'
    
      event.source.postMessage('Hello from b.', event.origin);
    }
    
    window.addEventListener('message', receiveMessage, false);
    

    这个方法可以实现窗口间双向通信。但旧系统和新系统存在以下两个问题:

    1. 需要支持IE11
    2. 旧系统与新系统跨域

    我拿了个旧系统的测试环境做了几轮测试。发现这个postMessage的API在IE且跨域时并不能很好的工作,会出现通信失败的情况。毫无头绪之下,只好到Stack Overflow逛逛,试了多种方法还是无法成功解决IE这个“神奇”浏览器的兼容性问题。最后在一个评论中发现如下方法,测试后意外发现解决了我的问题。

    // 把原来的代码
    const win = window.open('http://www.b.com')
    // 改为
    const win = window.open('/')
    win.location.href = 'http://www.b.com'
    

    原因猜测:直接使用新系统域名创建窗口,由于生成的新窗口和旧窗口跨域,所以引用不成功,所以postMessage无法正常使用postMessage。使用第二种方法,先使用当前域名的根路由创建窗口,这时新窗口和旧窗口是同域的,再使用api把新窗口地址跳转到新平台,这时候由于引用已存在,所以可以正常双向通信。


    下载网 » 解决postMessage在IE11跨域无法通信问题

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元