VUE框架 iframe跨域调用传参

由于跨域的情况下,无法携带sessionstorage,所以通过iframe的postMessage通信机制传递数据。

1.主页面,写入url,加载完成后,发送数据

<template>
   <div>
        <iframe  v-if="src" ref="iframe" @load="onload" :src="urlSrc"></iframe>
   </div>
</template
<script>
export default {
   data(){
     return{
       urlSrc:"调用路径地址",
    }
  },
methods(){
  onload(){
     let query= {
       id:'dwewe'
	   text:'我是数据',   
     };
   this.$nextTick(()=>{
		this.$refs.iframe.contentWindow.postMessage({
			type:'preview',
			data:qury              //可传被调用页面所需要的数据
		},this.urlSrc);
     }
   })
  }
}
}
</script>

2.被调用页面,执行监听,在created、mounted生命周期中都可以

created() {
	window.addEventListener('message',(event)=>{
	 console.log(event.data.type)
	 if(event.data&&event.data.type=='preview'){
	  let data = event.data.data;
        console.log(data)   //拿到主页面数据处理
	 }
  }, false);
}

### Vue3 中 iframe 通信解决方案 #### 使用 `postMessage` 方法实现通信 在现代 Web 开发中,`window.postMessage()` 是一种安全可靠的方法来实现在不同源的窗口或框架间传递消息。这种方法不仅适用于父子页面间的通信,也支持更复杂的场景。 对于 Vue3 应用中的 iframe 问题,可以通过以下方式处理: 1. **父页面向子页面发送消息** 当需要从宿主页面向嵌入的 iframe 发送信息时,可以调用 iframe 对象上的 postMessage 函数[^1]。 ```javascript // 父页面 (Vue 组件) const sendMessageToIframe = () => { const message = { type: 'greeting', content: 'Hello from parent!' }; document.querySelector('iframe').contentWindow.postMessage(message, '*'); }; ``` 2. **子页面接收来自父页面的消息并作出回应** 为了使内嵌于 iframe 的网页能够接收到外部传来的内容,需设置一个全局事件监听器用于捕捉这些消息,并根据实际情况做出相应操作。 ```javascript // 子页面 (HTML 文件头部 script 标签内部 或者单独 JS 文件) window.addEventListener('message', function(event) { // 安全检查:验证消息来源是否可信 if (event.origin !== "http://example.com") return; console.log(`Received ${event.data.type}:`, event.data.content); // 向父级回传数据 window.parent.postMessage({type:'acknowledge'}, "*"); }); ``` 3. **子页面主动向父页面发送消息** 同样地,如果希望由 iframe 内部发起通讯,则可以在其中执行类似的逻辑,只是方向相反——即通过访问上级上下文 (`parent`) 来触发相应的动作。 ```javascript // 子页面 function notifyParent() { var data = { action: 'updateStatus' }; window.parent.postMessage(data, '*'); // '*' 表示不限定目标网址 } ``` 4. **父页面监听子页面发出的信息** 最后一步是在宿主页上建立对应的侦听机制以便及时获取到来自 iframe 的反馈。 ```javascript // 父页面 (Vue 组件 mounted 钩子里) mounted() { window.addEventListener('message', this.handleIFrameMessages); }, methods: { handleIFrameMessages(e){ console.log('Got response:', e.data); // 进行进一步业务逻辑... } } ``` 以上方法展示了如何利用 H5 提供的新特性完成两个独立站点之间的交互过程,既保持了各自的安全边界又实现了必要的资源共享和服务协同工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值