前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >附实例!实现iframe父窗体与子窗体的通信

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

原创
作者头像
前端林子
修改于 2018-11-10 03:02:27
修改于 2018-11-10 03:02:27
10K00
代码可运行
举报
文章被收录于专栏:前端技术总结前端技术总结
运行总次数:0
代码可运行

本文主要会介绍如何基于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对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 // 父窗口中 - 初始化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) 在发现消息前,目标文档要确保已经监听了消息事件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 messenger.listen(function(msg){
 	alert("收到消息: " + msg);
 });

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 父窗口中 - 添加消息对象, 明确告诉父窗口iframe的window引用与名字
 messenger.addTarget(iframe1.contentWindow, 'iframe1');

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 // 父窗口中 - 向单个iframe发消息
 messenger.targets['iframe1'].send(msg1);
 messenger.targets['iframe2'].send(msg2);
 // 父窗口中 - 向所有目标iframe广播消息
 messenger.send(msg);

2.实例

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

父窗体:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!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>

子窗体:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!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方案及其使用方法,来解决父窗体与子窗体的通信问题。同时提供了一个完整的实例,可以实现子窗体向父窗体传递消息,父窗体通过监听消息事件,来获取子窗体消息的目的。如有问题,欢迎指正。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
机器视觉系统硬件:工业相机
相机是机器视觉系统的核心部件,广泛应用于各个领域,如生产监控、测量任务和质量控制等。工业相机通常比常规的标准数字相机更加坚固耐用,这是因为它们必须能够应对各种复杂多变的外部影响,如应用于高温、高湿、粉尘等恶劣环境。工业相机的种类有很多,下图是常见的一些分类方式。下文将详细介绍几种常用类型的工业相机。
用户7699929
2020/08/27
1.4K0
机器视觉(第4期)----工业相机综述及接口介绍
上期我们一起学习了镜头的相关知识,戳下链接: 机器视觉(第3期)----图像采集之镜头原理详述 这期我们一起学习相机和接口的相关知识,工业相机是机器视觉系统中的一个关键组件,其最本质的功能就是将光信号转变成有序的电信号。选择合适的相机也是机器视觉系统设计中的重要环节,相机的选择不仅直接决定所采集到的图像分辨率、图像质量等,同时也与整个系统的运行模式直接相关。 本期主要内容: 相机的芯片类型 黑白相机成像原理 彩色相机成像原理 相机接口类型 线阵和面阵相机 相机常见参数介绍 一. 相机的芯片类型 一般情况下,
智能算法
2018/04/03
1.6K0
机器视觉(第4期)----工业相机综述及接口介绍
工业机器视觉系统相机如何选型?(理论篇—3)
数字图像是机器视觉系统工作的前提和基础,工业机器视觉系统把成像子系统的信号转换为反映现实场景的二维数字图像,并对其进行分析、处理,得出各种指令来控制机器的动作。
不脱发的程序猿
2021/05/08
1.9K0
工业机器视觉系统相机如何选型?(理论篇—3)
机器视觉基础应用知识详解
随着工业4.0时代的到来,机器视觉在智能制造业领域的作用越来越重要,为了能让更多用户获取机器视觉的相关基础知识,包括机器视觉技术是如何工作的、它为什么是实现流程自动化和质量改进的正确选择等。小编为你准备了这篇机器视觉入门学习资料。
小白学视觉
2021/08/06
1.1K0
(干货) |机器视觉不可不知的相机内部工作原理
工业相机是机器视觉系统中的一个关键组件,其最本质的功能就是将光信号转变成有序的电信号。选择合适的相机也是机器视觉系统设计中的重要环节,相机的选择不仅直接决定所采集到的图像分辨率、图像质量等,同时也与整个系统的运行模式直接相关。 一. 相机的芯片类型: 一般情况下,工业相机按照芯片类型可以分为CCD相机和CMOS相机,当然也有一些其他的芯片,比如富士公司生产的Super CCD芯片。这里我们只讨论市场主流的CCD相机和CMOS相机的工作原理。数码相机的CCD和CMOS都深藏于相机内部,就算您有机会看到它们的样
智能算法
2018/04/03
2.6K0
(干货) |机器视觉不可不知的相机内部工作原理
机器视觉系统之——镜头、相机介绍
1).分辨率(Resolution):相机每次采集图像的像素点数(Piels),对于数字工业相机机一般是直接与光电传感器的像元数对应的,对于模拟相机机则是取决于视频制式,PAL制为768*576,NTSC制为640*480。
AI机器视觉
2022/06/01
1.6K0
机器视觉系统之——镜头、相机介绍
一文讲透了什么是机器视觉!
机器视觉 就是用机器代替人眼来做测量和判断。机器视觉系统是指通过机器视觉产品(即图像摄取装置,分 CMOS 和CCD 两种)将被摄取目标转换成图像信号,传送给专用的图像处理系统,根据像素分布和亮度、颜色等信息,转变成数字化信号;图像系统对这些信号进行各种运算来抽取目标的特征,进而根据判别的结果来控制现场的设备动作。
AI算法与图像处理
2021/03/12
9580
一文讲透了什么是机器视觉!
机器视觉工业缺陷检测(光源,相机,镜头,算法)
视觉工业检测大体分为工件尺寸测量与定位,和表面缺陷检测,及各种Logo标识的检测与识别等。
机器学习AI算法工程
2021/10/14
18.4K0
机器视觉工业缺陷检测(光源,相机,镜头,算法)
工业相机的曝光、曝光时间、快门、增益
尽管摄影自诞生以来,无数人都在探索相机这个工具究竟能发挥那些作用。但一个最基本的作用,就是把我们眼睛看到的通过摄影来记录下来。
AI算法与图像处理
2021/03/14
6.4K0
机器视觉那些事
经常“打螺丝“的”吃席“观众就会发现,你看这个手机屏幕有没有划痕、这个构件有没有缺陷,要左手拿个电灯,右手拿起这个物品,反复的看反复的摸,大概耗时一分钟以上,一坤时以下,这个物品就被你”品鉴“出来了。如果后面”老板“发现还有被你遗漏的问题,”两电炮“是难免的。就像那句话:使卵石臻于完美的,并非锤的打击,而是水的且歌且舞,真正推动变革的并非被动应付,而是主动求索的精神,追求效率的操作者,为突破人工检测的局限,摸索出了机器视觉这个东西。
EatRice
2025/04/08
830
机器视觉那些事
工业相机与镜头选型方法(含实例)
工业相机与我们手机上面的相机或者我们单反相机不同,工业相机它能够使用各种恶劣的工作环境,比如说高温,高压,高尘等。工业相机主要有面阵相机和线阵相机,线阵相机主要用于检测精度要求很高,运动速度很快的场景,而面阵相机应用更为广泛。
全栈程序员站长
2022/08/30
2.8K0
工业相机与镜头选型方法(含实例)
一文详解工业相机和镜头选取
一问价格,至少都是大几千,贵的在十几万,心里就不禁有疑问,就这么一个破相机,为啥就卖这么贵?它跟我们常见的单反相机有什么区别?我用单反相机来拍,色彩又好,成像又清晰,它不香吗?为啥一定要用工业相机?
3D视觉工坊
2020/12/11
1.5K0
一文详解工业相机和镜头选取
机器视觉入门知识总结
一、机器视觉系统 工业相机类型:按照输出信号类型的不同分为模拟相机和数字相机两种。而数字相机按照接口标准不同,可以分为1394相机、USB相机、CameraLink相机以及Gige相机四种。其中CameraLink接口相机能够解决大数据量传送问题;Gige接口相机能够解决长距离、快速传输问题;而1394相机和USB接口相机具有简单易用、性价比高等特点; 镜头接口类型:C接口、CS接口、U接口等;
小白学视觉
2022/12/27
7920
干货||10个机器视觉常见问题
 选择相机却往往刻不容缓的的问题摆在机器视觉工程师面前,因此,选择相机了解以下几个方面问题:
