iframe 父子页面传值 postMessage

16 篇文章 0 订阅

使用postMessage给父子页面传值,可以解决跨域问题

  1. 父传子:iframe.contentWindow.postMessage()
  2. 子传父:尽量放在window.onload里面。window.parent.postMessage()
  3. 接收数据:window.addEventListener(‘message’, event => {})

遇到的问题:

子页面中有登录,保存了cookie,但是谷歌浏览器的iframe中并不能成功取到。

解决方案:

1. 使用https协议
2. 保存cookie的时候修改设置:SameSite和Secure 
this.$cookies.set('token', res.data.auth_token, null, null, null, true, 'None');

父级

(vue项目)

<iframe id="myIframe" :src="iframeUrl + '/test.html'" width="80%" height="60%" style="position: absolute;top: 0;left: 0;"></iframe>
 
 data() {
   	return {
   		iframeUrl : 'http://127.0.0.1:5500'
   	}
 },
mounted() {
    this.iframe = document.getElementById('myIframe').contentWindow;
    window.addEventListener('message', this.getChildMsg, false);
},
methods: {
	getChildMsg() {
		if (event.origin == this.iframeUrl) {  // 校验一下来源
	        console.log('父页面获取到信息是:' + event.data);
	      }
	},	
	// 点击传值给子页面
	sendToChild() {
		this.iframe.postMessage('父级点击了xx,传给子页面xx', this.iframeUrl);   // 第二个参数可是具体域名或*(传递给所有的窗口)
	}
}

子页面

(child.html)

<button id="btn" data-id="id1">点击传给父组件</button>
<script>
    window.onload = () => {
      // console.log('onload加载完了');
      document.getElementById('btn').addEventListener('click', params => {
        window.parent.postMessage('子页面点击按钮的id是' + params.target.dataset.id, '*');
      });
    };
    window.addEventListener('message', function (event) {
      if (event.origin == 父页面域名) {
        console.log('子页面获取到的信息是:' + event.data);
      }
    });
  </script>

结果:
在这里插入图片描述

谷歌浏览器 iframe中设置cookie的参考:https://blog.csdn.net/ysyysjbama/article/details/108061969?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allsobaiduend~default-3-108061969.nonecase&utm_term=iframe%E4%B8%8D%E8%83%BD%E8%AE%BE%E7%BD%AEcookie&spm=1000.2123.3001.4430

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值