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

news2024/12/24 11:37:10

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

本文参考:

控制两个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.coloradmin.cn/o/585229.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jetson硬件 升级jetpack系统 版本流程

前言&#xff1a; 准备一个linux系统电脑&#xff0c;一个跳线帽&#xff0c;以及一条usb线 以及英伟达开发者账号&#xff0c;点击https://developer.nvidia.com/zh-cn/embedded/jetpack进行注册 注意&#xff1a;烧录的目标硬件是以前装过低版本的jetpack&#xff0c;以下步…

工业自动化新引擎:工业机器人引领制造业转型升级

自2010年开始&#xff0c;我国15-64岁人口比例下滑&#xff0c;截至2022年我国总人数出现负增长&#xff0c;同比下滑0.1%&#xff0c;因人口老龄化加剧和出生率的持续走低&#xff0c;致使进入生产体系的劳动力越来越少。 随着我国经济进入新常态&#xff0c;制造业面临着产能…

通过训练NLP制作一个自己的简易输入法

最近开始研究NLP&#xff0c;然后根据手写CV UP主的视频&#xff0c;写了一个N Gram的NLP模型&#xff0c;算是该领域里的hello world吧。然后我又添加了几行代码实现了一个非常简易的输入法。 项目说明&#xff1a; 数据集可以自创&#xff0c;导入txt文件即可&#xff1b; …

K8s in Action 阅读笔记——【6】Volumes: attaching disk storage to containers

K8s in Action 阅读笔记——【6】Volumes: attaching disk storage to containers 在前三章中&#xff0c;我们介绍了Pods以及它们与ReplicationControllers、ReplicaSets、DaemonSets、Jobs和Services等Kubernetes资源的交互。现在&#xff0c;我们将回到Pod内部&#xff0c;…

【java 基础一】 纯语法基础记录

一、基础 1.1 变量 Java 变量是程序中存储数据的容器。 在 Java 中&#xff0c;变量需要先声明再使用&#xff0c;并且必须先声明再赋值。 声明变量&#xff1a;声明变量时需要指定变量的类型、名称和初始值。例如&#xff0c;声明一个整型变量可以如下所示&#xff1a; in…

水处理施工方案合集

编制说明及工程简介 (一) 编制说明 本施工组织设计是依据建设单位提供的招标文件、施工图、同类工程施工资料和国家有关施工规范及验收标准进行编制的。本施工组织设计针对本工程施工中的关键点、难点及其处理措施&#xff0c;主要施工方法&#xff0c;施工组织部署&#xff…

如何理解 CRM 客户关系管理系统?

如何理解 CRM 客户关系管理系统&#xff1f; CRM的作用不止是工具&#xff0c;根据用户和对象的不同&#xff0c;CRM创造的价值也是不同的。 打个比方: 有的企业是用CRM来管理客户信息;有的企业是用CRM来获取流量的&#xff1b;有的企业是用CRM来做销售管理的&#xff1b;还…

Springboot整合OSS并实现文件上传和下载

目录 一.OSS服务器开通并创建账户 二.Springboot整合OSS 1.创建springboot项目 2.整合OSS 三.postman测试 一.OSS服务器开通并创建账户 参考阿里云OSS的使用(全程请登陆)_zhz小白的博客-CSDN博客https://blog.csdn.net/zhouhengzhe/article/details/112077301 二.Springb…

深度学习笔记之循环神经网络(八)LSTM的轻量级变体——门控循环单元(GRU)

深度学习笔记之LSTM轻量级变体——门控循环单元[GRU] 引言回顾&#xff1a; LSTM \text{LSTM} LSTM的前馈计算过程 LSTM \text{LSTM} LSTM的问题 GRU \text{GRU} GRU的前馈计算过程 GRU \text{GRU} GRU的优势 引言 上一节介绍了从反向传播过程的角度认识 LSTM \text{LSTM} LST…

【29】核心易中期刊推荐——计算语言学人工智能(AI)技术

🚀🚀🚀NEW!!!核心易中期刊推荐栏目来啦 ~ 📚🍀 核心期刊在国内的应用范围非常广,核心期刊发表论文是国内很多作者晋升的硬性要求,并且在国内属于顶尖论文发表,具有很高的学术价值。在中文核心目录体系中,权威代表有CSSCI、CSCD和北大核心。其中,中文期刊的数…

