实现iframe父窗体与子窗体的通信

双串电池有源均衡设计:MP2642与PIC18F47K40实现 电池均衡是BMS中的核心环节,尤其在串联电池组中,电芯内阻与容量的微小差异会随充放电循环被放大,导致整组可用容量下降、后备时间缩短。均衡技术主要分为被动均衡与主动均衡,前者通过电阻放电,简单但能量损耗大;后者利用电感或开关电容实现电荷搬移,效率更高,更适合对功耗和温升敏感的储能系统与备用电源。在两节串联电池这样的小型场景中,压差管理同样需要精细控制。一种基于MP2642GR-Z与PIC18F47K40的有源均衡方案,由MCU负责电压采样、滞回决策与故障保护,专用前端完成功率级电流路径切换,可将均衡电流控制在 阅读详情

本文主要会介绍如何基于MessengerJS,实现iframe父窗体与子窗体间的通信,传递数据信息。同时本文会提供一个可运行的实例代码,实现在父窗体中,获取到来自子窗体的数据的效果。

0.背景介绍

(1)需要在当前的前端项目中,使用iframe嵌套别的站点页面。

(2)当子窗体触发了一个事件后,要给父窗体传一个跳转地址的url。父窗体监听到这个事件后,根据接收到的url,来更新当前父窗体的url,实现页面的跳转。
1.采用方案
1.1 MessengerJS方案

可以采用MessengerJS方案,该方案可以实现父窗体与iframe之间的通信、多个iframe之间的通信。不过要前提是要确保对不同域的页面有修改权限,并且父窗体、子窗体页面都要同时加载这个MessengerJS。
1.2 使用方法

(1) 在需要通信的父窗体、和子窗体的文档中,都需要引入MessengerJS。

(2) 父窗体和子窗体各自的文档(document)中,都需要自己的Messenger与其他文档通信,父窗体和子窗体的window对象都对应着有且仅有一个Messenger对象,该Messenger对象会负责当前window的所有通信任务。因此,每个Messenger对象都需要唯一的名字,这样它们之间才可以知道是在跟谁通信。另外,MessengerJS方案推荐指定项目名称,(类似命名空间的作用),以增强代码健壮性与组件复用性,避免未来与其他项目冲突。(注意: 项目名称应使用字符串类型)

父窗体与子窗体初始化Messenger对象:

// 父窗口中 - 初始化Messenger对象
 // 推荐指定项目名称, 避免Mashup类应用中, 多个开发商之间的冲突
 var messenger = new Messenger('Parent', 'projectName');

 // iframe中 - 初始化Messenger对象
 // 注意! Messenger之间必须保持项目名称一致, 否则无法匹配通信
 var messenger = new Messenger('iframe1', 'projectName');

 // 多个iframe, 使用不同的名字
 var messenger = new Messenger('iframe2', 'projectName');

(3) 在发现消息前,目标文档要确保已经监听了消息事件:

messenger.listen(function(msg){
 	alert("收到消息: " + msg);
 });

(4) 父窗体想给子窗体发信息,要添加消息对象,明确告知当前的父窗体,要发送消息的子窗体的window引用与messenger对象的名字:

// 父窗口中 - 添加消息对象, 明确告诉父窗口iframe的window引用与名字
 messenger.addTarget(iframe1.contentWindow, 'iframe1');

 // 父窗口中 - 可以添加多个消息对象
 messenger.addTarget(iframe2.contentWindow, 'iframe2');

(5) 发消息时,要指定messenger的名字和消息,例如父窗体要给子窗体发消息:

// 父窗口中 - 向单个iframe发消息
 messenger.targets['iframe1'].send(msg1);
 messenger.targets['iframe2'].send(msg2);
 // 父窗口中 - 向所有目标iframe广播消息
 messenger.send(msg);

2.实例

基于上面的介绍,下面要实现开篇提出的需求了(实例代码只是示例如何传递数据,没有更改父窗体url)。这里分别是父窗体和子窗体的代码实现,可直接在浏览器中打开查看效果,其中messenger.js可以在这里下载,放到项目目录下。

父窗体:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>父窗体</title>
    <style type="text/css"></style>
    <!-- 这个messenger.js可下载放到项目目录下 -->
    <script type="text/javascript" src="./messenger.js"></script>

</head>

<body>
    <div>这是父窗体</div>
    <div id="msg"></div>
    <iframe id="iframe1" name="iframe1" src="./child.html" width="600px" height="316px" style="z-index: 100000;position: absolute;">
    </iframe>
