在iframe内部通过window.open打开页面使用postMessage通信造成跨域问题解决办法

最近项目为了接入公司其他项目,使用了iframe,一般用到iframe,要通信我第一时间想到的就是postMessage,这次也不例外,

在iframe内部打开新页面并发送消息

const opener = window.open('xxx.com')

在xxx.com页面监听iframe内部发送消息,并回传消息给iframe

//1.监听postMessage
window.addEventListener('message', function (e) {
    // 处理消息
    }
}, false);
//通知外部,已经初始化完毕
window.postMessage({ready:true},'*');

在这里回发信息就要报错,在iframe内部无法接受到回发的消息,所以这里在监听消息内部去做消息回发
xxx.com页面监听部分代码做如下修改

window.addEventListener('message', function (e) {
    // 处理消息
    //通知外部,已经初始化完毕
    e.source.postMessage({ready:true},'*');
}, false);

然后在iframe内部监听消息,并关闭刚打开的tab页面

window.addEventListener('message', function(e){
	// 处理消息
	// 关闭页面
	opener.close()
},false)

此外还有一个问题,就是在iframe内部无法通过window.top.location去访问父级页面的地址信息,会产生跨域问题,要解决这个问题,可以指定通过查找iframe dom元素,比如documnet.querySelector('iframe').contentWindow.postMessage('向iframe传的值',*)或者把消息带到iframe的地址栏上也可以,也可以绕过,在iframe内部读取配置文件达到通信的目的或者通过接口通信,方法有很多种,看自己的需求

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值