两个iframe同时滚动实现界面内容对比功能

news/2025/3/20 11:42:38/

背景:因为要实现一个版本对比功能,所以要保证两个界面能同时滚动。(本文只讲同时滚动,对比功能文本只讲思路,具体代码实现如有需要 可以联系我),因为过程中有部分收获特此记录。

本文参考:

控制两个iframe页面同时滚动_IDC笔记

同步滚动(两个iframe内嵌同一个html页面进行)_ifame根据父页面一起滚动_寒凌冰封的博客-CSDN博客

解决方案:

方案一(本人未采用、但测试可用)、

优点,方面快捷简单

缺点,必须是独立每个子界面

直接通过在子界面的boby标签上加 onscroll事件,让右边滚动数量 等于 左边滚动数量。

父界面代码:

<html><head><meta charset="UTF-8"><title>测试同步滚动</title></head><body><table border="1" cellpadding="0" cellspacing="0" width="600" height="500"><tr><td height="500" width="50%"><iframe name="left" src="left.htm" width="100%" height="100%"></iframe></td><td height="500" width="50%"><iframe name="right" src="right.htm" width="100%" height="100%"></iframe></td></tr></table>
</body>
</html>

子界面left:


<html><head><meta charset="UTF-8"><title>界面left</title></head>
<body id="body" onscroll="parent.left.body.scrollTop=parent.right.body.scrollTop">
<pre>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40</pre>
</body>
</html>

子界面right:


<html><head><meta charset="UTF-8"><title>界面right</title></head>
<body id="body" onscroll="parent.right.body.scrollTop=parent.left.body.scrollTop" scroll="no">
<pre>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40</pre>
</body>
</html>

运行效果:

注意:这个代码不能直接通过 file:///C:/Users/zhangsan/Desktop/test/indx.html 这样去访问,需要放到应用服务器中(tomcat等)运行,会报域安全问题,报错如下

方案二(本人采用的)、

优点,可以实现N个界面同时滚动和对比。

缺点,姑且算要多写几行代码吧。

采用通过监听页面的滚动事件来同步调用另外一个界面进行滚动。

具体做法是在子界面上建立监听方法,然后再方法内掉用父界面方法,父界面方法去调用对应子界面的滚动。

父界面代码:

<div style="width: 100%;height: 15%;text-align: center;" ><center><table style="padding-top: 50px;"><tr><td>更换左边版本号:</td><td><input id="leftVersion" valueField="versionNo" textField="versionNo" class="nui-combobox"  dataField="data" style="width: 200px;" allowInput="true" emptyText="请选择...." onvaluechanged="changedVersion"/></td><td width="50px"></td><td>更换右边版本号:</td><td><input id="rightVersion" valueField="versionNo" textField="versionNo" class="nui-combobox"  dataField="data" style="width: 200px;" allowInput="true" emptyText="请选择...." onvaluechanged="changedVersion"/></td></tr></table></center></div><div style="width: 99%;height: 80%;" ><table style="width: 100%;height: 100%; "  ><tr><td><div id="version1" style="text-align: center;color: #00994C;font-size: 18px;"></div><iframe id="iframe1" name="iframe1" src="<%= request.getContextPath() %>/monitoring/targetManager/targetDetail.jsp?versionName=version1" style="width: 100%;height: 100%;" ></iframe></td><td><div id="version2" style="text-align: center;color: #00994C;font-size: 18px;"></div><iframe id="iframe2" name="iframe2" src="<%= request.getContextPath() %>/monitoring/targetManager/targetDetail.jsp?versionName=version2" style="width: 100%;height: 100%;" ></iframe></td></tr></table></div>
<script type="text/javascript">function srcollTop(versionName,topNum){if(versionName == "version1"){$(window.frames["iframe2"].document).scrollTop(topNum);}else if(versionName == "version2"){$(window.frames["iframe1"].document).scrollTop(topNum);}}//后面代码是做两个版本数据比较的,这里就不放上来了
</script >

注意:versionName 参数是来标识 是那个子界面的。