</body>
<script type="text/javascript">
    //父页面中,注册一个messager到一个统一的项目中,第一个参数为自己页面的名称,第二个参数为项目名称
    var messenger = new Messenger('parent', 'monitor'),
        iframe1 = document.getElementById('iframe1');

    //父页面中绑定监听消息事件,当接受到iframe1发来的消息后执行
    messenger.listen(function (msg) {
        // alert(msg);
        var oDiv = document.getElementById("msg");
        oDiv.innerHTML += msg;
        //todo
    });
</script>

</html>

子窗体:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>子窗体</title>
    <style type="text/css"></style>
    <!-- 这个messenger.js可下载放到项目目录下 -->
    <script type="text/javascript" src="./messenger.js"></script>

</head>

<body>
    <div style="background: #8CB08B;height:300px;">
        <div>这是子窗体</div>
        <input type="button" onclick="sendMessage('这是一条来自子窗体的消息!')" value="按钮" />
    </div>
</body>
<script type="text/javascript">
    //子页面中,注册一个messager到一个统一的项目中,第一个参数为自己页面的名称,第二个参数为项目名称
    var messenger = new Messenger('iframe1', 'monitor');

    //添加消息对象, 明确告诉子窗口iframe的window引用与名字
    messenger.addTarget(window.parent, "parent");

    function sendMessage(msg) {
        messenger.targets["parent"].send(msg);
    }
</script>

</html>

代码解释:

父窗体中嵌入iframe,要先引入messenger.js,同时初始化messenger到一个统一的项目中,其中第一个参数为自己页面messenger对象的名字,第二个参数为项目名称;然后父窗体要绑定监听消息事件,当接收到iframe子窗体发来的消息后执行。

子窗体也要先引入messenger.js,同时初始化一个messenger到一个统一的项目中,其中第一个参数为自己页面messenger对象的名字,第二个参数为项目名称;然后添加消息对象,告知子窗体的window引用与messenger对象的名字。然后在触发onclick事件时,向父窗口传递消息。发消息时,要指定接收消息的父窗体的messenger的名字,以及传递的消息。
3.小结

本文主要是介绍了一个MessengerJS方案及其使用方法,来解决父窗体与子窗体的通信问题。同时提供了一个完整的实例,可以实现子窗体向父窗体传递消息,父窗体通过监听消息事件,来获取子窗体消息的目的。如有问题,欢迎指正。

Qupath软件的安装与使用 Qupath软件的安装与使用软件安装软件下载软件安装【windows版】简单使用文件打开人工标注标注导出和导入 Qupath是一款开源的医学图像标注软件,适合放射影像及数字病理切片等的查看。同时,其自带的标注功能使得医生可以直接通过该软件进行病变区域的标注和分类。跟进一步的,该软件提供groovy脚本运行接口,可供操作者编写和运行脚本,将标注信息转换为xml或者json格式的数据进行进一步的后序处... 阅读详情

相关推荐

Vivado SDK中LWIP库版本冲突与RTL8211FDI兼容性实战解析

本文深入解析Vivado 2019.1 SDK中LWIP 1.0库与RTL8211FDI千兆PHY芯片的版本冲突问题,并提供实战解决方案。通过手动移植高版本LWIP库、整合第三方驱动及优化BSP配置,有效解决了以太网通信兼容性问题,确保千兆性能稳定运行。

ios99的博客 277

Windows Server 2008 R2 遗留系统维护指南:从安全初始化到迁移规划

在企业IT运维中,**遗留系统维护**与**服务器迁移**是常见的挑战,尤其当涉及已终止支持的平台如Windows Server 2008 R2。理解其核心原理在于,这类系统通常因依赖特定运行环境(如.NET Framework旧版本或专用驱动)而无法直接升级,其技术价值在于保障关键历史业务的连续性。从工程实践角度,处理此类系统的标准化流程包括:获取纯净安装介质、解决硬件驱动兼容性问题、在无官方更新的情况下通过配置策略建立安全基线,以及规划清晰的**数据迁移**路线。应用场景广泛覆盖遗留生产环境维护、数据提

weixin_34293059的博客 388

Django 前后端分离实战:网络设备运维系统 - 从登录认证到业务模块

这篇文章分享了Django+Vue前后端分离开发网络设备运维系统的实战经验,重点介绍了登录认证、全局布局和设备管理三大模块的实现。文章包含以下核心内容: 登录模块实现:包括表单验证、Token认证、记住密码功能,以及美观的UI设计(渐变背景、毛玻璃效果) 全局布局架构:采用侧边栏+顶部导航的响应式设计,支持菜单权限控制和多设备适配 业务功能开发:详细展示了设备分类和部门管理的CRUD功能实现,包括列表展示、搜索过滤、分页等功能 常见问题解决:提供了5个开发中常见问题的解决方案,如Vue Router警告、C

