DOM【事件、操作节点、DOM案例】--学习JavaEE的day49

day49

JS核心技术

DOM

继day48

事件
键盘事件

监听器:onkeydown、onkeypress、onkeyup

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		
		<input type="text" 
			onkeydown="myDown()"
			onkeypress="myPress()"
			onkeyup="myUp()"
		/>
		
		<script type="text/javascript">
			
			function myDown(){//键盘按下事件
				console.log("down");
			}
			
			function myPress(){//键盘按下事件 - 功能键(上下左右、删除键...)是不会被触发的
				console.log("press");
			}
			function myUp(){//键盘松开事件
				console.log("up");
			}			
		</script>
			
		
	</body>
</html>

运行:注意Tab只触发了一个事件,回车与其他功能键不同
键盘事件

案例

设置一个文本框,每敲一个字母,会触发将输入文本转换为大写的函数。

注:键盘按下字母为小写,松开字母变为大写,可见我们设置的监听器onkeyup

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		
		<input type="text" 
			onkeyup="myUp(this)"
		/>
		
		<script type="text/javascript">

			function myUp(obj){
				//获取value属性
				var v = obj.value;
				//转大写
				v = v.toUpperCase();
				//设置value属性
				obj.value = v;
			}			
		</script>
		
	</body>
</html>
鼠标事件

onMouseDown 按下鼠标时触发
onMouseOver 鼠标经过时触发
onMouseUp 按下鼠标松开鼠标时触发
onMouseOut 鼠标移出时触发
onMouseMove 鼠标移动时触

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		
		<img src="../../img/波多野结衣.jpg" width="100px" height="100px"
			onmousedown="myDown()"
			onmouseup="myUp()"
			onmousemove="myMove()"
			onmouseover="myOver()"
			onmouseout="myOut()"
		/>
		
		<script type="text/javascript">
			
			function myDown(){//鼠标按下事件
				console.log("down");
			}
			
			function myUp(){//鼠标松开事件
				console.log("up");
			}
			
			function myMove(){//鼠标移动事件
				console.log("move");
			}
			
			function myOver(){//鼠标移入事件
				console.log("over");
			}
			
			function myOut(){//鼠标移出事件
				console.log("out");
			}
			
			
		</script>
		
	</body>
</html>

运行:鼠标移入–鼠标移动–鼠标按下–鼠标松开–鼠标移动–鼠标移出
鼠标事件

案例

一个类似游戏选英雄,选中深色,未选中灰色;鼠标移入移出事件加cs样式来简单实现

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			img{
				width: 100px;
				height: 100px;
				opacity: 0.3;/*设置透明度*/
			}
		</style>
	</head>
	<body>
		
		<img src="../../img/波多野结衣.jpg" onmouseover="myOver(this)" onmouseout="myOut(this)"/>
		<img src="../../img/星空一花.jpg" onmouseover="myOver(this)" onmouseout="myOut(this)"/>
		<img src="../../img/樱井步.jpg" onmouseover="myOver(this)" onmouseout="myOut(this)"/>
		<img src="../../img/tx1.jpg" onmouseover="myOver(this)" onmouseout="myOut(this)"/>
		<img src="../../img/tx2.jpg" onmouseover="myOver(this)" onmouseout="myOut(this)"/>
		<img src="../../img/tx3.jpg" onmouseover="myOver(this)" onmouseout="myOut(this)"/>
		
		<script type="text/javascript">
			
			function myOver(obj){//鼠标移入事件
				obj.style.opacity = 1;
			}
			
			function myOut(obj){//鼠标移出事件
				obj.style.opacity = 0.3;
			}
		</script>
	</body>
</html>

运行:
鼠标事件案例

案例优化

