vue中iframe标签跨域通信——父子页面之间传值(解决子页面收不到父页面的值或子页面收到的数据为undefined的问题)

news/2025/1/11 15:06:40/

背景

  1. 因为本系统需要支持第三方系统页面的嵌入,于是尝试使用iframe标签,进行跨域通信,父子页面相互传值。
  2. 初始化时,父页面发送数据给子页面,需要在子页面加载完成后发送,不然接收不到数据。
  3. 父页面直接给子页面postMessage发送消息,但是子页面收不到数据;在iFrame.onload函数中发送消息,依旧未收到消息

解决思路

子页面向主网页发送消息,告诉它子网页加载好了,然后主网页再发送消息给子网页进行处理,这样虽然会多一些交互代码,但可以精确地执行交互。

代码

父页面
<template><!-- 嵌套子页面--><iframe:src="ip"id="map"ref="mapFrame"scrolling="yes"frameborder="0"width="100%"height="750px"></iframe>
</template> data(){return{//嵌入页面的路径ip:"http://localhost:8080/sonPage"}}created() {var that = this;// 父页面监听iframe消息window.addEventListener("message",(e) => {if (e.data == "childLoaded") {console.log("父页面收到数据");console.log(e.data);//子组件发过来的数据console.log("父页面发送数据");var iFrame = that.$refs.mapFrame;iFrame.contentWindow.postMessage({ data: "aaa", name: "bbb" },//可以以对象形式传参,也可以直接传字符串"aaa"that.ip//嵌入页面的路径,也可以直接传"*");}},false);},
子页面
  created() {// 向父页面发送消息window.parent.postMessage("childLoaded", "*");window.addEventListener("message",(e) => {if (e.data) {console.log("子页面收到父页面传过来的消息");// if (e.origin === "http://localhost:8010") {// <!-- 对消息来源origin做一下过滤,避免接收到非法域名的消息导致的xss攻击 -->console.log(e);console.log(e.origin); //父页面URL// console.log(e.source); // 父页面window对象,全等于window.parent/window.topconsole.log(e.data); //父页面发送的消息// }}},false);},

效果

1702630571794

参数说明

postMessage

作用 向其他窗口发送消息
语法 otherWindow.postMessage(message, targetOrigin, [transfer])

  • otherWindow为其他窗口的一个引用,比如 iframe 的 contentWindow 属性
  • message为将要发送到其他 window的数据,为字符串
  • targetOrigin为能接收到消息事件的窗口,格式为窗口的网址,如果想要所有窗口都能接收到消息,可设置为*
  • [transfer]为可选参数,是一串和 message 同时传递的 Transferable 对象。这些对象的所有权将被转移给消息的接收方,而发送一方将不再保有所有权。此参数一般不使用
addEventListener

作用 接收消息
语法 window.addEventListener(event, function, useCapture)

  • event为事件名称,一般为"message"
  • function为消息处理函数,用户可自定义,输入参数为e,e包含2个常用的参数,e.data为接收到的字符串消息;e.origin为发送消息的网址,可通过此参数来做判断是否需要处理,以防攻击
  • useCapture用来处理当存在多级组件都有接收消息响应函数时的处理顺序,true表示从外向内,即外层的先响应,false为从内向外,默认为false

http://www.ppmy.cn/news/1270882.html

相关文章

解决由于找不到XINPUT1_3.dll,无法继续执行代码问题的多种方法

在打开游戏时突然提示xinput1_3.dll丢失的情况&#xff0c;出现这样的问题可能会对于电脑新手是一件棘手的事情&#xff0c;xinput1_3.dll&#xff08;Microsoft XINPUT Library&#xff09;是一款由Microsoft公司开发的动态链接库文件&#xff0c;主要用于支持游戏手柄的即插即…

分布式事务seata使用示例及注意事项

分布式事务seata使用示例及注意事项 示例说明代码调用方&#xff08;微服务A&#xff09;服务方&#xff08;微服务B&#xff09; 测试测试一 &#xff0c;seata发挥作用&#xff0c;成功回滚&#xff01;测试二&#xff1a;处理feignclient接口的返回类型从Integer变成String,…

Java网络编程,对使用UDP实现TCP(一)三次握手实现的补充

修改片段1 在第一次握手时&#xff0c;由《TCP/IP详解》卷二中对tcp计时器的描述中&#xff0c;我们可知连接的建立是需要进行判断&#xff0c;如果客户端发送了SYN连接请求&#xff0c;服务端没有在有限时间内进行恢复&#xff0c;就会取消本次连接。 我们使用 setSoTimeout…

人工智能与天文:技术前沿与未来展望

人工智能与天文&#xff1a;技术前沿与未来展望 一、引言 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;在各个领域的应用越来越广泛。在天文领域&#xff0c;AI也发挥着越来越重要的作用。本文将探讨人工智能与天文学的结合&#xff0c;以及这种结合带…

DataFunSummit:2023年数据科学在线峰会-核心PPT资料下载

一、峰会简介 数据会说谎&#xff1f;如何正确的挖掘并使用数据&#xff1f;前沿的科学实验如何做&#xff1f;实验又是如何欺骗你的&#xff1f;数据中台如何发挥功效&#xff1f;用户增长有捷径吗&#xff1f;数据科学的最佳实践有哪些&#xff1f; 本次峰会共包含了&#…

linux基础知识面试题及一般面试技巧

什么是Linux&#xff1f; Linux是一种开源的操作系统&#xff0c;最初由芬兰计算机科学家Linus Torvalds创建。它基于UNIX操作系统的设计原理&#xff0c;并且可以在各种硬件平台上运行。Linux操作系统具有稳定性、安全性和灵活性的特点&#xff0c;广泛应用于服务器、超级计算…

C# ref传参与out传参

在 C# 中&#xff0c;ref 和 out 都是用于传递参数的关键字 1、ref 关键字&#xff1a; ref 用于将一个变量传递给方法&#xff0c;并允许方法修改该变量的值。 调用方法时&#xff0c;必须先初始化被 ref 修饰的变量&#xff0c;否则会编译错误。 方法内部可以不给 ref 参数重…

Win11 TensorRT环境部署

一、CUDA和CUDNN安装 cuda和cudnn网上有很多安装教程&#xff0c;这里列举了一些&#xff0c;就不详细说了&#xff0c;具体链接如下&#xff1a; csdn.net - CUDA安装教程&#xff08;超详细&#xff09; 原创 zhihu.com - 深度学习之CUDACUDNN详细安装教程 tencent.com - C…