踩坑:这里使用如果有使用前端框架的iframe需要注意,有些框架的iframe会导致 $(window.frames["XXX"] 获取不到,console打印 出现空数组“[]”,虽然空数组  点击打开里面又有这个iframe 对象信息,实际不可用,这里我搞了半天,如果出现该问题,建议换成我代码中的形式。

PS:版本对比思路是(不做对比跳过),版本1、版本2两个数据存放 采用 key - value 格式 这样遍历的时候 就可以 通过 for(key in versionAyy) 来遍历,通过 key去获取另外一个数组的 内容,然后两个进行比较(当遇到多选框、复选框 只展示差异选项时,通过字符截取 获取选择项 然后逐一对比,获取差异项存放到另一个差异项数组中),如果差异就 存放到一个差异集合,子界面再调用即可,这里就不放上来了,如有需要或者探讨可以联系我。

子界面js代码:

//获取地址栏参数,标记当前界面是谁function getParmar(name){var reg = new RegExp("(^|&)"+name+"=([^&]*)(&|$)");var r = window.location.search.substr(1).match(reg);if(r != null){return unescape(r[2]);}return null;}/*以下 try 模块只在对比界面生效,这里要兼容其他功能也需要调用该界面*/try{//获取对比界面传递的参数var versionName = getParmar("versionName");console.log(versionName+" 界面");if(versionName == "version1"){//这里是获取父界面存放的数据做数据展示var date = parent.getData1();//表单填充方法,这个方法就不放上来了,根据需要自行定义,SetData(date);}else{//这里是获取父界面存放的数据做数据展示var date = parent.getData2();//表单填充方法,这个方法就不放上来了,根据需要自行定义,SetData(date);}//绑定滚动事件 如不做对比,上面代码请忽略$(window).scroll(function(){var topNum = $(window).scrollTop();//调用父类滚动方法parent.srcollTop(versionName,topNum);});}catch (e) {// TODO: handle exception}

最后效果如下:


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

相关文章

Hack The Box - appointment关卡

TASK 1 任务 1 What does the acronym SQL stand for? 首字母缩略词SQL代表什么&#xff1f; Structured Query LanguageTASK 2 任务 2 What is one of the most common type of SQL vulnerabilities? 最常见的 SQL 漏洞类型之一是什么&#xff1f; SQL Injection TASK …

人脸识别3:C/C++ InsightFace实现人脸识别Face Recognition(含源码)

人脸识别3&#xff1a;C/C InsightFace实现人脸识别Face Recognition(含源码) 目录 1. 前言 2. 项目安装 &#xff08;1&#xff09;项目结构 &#xff08;2&#xff09;配置开发环境(OpenCVOpenCLbase-utilsTNN) &#xff08;3&#xff09;部署TNN模型 &#xff08;4&a…

伺服系统使用S曲线

在之前文章《S形曲线规划方式汇总》 介绍过贝塞尔曲线方式&#xff0c;并且在Marlin开源工程中也有贝塞尔曲线步进系统的实现方式。本篇介绍伺服系统中基于时间分割法实现的贝塞尔S曲线。 1 贝塞尔曲线路程规划 上文中推导过贝塞尔曲线&#xff0c;本文直接用结论&#xff1a…

matlab影像读取相关函数

geotiffred函数 [A, R] geotiffread(filename) 其中&#xff1a; filename 是要读取的 GeoTIFF 文件的路径和名称。A 是返回的地理影像数据&#xff0c;以 MATLAB 数组的形式表示。对于单波段影像&#xff0c;A 是一个二维数组&#xff1b;对于多波段影像&#xff0c;A 是…

immutable深拷贝:数据多层属性-不可变数据结构

一、为何要用immutable深拷贝&#xff1f; 1.浅拷贝&#xff08;浅复制&#xff09; //引用赋值-浅复制、浅拷贝 var obj{name:"溜溜球"}var obj2obj;obj2.name"刘刘球";console.log(obj);//name:"刘刘球"console.log(obj2);//name:"刘刘…

物联网GPRS模块流量计算

物联网GPRS模块流量计算 MQTT(消息队列遥测传输) 是ISO 标准下一个基于TCP/IP的消息发布/订阅传输协议。 一、TCP消耗流量计算 以太网数据包结构&#xff1a; 以太网首部 IP首部 TCP首部 APPL首部 用户数据 以太网尾部 以太网首部为14个字节 IP首部为20个字节 TCP首部…

【Vue3】如何创建Vue3项目及组合式API

文章目录 前言 一、如何创建vue3项目&#xff1f; ①使用 vue-cli 创建 ②使用可视化ui创建 ③npm init vite-app ④npm init vuelatest 二、 API 风格 2.1 选项式 API (Options API) 2.2 组合式 API (Composition API) 总结 前言 例如&#xff1a;随着前端领域的不断发展&am…

Java工程师的工作内容以及需要掌握的技术要求

文章目录 1、Java工程师的基本要求包括 2、Java工程师需要掌握的技能包括 总结 1、Java工程师的基本要求包括 精通Java编程语言及相关技术熟悉常用的Java开发框架&#xff0c;如Spring、Hibernate等熟悉Web开发技术&#xff0c;如HTML、CSS、JavaScript等熟悉数据库开发技术…