动态绑定事件

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			img{
				width: 100px;
				height: 100px;
				opacity: 0.3;/*设置透明度*/
			}
		</style>
	</head>
	<body>
		
		<img src="../../img/波多野结衣.jpg" />
		<img src="../../img/game01.jpg" />
		<img src="../../img/星空一花.jpg" />
		<img src="../../img/tx1.jpg" />
		<img src="../../img/tx2.jpg" />
		<img src="../../img/tx3.jpg" />
		
		<script type="text/javascript">
			
			//动态绑定事件
			var imgArr = document.getElementsByTagName("img");
			for(var i = 0;i<imgArr.length;i++){
				
				var img = imgArr[i];
				img.onmouseover = function(){
					this.style.opacity = 1;
				}
				img.onmouseout = function(){
					this.style.opacity = 0.3;
				}
			}
			
		</script>
	</body>
</html>
焦点事件

onfocus获取焦点事件

onblur失去焦点事件

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		
		<input type="text"
			onfocus="myFocus()"
			onblur="myBlur()"	
		/>
		
		<script type="text/javascript">
			
			function myFocus(){//获取焦点事件
				console.log("focus");
			}
			
			function myBlur(){//失去焦点事件
				console.log("blur");
			}
			
			
		</script>
		
	</body>
</html>

运行:点进去–退出来
焦点事件

案例

写一个注册账号的文本框,默认显示“请输入账号…”,光标定位到之后,自动将里面的信息清除掉

注意:这里的条件判断和正则表达式是优化,浏览器老版本不支持trim【trim表获取该函数里代码,trim()表调用】,js使用正则表达式很普遍

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		
		<input type="text"
			value="请输入账号..."
			onfocus="myFocus(this)"
			onblur="myBlur(this)"	
		/>
		
		<script type="text/javascript">
			
			function myFocus(obj){//获取焦点事件
				if(obj.value == "请输入账号..."){
					obj.value = "";
				}
			}
			
			function myBlur(obj){//失去焦点事件
				
				//获取该函数里的代码,如果当前浏览器支持该函数,就返回函数里的代码(字符串),如果不支持就返回undefined
				//alert(obj.value.trim);
				
				//判断浏览器是否兼容次方法
				if(obj.value.trim){
					if(obj.value.trim() == ""){
						obj.value = "请输入账号...";
					}
				}else{
					//注意:IE老版本是不支持trim()
					//将字符串的首尾空格的字符替换成空字符串,以达到去空格的目的
					if(obj.value.replace(/(^\s+)|(\s+$)/g,"") == ""){
						obj.value = "请输入账号...";
					}
				}
				
				
			}
			
			
		</script>
		
	</body>
</html>

运行:
焦点事件案例

操作节点

添加节点

创建新的 HTML 元素

如需向 HTML DOM 添加新元素,必须首先创建该元素(元素节点),然后向一个已存在的元素追加该元素。

删除节点

如需删除 HTML 元素,必须首先获得该元素的父元素

注意:对于删除节点观察,这里查的元素是id为manager的标签div,如果在此标签外有换行之类的标签会出现删除不到,也可以说是查不到

addP()方便理解,简单添加标签使用innerHTML可简化

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		
		<button onclick="addP()">添加p标签</button>
		<button onclick="addImg()">添加img标签</button>
		<button onclick="deleteImg()">删除img标签</button>
		
		<div id="manager"></div>
		
		<script type="text/javascript">
			
			var manager = document.getElementById("manager");
			
			function addP(){
				//创建节点 - <p></p>
				var p = document.createElement("p");
				
				//创建文本内容 - 用良心做教育
				var text = document.createTextNode("用良心做教育");
				
				//将文本内容添加到节点里 - <p>用良心做教育</p>
				p.appendChild(text);
				
				//将节点添加到div中
				manager.appendChild(p);
			}
			
			function addImg(){
				//创建节点 - <img />
				var img = document.createElement("img");
				
				//设置属性
				img.setAttribute("src","../../img/tx2.jpg");
				img.setAttribute("width","100px");
				img.setAttribute("height","100px");
				
				//创建节点 - <br/>
				var br = document.createElement("br");
				
				//将节点添加到div中
				manager.appendChild(img);
				manager.appendChild(br);
				
			}
			
			function deleteImg(){
				//删除思路:由父节点删除子节点
				
				//查询需要删除的节点
				var img = document.getElementsByTagName("img")[0];
				var br = document.getElementsByTagName("br")[0];
				
				
				manager.removeChild(img);
				manager.removeChild(br);
				
			}
			
		</script>
	</body>