qq_16766705的博客 526

javascript iframe跨域传递数据

父页面与iframe子页面都需要引入MessengerJS 每个Messenger对象都需要唯一的名字, 这样它们才可以知道跟谁通信. // 父窗口中 - 初始化Messenger对象 var messenger = new Messenger('Parent'); // iframe中 - 初始化Messenger对象 var messenger = new Messenger('if...

u014051123的博客 944

从Maya到Unity:3D模型导入全流程避坑指南(含FBX导出设置)

本文详细解析了从Maya导出3D模型至Unity的全流程,重点剖析了FBX格式作为跨软件协作“中间人”的优劣与核心设置。指南涵盖了Maya端模型清理、FBX导出关键配置(如嵌入媒体、轴转换),以及Unity端的模型、材质、动画导入优化与常见问题(如材质丢失、UV法线错误、骨骼动画错乱)的实战解决方案,旨在帮助3D美术师与技术美术建立稳定、高效的工作流。

lg888的博客 795

samba源码编译安装(版本4.13.0)

这里写目录标题前言编译安装samba下载三个包安装依赖共需要安装samba、gnutls、nettle1、进入解压后的samba目录执行:2、进入解压后的gnutls目录执行3、进入解压后的nettle目录执行3.1 卸载已存在nettle3.2 编译3.3 make3.4 安装4、进入gnutls继续编译4.1 编译4.2 make4.3 安装5、再次进入解压后的samba目录5.1 执行./configure5.2 make5.3 samba安装启动samba 前言 一般来说,安装samba最快的方式应

灵葱的博客 1万+

vue中iframe嵌套页面父子组件互相通信

/iframe向父组件通信,子传父。

yqlnihao的博客 1331

F280049C Buffered Digital-to-Analog Converter (DAC)

使用DAC模块很简单,只需要配置参考电压,并写入DACVALS寄存器一个数字值即可。参考电压可配置为外部参考VDAC和内部参考电压1.65V和2.5V,并结合增益作为DAC模块最终的参考电压DACREF。举个例子,配置参考电压为内部参考电压1.65V,增益设置为2,则参考电压DACREF=3.3V,若向DACVALS写入数字值2048,则输出的DAC模块的输出带电压DACOUT=DACVALS×DACREF4096=1.65VDACOUT=

xht2403267701的博客 2370

总结:子窗口创建及父窗口与子窗口之间通信

1、Javascript弹出子窗口可以通过多种方式实现,下面介绍几种方法(1) 通过window对象的open()方法,open()方法将会产生一个新的window窗口对象    其用法为: window.open(URL,windowName,parameters);  URL: 描述要打开的窗口的URL地址,如何为空则不打开任何网页;  windowName:描述被打开的窗口的

Squirrel的专栏 7648

【实战解析】Ubuntu双网卡冲突:如何解决同一网段下网关无法访问及上网问题

本文深入解析Ubuntu服务器双网卡配置在同一网段时引发的路由冲突问题,导致网关无法ping通及无法上网。通过分析路由表与Metric值原理,提供使用route命令调整优先级及修改Netplan配置文件的实战解决方案,确保主次路由明确,一劳永逸解决网络冲突。

f9g0h的博客 285

语义通信理论必看论文:Towards a Theory of Semantic Communication

了解语义通信发展必看的一篇文章

一去不复返的通信er 3927

iframe 通信的三种方式(重点介绍postMessage)