小白学视觉
2022/09/28
5140
CCD传感器成像、尺寸、曝光时间「建议收藏」
参考博主@机器视觉001的博文 https://blog.csdn.net/liubing8609/article/details/78254703
全栈程序员站长
2022/09/05
3.5K0
机器视觉相机详解
工业相机相比于传统的民用相机而言,具有高的图像稳定性、高传输能力和高抗干扰能力等优点。目前市面上工业相机大多是基于CCD或CMOS芯片的相机。
周旋
2022/09/19
1K0
机器视觉相机详解
机器视觉检测系统中这些参数你都知道么?
摄像机是机器视觉系统中的一个关键组件,其最本质的功能就是将光信号转变成为有序的电信号。选择合适的摄像机也是机器视觉系统设计中的重要环节,摄像机的不仅是直接决定所采集到的图像分辨率、图像质量等,同时也与整个系统的运行模式直接相关。
小白学视觉
2019/06/19
3K0
机器视觉检测系统中这些参数你都知道么?
工业检测中黑白相机为什么比彩色工业相机更受青睐
相机是机器视觉解决方案系统的核心部件,广泛应用于各个领域,尤其是用于生产监控、测量任务和质量控制等。工业数字相机通常比常规的标准数字相机更加坚固耐用。这是因为它们必须能够应对各种复杂多变的外部影响,如应用于高温、高湿、粉尘等恶劣环境。工业相机的分类形式有很多,下文将详细介绍几种常用类型的工业相机。   面阵相机与线阵相机的区别在于前者是以面为单位进行图像采集,可以直接获得完整的二维图像信息,后者的以“线”为单位,虽然也是二维图形,但长度较长,而宽度却只有几个像素。这是因为线阵相机的传感器只有一行感光元素。虽然面阵相机的像元总数较多,但分布到每一行的像素单元却少于线阵相机,因此面阵相机的分辨率和扫描频率一般低于线阵相机。
小白学视觉
2022/09/28
9960
【Sensor有点意思】之重要参数理解
通过CMOS图像传感器感受环境光,输出图像供我们分析,通过sensor宣传册了解一下sensor性能和情况。下图以斯特威SC8238为例。
AomanHao
2024/08/07
3700
【Sensor有点意思】之重要参数理解
【Sensor有点意思】之重要参数理解
通过CMOS图像传感器感受环境光,输出图像供我们分析,通过sensor宣传册了解一下sensor性能和情况。下图以斯特威SC8238为例。
AomanHao
2023/07/20
2K0
推荐阅读
相关推荐
机器视觉系统硬件:工业相机
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验