</html>

运行:
操作节点

案例

删除学生信息

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		
		<table border="1" width="300px">
			
			<tr>
				<th>姓名</th>
				<th>性别</th>
				<th>年龄</th>
				<th>操作</th>
			</tr>
			
			<tr>
				<td>小希</td>
				<td></td>
				<td>27</td>
				<td>
					<button onclick="myDelete(this)">删除</button>
				</td>
			</tr>
			<tr>
				<td>小阳</td>
				<td></td>
				<td>23</td>
				<td>
					<button onclick="myDelete(this)">删除</button>
				</td>
			</tr>
			<tr>
				<td>小西</td>
				<td></td>
				<td>25</td>
				<td>
					<button onclick="myDelete(this)">删除</button>
				</td>
			</tr>
			<tr>
				<td>小香</td>
				<td></td>
				<td>24</td>
				<td>
					<button onclick="myDelete(this)">删除</button>
				</td>
			</tr>
			
		</table>
		
		<script type="text/javascript">
			
			function myDelete(obj){
				
				var tr = obj.parentNode.parentNode;
				var table = tr.parentNode;
				table.removeChild(tr);
			}
			
		</script>
	</body>
</html>

运行:
节点案例

案例
计算器案例

计算器案例:获取元素值不用查询的方法,过于繁琐,text01.value;

注意获取值需要将文本框String类型转Int类型

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		
		<input type="text" id="text01"/>
		+
		<input type="text" id="text02"/>
		<button onclick="add()">=</button>
		<input type="text" id="text03"/>
		
		<script type="text/javascript">
			
			function add(){
				//获取到输入框的value是string类型
				var result = parseInt(text01.value) + parseInt(text02.value);
				text03.value = result;
			}
			
		</script>
	</body>
</html>
做级联下拉列表— 二级联动(省 市)

首先编写两个下拉列表

获取其中一个下拉列表

并为其绑定onchange事件

并获取其选中的值:var optionVal = select.value;

然后根据选中的值,重新设置另一个下拉列表的innerHTML

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		
		<select id="province">
			<option value="sc">四川</option>
			<option value="hn">湖南</option>
			<option value="hb">湖北</option>
		</select><select id="city">
			<option>成都</option>
			<option>绵阳</option>
			<option>雅安</option>
			<option>乐山</option>
			<option>攀枝花</option>
		</select><script type="text/javascript">
			
			//给省份绑定改变事件
			province.onchange = function(){
				if(this.value == "sc"){
					city.innerHTML = "<option>成都</option><option>绵阳</option><option>雅安</option><option>乐山</option><option>攀枝花</option>";
				}else if(this.value == "hn"){
					city.innerHTML = "<option>长沙</option><option>永州</option><option>娄底</option><option>益阳</option><option>张家界</option>";
				}else if(this.value == "hb"){
					city.innerHTML = "<option>武汉</option><option>黄冈</option><option>仙桃</option><option>咸宁</option><option>孝感</option>";
				}
			}
			
		</script>
	</body>
</html>

运行:
二级联动案例