- 父级html --> < button onclick = " postMessageBtn() " > postMessageBtn </ button > < iframe id = " myIframe " src = " http://172.30.10.18:8080/#/login " width = " 375 " height = " 700 " > </ iframe > < script > /**

weixin_46544600的博客 8561

UWB:FiRa Consortium UCI Generic Technical Specification v1.1.0(1)- UCI架构和通用数据包头

如果大家学习过WiFi的SPEC,比如从我的资源里面下载 IEEE 802.11-2007,应该很容易发现,FiRa的spec定义实在是太差了。有现成的好例子不学,非得自己来一套,搞一堆新的名词,其实都是一个意思。比如GID,OID等,而且GID、OID是最先出现的,但是对应表格 还得去附件的最后一项去找。 FiRa是UWB联盟,希望跟WIFi联盟学习一下,把UWB做大做强,而不是自成一派,自命不凡。

Ankie资深技术项目经理 2435

附实例!实现iframe父窗体与子窗体的通信

本文主要会介绍如何基于MessengerJS,实现iframe父窗体与子窗体间的通信,传递数据信息。同时本文会提供一个可运行的实例代码,实现在父窗体中,获取到来自子窗体的数据的效果。 0.背景介绍 (1)需要在当前的前端项目中,使用iframe嵌套别的站点页面。 (2)当子窗体触发了一个事件后,要给父窗体传一个跳转地址的url。父窗体监听到这个事件后,根据接收到的url,来更新当前...

weixin_30549657的博客 71

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

使用MessengerJS实现iframe子页面与父页面通信

本文主要会介绍如何基于MessengerJS,实现iframe父窗体与子窗体间的通信,传递数据信息。同时本文会提供一个可运行的实例代码,实现在父窗体中,获取到来自子窗体的数据的效果。 0.背景介绍 (1)需要在当前的前端项目中,使用iframe嵌套别的站点页面。 (2)当子窗体触发了一个事件后,要给父窗体传一个跳转地址的url。父窗体监听到这个事件后,根据接收到的url,来更新当前父窗体的url,实现页面的跳转。 1.采用方案 1.1 MessengerJS方案 可以采用MessengerJS方

weberhuangxingbo的博客 1053

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

子窗体调用父窗体的脚本方法

父窗体中有一个iframe,子窗体是通过iframe在父窗体中展现的 父窗体javascript代码: function Callout(telNum) { if(telNum!="") { if(Agent.MakeCall(telNum,0)) { document.getElementById("txtEvent")...

weixin_30677073的博客 69

父窗体与Iframe之间以及Iframe之间函数调用和传值

在父页面访问Iframe子窗体的txtAddress控件 window.frames["ifrMapCompanyDetails"].document.all("txtAddress").value = '地址' ; 在Iframe子窗体1访问父页面的TextBox1控件 , 子窗体1把值赋给子窗体2的某个控件 string strValue = "从子窗体传递给父页面的值" ; 下面是在Page...

iteye_12979的博客 145

iframe 子窗口互调用父窗口

//父窗口调用子窗口的方法:(获得子窗口的iframe的id) document.getElementById(“ifrmWlxx”).contentWindow.onExpressSave(); 子窗口调用父窗口的方法: window.parent.onAddressSaveOk() ...

小邯韩的博客 223

Iframe传值

自己实现过了的,javascript脚本关于Iframe之间以及与父窗体的值传递,事件调用问题; 在父页面访问Iframe子窗体的txtAddress控件window.frames["ifrMapCompanyDetails"].document.all("txtAddress").value = '地址' ; 在Iframe子窗体1访问父页面的TextBox1控...

dianlvedi1663的博客 92

iframe标签及父子页面传递数据

iframe 元素会创建包含另外一个文档的内联框架(即行内框架)。 frameborder:0/1(规定是否显示框架周围的边框。0:不显示,1:显示) iframe 元素,父子之间数据传递: 1.子向父通信 parent.html window.addEventListener('message',function(e){ console.log(e.data); if(e.data.msg==='xxx'){ //一些自己的业务逻辑

qq_44441669的博客 997

iframe 传值

父窗体: html代码: ------------------ <iframe id="content" style="width: 100%; height: 100%;" frameborder="0" scrolling="yes" src="about:blank"></iframe> js代码: var $ifr = $('#content'); 调用子窗体方法: $ifr[0].contentWindow.next(); // next()为子窗体方

mazhipeng888的专栏 523

【前端】JavaScript中Iframe之间以及父窗体的函数调用、传值

在父页面访问Iframe子窗体的txtAddress控件 window.frames[“ifrMapCompanyDetails”].document.all(“txtAddress”).value = ‘地址’ ; 在Iframe子窗体1访问父页面的TextBox1控件 , 子窗体1把值赋给子窗体2的某个控件 string strValue = “从子窗体传递给父页面的值” ; 下面是在Page_Load事件里面调用的,当然可以写在javascript脚本里面 this.Response.Write(“”

姜太小白的博客 441

关于iframe/子窗体与父窗体的交互

父子窗体交互方式通过contentWindow交互通过postMessage交互 通过contentWindow交互 主窗体内嵌的iframe或者是其通过js打开的新窗口都可以通过contentWindow与主窗体交互。所以首先需要获取到contentWindow才可以。要获取到可访问的contentWindow对象需要满足同源策略,这里需要保证两个窗口的域名完全相同才可以。也就是: 主窗体: ...

yinzhida's blog 463
上一篇: ts加密md5码封装
下一篇: Maven安装与配置
leoxiaoge
博客等级 码龄10年 17粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leoxiaoge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值