使用javascript-obfuscator给js文件加密

一、安装javascript-obfuscator包 npm install javascript-obfuscator -g二、默认配置直接压缩文件 javascript-obfuscator miniprogram/src/utils/utils_create_sign.js --output miniprogram/src/utils/create_sign.js三、根据配置文件压缩文件 3.1、创建mixs.json配置文…

前端阿里云OSS直传,微信小程序版本

前言&#xff1a; 网络上许多的文章资料&#xff0c;全是使用阿里云官方的SDK&#xff0c;ali-oss插件去做直传。可是各位素未谋面的朋友要注意&#xff0c;这个SDK它支持web环境使用&#xff0c;也就是PC端浏览器。 当项目环境切换到微信小程序&#xff0c;是无法使用这种方…

Power BI Embedded自动缩放容量,为公司每个月节省上万元

哎&#xff0c;不知道今年行情怎么就这样了&#xff0c;大厂一边大批毕业生&#xff0c;一边大量招人。难道是今年的新人便宜&#xff1f;就连道哥&#xff08;吴翰清&#xff0c;阿里P10&#xff0c;中国顶级黑客&#xff09;都从阿里离职了&#xff0c;当年年少不懂学计算机&…

Nodejs批量处理图片小工具:批量修改图片信息

小工具一&#xff1a;批量修改文件夹里面的图片名称 步骤&#xff1a; 1.安装nodejs。 2.根据需要修改editFileName(filePath, formatName)函数的参数&#xff0c;也可以不改&#xff0c;直接将renameFile.js和img文件夹放在同一个目录下。 3.在renameFile.js目录下开启终端…

SQL报错this is incompatible with sql_mode=only_full_group_by

一、bug记录 1.1.bug截图 1.2.sql语句 SELECT id,batch_no,if_code,channel_mch_no,bill_date,bill_type,currency,order_id, channel_order_no,channel_amount,channel_fee_amount,channel_success_at, channel_user,channel_state,org_pay_order_id,channel_refund_amoun…

曾经由盛转衰的骈文,却引领后人在文质兼美的创作之路上坚定前行

又叫骈体文&#xff0c;是和散文相对应的一种文体&#xff0c;它兴起于汉末&#xff0c;形成于魏晋&#xff0c;最盛行于南北朝&#xff0c;在初唐、中唐、唐末、五代、宋初时也盛极一时。古人语&#xff1a;两马并驾为骈&#xff0c;所以骈文最大的特点是用对偶的手法&#xf…

Fiddler抓包工具之fiddler设置手机端抓包

fiddler设置手机端抓包 安卓手机抓包 第一步&#xff1a;配置电脑和安卓的相关设置 1、手机和fiddler位于同一个局域网内&#xff1b;首先从fiddler处获取到ip地址和端口号&#xff1a; &#xff0c;点击online&#xff0c;最后一行就是ip地址 2、路径&#xff1a;Tools》O…

数据库基础——10.子查询

这篇文章来讲一下数据库的子查询 目录 1. 需求分析与问题解决 1.1 实际问题 1.2 子查询的基本使用 1.3 子查询的分类 2. 单行子查询 2.1 单行比较操作符 2.2 代码示例 2.3 HAVING 中的子查询 2.4 CASE中的子查询 2.5 子查询中的空值问题 2.5 非法使用子查询​编辑…

数字IC验证高频面试问题整理(附答案)

后台有同学私信想要验证的面试题目&#xff0c;这不就来了~ Q1.权重约束中”:”和 /”的区别 : 操作符表示值范围内的每一个值的权重是相同的,比如[1:3]:40,表示1&#xff0c;2&#xff0c;3取到的概率为40/120&#xff1b; :&#xff0f;操作符表示权重要平均分到值范围内的…

spring security(密码编码器、授权,会话)

目录 密码编码器 授权决策 AffirmativeBased ConsensusBased UnanimousBased 授权 web授权 HttpSecurity常用方法及说明 方法授权 会话控制 会话超时 安全会话cookie 密码编码器 Spring Security为了适应多种多样的加密类型&#xff0c;又做了抽象&#xff0c;D…