案例优化
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		
		<select id="province">
			<option value="sc">四川</option>
			<option value="hn">湖南</option>
			<option value="hb">湖北</option>
		</select><select id="city">
			<option>成都</option>
			<option>绵阳</option>
			<option>雅安</option>
			<option>乐山</option>
			<option>攀枝花</option>
		</select><script type="text/javascript">
			
			//给省份绑定改变事件
			province.onchange = function(){
				if(this.value == "sc"){
					updateCity(["成都","绵阳","雅安","乐山","攀枝花"]);
				}else if(this.value == "hn"){
					updateCity(["长沙","永州","娄底","益阳","张家界"]);
				}else if(this.value == "hb"){
					updateCity(["武汉","黄冈","仙桃","咸宁","孝感"]);
				}
			}
			
			function updateCity(arr){
				//清空city列表
				city.length = 0;
				
				for(var i = 0;i<arr.length;i++){
					var option = document.createElement("option");
					option.innerText = arr[i];
					city.appendChild(option);
				}
				
				
			}
			
		</script>
	</body>
</html>
提交案例–表单验证

用户名不能为空

密码和确认密码是否一致

表单项不符合条件不能提交表单

表单的提交事件—onsubmit

通过返回值判断是否提交,再设置条件,还进行提示优化,调用函数注意返回值【onsubmit】

方式1:有id
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			span{
				color: red;
			}
		</style>
	</head>
	<body>
		
		<form id="registerForm" action="#" method="post">
			账户:<input type="text" id="username" /><span></span><br />
			密码:<input type="password" id="password" /><span></span><br />
			确认密码:<input type="password" id="repassword" /><span></span><br />
			
			<input type="submit" value="提交" />
			
		</form>
		
		<script type="text/javascript">
			
			var span01 = document.getElementsByTagName("span")[0];
			var span02 = document.getElementsByTagName("span")[1];
			var span03 = document.getElementsByTagName("span")[2];
			
			//给表单绑定提交事件
			registerForm.onsubmit = function(){
				
				span01.innerText = "";
				span02.innerText = "";
				span03.innerText = "";
				
				var bool = true;
				
				if(username.value.trim() == ""){
					span01.innerText = "账号不能为空";
					bool = false;
				}
				
				if(password.value.trim() == ""){
					span02.innerText = "密码不能为空";
					bool = false;
				}
				
				if(repassword.value.trim() == ""){
					span03.innerText = "确认密码不能为空";
					bool = false;
				}else if(repassword.value.trim() != password.value.trim()){
					span03.innerText = "确认密码与密码不一致";
					bool = false;
				}
				
				return bool;
			}
			
		</script>
		
	</body>
</html>

运行:
提交案例

方式2:无id,直接是函数

注意:οnsubmit=“return fun01()”,要写return,因为返回值要返回给事件,不然会出现直接就可以提交的问题

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			span{
				color: red;
			}
		</style>
	</head>
	<body>
		
		<form action="#" method="post" onsubmit="return fun01()">
			账户:<input type="text" id="username" /><span></span><br />
			密码:<input type="password" id="password" /><span></span><br />
			确认密码:<input type="password" id="repassword" /><span></span><br />
			
			<input type="submit" value="提交" />
			
		</form>
		
		<script type="text/javascript">
			
			var span01 = document.getElementsByTagName("span")[0];
			var span02 = document.getElementsByTagName("span")[1];
			var span03 = document.getElementsByTagName("span")[2];
			
			function fun01(){
				
				span01.innerText = "";
				span02.innerText = "";
				span03.innerText = "";
				
				var bool = true;
				
				if(username.value.trim() == ""){
					span01.innerText = "账号不能为空";
					bool = false;
				}
				
				if(password.value.trim() == ""){
					span02.innerText = "密码不能为空";
					bool = false;
				}
				
				if(repassword.value.trim() == ""){
					span03.innerText = "确认密码不能为空";
					bool = false;
				}else if(repassword.value.trim() != password.value.trim()){
					span03.innerText = "确认密码与密码不一致";
					bool = false;
				}
				
				return bool;
			}
			
		</script>
		
	</body>
</html>

小结

DOM:事件、操作节点、DOM案例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/639854.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网站工作原理

web发展史 1.0时代不可修改 2.0可修改&#xff0c;比如发微博 有以下问题&#xff1a; 课程2&#xff1a; 静态页面 html 动态页面 php 经过服务端的语言解释器&#xff0c;解析成html文件&#xff0c;剩下的就和静态流程一样 后面三个是web服务器&#xff0c;语言解释器&…

恶劣天候鲁棒三维目标检测论文整理

恶劣天候鲁棒三维目标检测论文整理 Sunshine to Rainstorm: Cross-Weather Knowledge Distillation for Robust 3D Object DetectionRobo3D: Towards Robust and Reliable 3D Perception against CorruptionsLossDistillNet: 3D Object Detection in Point Cloud Under Harsh W…

Android Low Storage机制之DeviceStorageMonitorService

一、Android 版本 Android 13 二、low storage简介(DeviceStorageMonitorService) 设备存储监视器服务是一个模块&#xff0c;主要用来&#xff1a; 1.监视设备存储&#xff08;“/ data”&#xff09;。 2.每60秒扫描一次免费存储空间(谷歌默认值) 3.当设备的存储空间不足…

prometheusgrafananode_export搭建监控平台

一、环境要求 1、docker安装docker环境 2、docker安装prometheus 3、docker安装grafana 4、node-exportor(安装在被测服务器上) 5、我的服务器是Ubuntu 二、docker 安装prometheus 1、下载Prometheus镜像 docker pull prom/prometheus 2、检查端口是否被占用 安装netstat命…

Vitis HLS 学习笔记--抽象并行编程模型-控制驱动与数据驱动

目录 1. 简介 2. Takeaways 3. Data-driven Task-level Parallelism 3.1 simple_data_driven 示例 3.2 分析 hls::task 类 3.3 分析通道(Channel) 3.4 注意死锁 4. Control-driven Task-level Parallelism 4.1 理解控制驱动的 TLP 4.2 simple_control_driven 示例 4…

开源实用!猫抓媒体嗅探浏览器插件

CatCatch&#xff1a;网络资源&#xff0c;一触即发 - 精选真开源&#xff0c;释放新价值。 概览 CatCatch是一个专为浏览器设计的资源嗅探扩展&#xff0c;旨在帮助用户轻松捕获和分析网页中的各种资源。无论是视频、音频还是其他类型的文件&#xff0c;猫爪都能提供直观的界…

C++青少年简明教程:If选择语句

C青少年简明教程&#xff1a;If选择语句 C中选择语句的语法是&#xff1a; if (条件) { 条件成立时需要执行的语句... } [else { 条件不成立时需要执行的语句... }] 说明&#xff1a; if后面使用一个括号&#xff0c;括号里是条件——关系表达式。 所谓的关系表达式就是判…

Java基础之异常(简单易懂)

异常 1.JAVA异常体系 &#xff08;1&#xff09;Throwable类(表示可抛)是所有异常和错误的超类&#xff0c;两个直接子类为Error和Exception,分别表示错误和异常;其中异常类Exception又分为运行时异常和非运行时异常&#xff0c;这两个异常有很大区别&#xff0c;运行时异常也…

生成式AI改变的不只是应用场景,而是要重塑整个行业

即使是在各种创新技术不断涌现的IT行业&#xff0c;生成式AI也可以当之无愧地说是当前全球最受关注的焦点领域&#xff0c;没有之一。 那么对于企业来说&#xff0c;生成式AI技术究竟可以为他们带来怎样的变化和革新&#xff1f;企业又能从中获得怎样的收益&#xff1f; 作为一…

靠着单干实现财富自由,可太爽了

这里所说的“单干”&#xff0c;并不是单打独斗的意思&#xff0c;而是一种商业认知&#xff0c;以及由这种认知衍生出来的商业模式、商业方法和商业实践。 之前提到单干&#xff0c;会本能地以为它是指脱离公司等组织形式&#xff0c;自己一个人做生意。现在单干有了更丰富的…

医院门诊互联电子病历|基于SSM+vue的医院门诊互联电子病历管理信息系统的设计与实现(源码+数据库+文档)

医院门诊互联电子病历管理信息系统 目录 基于SSM&#xff0b;vue的医院门诊互联电子病历管理信息系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2后台登录模块 5.2.1管理员功能 5.2.2用户功能 5.2.3医生功能 四、数据库设计 五、核心代码…

源网络地址转换SNAT

左上角的是访问互联网发送的数据包&#xff0c;第一个是访问&#xff0c;第二个是网页传回来的 3、4项是源端口号和目的端口号&#xff08;3是随机的&#xff08;1024-65535&#xff09;&#xff0c;那个是http的网页服务端口就是80&#xff09; 那么往回传数据的时候源和目的…

[排序算法]2. 图解选择排序及其代码实现

选择排序 选择排序就是重复“从待排序的数据中寻找最小值&#xff0c;将其与序列最左边的数字进行交换”这一操作的算法。在序列中寻找最小值时使用的是线性查找。 算法步骤: 1.使用线性查找在数据中寻找最小值, 于是我们找到了最小值1 2.将最小值1与序列最左边的…

【SqL】数据库脚本编写规范和指南

编写本文档的目的是保证在开发过程中产出高效、格式统一、易阅读、易维护的SQL代码。 1 编写目的 2 SQL书写规范 3 SQL编写原则 软件全套资料获取进主页或者本文末个人名片直接获取。

Nodejs及stfshow相关例题

Nodejs及stfshow相关例题 Node.js 是一个基于 Chrome V8 引擎的 Javascript 运行环境。可以说nodejs是一个运行环境&#xff0c;或者说是一个 JS 语言解释器而不是某种库。 Node.js可以生成动态页面内容Node.js 可以在服务器上创建、打开、读取、写入、删除和关闭文件Node.js…

panic对defer语句的执行的影响

1.主线程中的panic会直接导致所有正在运行的go协程无法执行,还会导致声明在它之后的defer语句无法执行。 package mainimport ("fmt""time" )func main() {defer fmt.Println("defer1") //声明在panic之前的defer会执行go func() {defer fmt.Pri…

微信小程序反编译/解包

微信小程序反编译/解包 环境与工具 操作系统&#xff1a;Windows 11 23H2 微信版本&#xff1a;3.9.10.19 Q&#xff1a;如何找到小程序文件位置&#xff1f; A&#xff1a;在微信的设置找到文件路径&#xff0c;小程序文件位于 \WeChat Files\Applet\。 Q&#xff1a;小程…

STM32笔记-AD模数转换

目录 一、ADC介绍 二、ADC主要特征 三、ADC框图 1. ​​​​ 外部触发转换 ​ 2. 转换模式 3. 输入通道 4. 逻辑框图 四、校准 五、数据对齐 六、AD转换步骤 七、AD_Init(单通道AD转换)初始化函数配置 DMA: adc_dma_mode_enable(ADC0); 这段代码是用来使能ADC的DMA&a…

怎么一键消除路人?教你三个消除方法

怎么一键消除路人&#xff1f;在数字时代&#xff0c;摄影已成为我们记录生活、表达情感的重要方式。然而&#xff0c;完美的照片背后往往隐藏着一些不那么完美的元素——比如那些不经意间闯入镜头的路人。他们或许只是匆匆过客&#xff0c;但却足以破坏你精心构图的美好瞬间。…

视觉SLAM十四讲:从理论到实践(Chapter5:相机与图像)

前言 学习笔记&#xff0c;仅供学习&#xff0c;不做商用&#xff0c;如有侵权&#xff0c;联系我删除即可 目标 理解针孔相机的模型、内参与径向畸变参数。理解一个空间点是如何投影到相机成像平面的。掌握OpenCV的图像存储与表达方式。学会基本的摄像头标定方法。 一、相…