how2j.cn


工具版本兼容问题
所谓的常用场景指的是工作中会经常用到的javascript结合HTML DOM运用。


示例 1 : 练习-删除行为前的提示   
示例 2 : 答案-删除行为前的提示   
示例 3 : 练习-登陆时候,验证账号密码是否为空   
示例 4 : 答案-登陆时候,验证账号密码是否为空   
示例 5 : 练习-提交数据,验证长度   
示例 6 : 答案-提交数据,验证长度   
示例 7 : 练习-提交数据,验证年龄是否为数字   
示例 8 : 答案-提交数据,验证年龄是否为数字   
示例 9 : 练习-提交数据,验证年龄是否为整数   
示例 10 : 答案-提交数据,验证年龄是否为整数   
示例 11 : 练习-提交数据,验证email格式是否正确   
示例 12 : 答案-提交数据,验证email格式是否正确   
示例 13 : 练习-隐藏和显示   
示例 14 : 答案-隐藏和显示   

示例 1 :

练习-删除行为前的提示

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
在进行删除操作前,都应该提示用户是否要删除
<script> function deleteRow(link){ var b = confirm("确定删除?") if(!b) return; var table = document.getElementById("heroTable"); var td = link.parentNode; var tr = td.parentNode; var index=tr.rowIndex; table.deleteRow(index); } </script> <table width="100%" border = "1" cellspacing="0" id="heroTable"> <tr > <td width="50%">英雄名称</td> <td> 操作 </td> </tr> <tr > <td>盖伦</td> <td> <a href="#" onclick="deleteRow(this)">删除</a> </td> </tr> <tr > <td>提莫</td> <td> <a href="#" onclick="deleteRow(this)">删除</a> </td> </tr> <tr > <td>祈求者</td> <td> <a href="#" onclick="deleteRow(this)">删除</a> </td> </tr> </table>


源代码
1. 双击选中单词 2. 三击选中整行 3. CTRL+F 查找 4. F8 全屏编辑,再次点击恢复
渲染中 渲染完成
效果
示例 2 :

答案-删除行为前的提示

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法
账号未激活 账号未激活,功能受限。 请点击激活
运行效果
<script> function deleteRow(link){ var b = confirm("确定删除?") if(!b) return; var table = document.getElementById("heroTable"); var td = link.parentNode; var tr = td.parentNode; var index=tr.rowIndex; table.deleteRow(index); } </script> <table width="100%" border = "1" cellspacing="0" id="heroTable"> <tr > <td width="50%">英雄名称</td> <td> 操作 </td> </tr> <tr > <td>盖伦</td> <td> <a href="#" onclick="deleteRow(this)">删除</a> </td> </tr> <tr > <td>提莫</td> <td> <a href="#" onclick="deleteRow(this)">删除</a> </td> </tr> <tr > <td>祈求者</td> <td> <a href="#" onclick="deleteRow(this)">删除</a> </td> </tr> </table>


源代码
1. 双击选中单词 2. 三击选中整行 3. CTRL+F 查找 4. F8 全屏编辑,再次点击恢复
渲染中 渲染完成
效果
示例 3 :

练习-登陆时候,验证账号密码是否为空

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
比如在登陆的时候,如果账号或者密码为空,弹出提示,并且不提交
<form method="post" action="/study/login.jsp" onsubmit="return login()"> 账号:<input id="name" type="text" name="name"> <br/> 密码:<input id="password" type="password" name="password" > <br/> <input type="submit" value="登陆"> </form> <script> function login(){ var name = document.getElementById("name"); if(name.value.length==0){ alert("用户名不能为空"); return false; } var password = document.getElementById("password"); if(password.value.length==0){ alert("密码不能为空"); return false; } return true; } </script>


源代码
1. 双击选中单词 2. 三击选中整行 3. CTRL+F 查找 4. F8 全屏编辑,再次点击恢复
渲染中 渲染完成
效果
示例 4 :

答案-登陆时候,验证账号密码是否为空

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法
账号未激活 账号未激活,功能受限。 请点击激活
运行效果
<form method="post" action="/study/login.jsp" onsubmit="return login()"> 账号:<input id="name" type="text" name="name"> <br/> 密码:<input id="password" type="password" name="password" > <br/> <input type="submit" value="登陆"> </form> <script> function login(){ var name = document.getElementById("name"); if(name.value.length==0){ alert("用户名不能为空"); return false; } var password = document.getElementById("password"); if(password.value.length==0){ alert("密码不能为空"); return false; } return true; } </script>


源代码
1. 双击选中单词 2. 三击选中整行 3. CTRL+F 查找 4. F8 全屏编辑,再次点击恢复
渲染中 渲染完成
效果
示例 5 :

练习-提交数据,验证长度

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
比如注册用户名的时候,用户名至少需要3位长度.
<form method="post" action="/study/register.jsp" onsubmit="return register()"> 账号:<input id="name" type="text" name="name"> <br><br> <input type="submit" value="注册"> <br> </form> <script> function register(){ var name = document.getElementById("name"); if(name.value.length<3){ alert("用户名至少需要3位长度"); return false; } return true; } </script>
<form method="post" action="/study/register.jsp" onsubmit="return register()">
账号:<input id="name" type="text" name="name"> 
<br><br>
<input type="submit" value="注册">
<br>
</form>
   
<script>
  function register(){
   var name = document.getElementById("name");
   if(name.value.length<3){
     alert("用户名至少需要3位长度");
     return false;
   }
 
   return true;
 
  }
</script>


源代码
1. 双击选中单词 2. 三击选中整行 3. CTRL+F 查找 4. F8 全屏编辑,再次点击恢复
渲染中 渲染完成
效果
示例 6 :

答案-提交数据,验证长度

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法
账号未激活 账号未激活,功能受限。 请点击激活
运行效果
<form method="post" action="/study/register.jsp" onsubmit="return register()"> 账号:<input id="name" type="text" name="name"> <br><br> <input type="submit" value="注册"> <br> </form> <script> function register(){ var name = document.getElementById("name"); if(name.value.length<3){ alert("用户名至少需要3位长度"); return false; } return true; } </script>
<form method="post" action="/study/register.jsp" onsubmit="return register()">
账号:<input id="name" type="text" name="name"> 
<br><br>
<input type="submit" value="注册">
<br>
</form>
   
<script>
  function register(){
   var name = document.getElementById("name");
   if(name.value.length<3){
     alert("用户名至少需要3位长度");
     return false;
   }
 
   return true;
 
  }
</script>


源代码
1. 双击选中单词 2. 三击选中整行 3. CTRL+F 查找 4. F8 全屏编辑,再次点击恢复
渲染中 渲染完成
效果
示例 7 :

练习-提交数据,验证年龄是否为数字

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
比如注册的时候,需要提交年龄信息,用户输入的年龄信息必须是数字的。
<form method="post" action="/study/register.jsp" onsubmit="return register()"> 账号:<input id="name" type="text" name="name"> <br><br> 年龄:<input id="age" type="text" name="age"> <br><br> <input type="submit" value="注册"> <br> </form> <script> function register(){ var name = document.getElementById("name"); if(name.value.length<3){ alert("用户名至少需要3位长度"); return false; } var age = document.getElementById("age"); if(isNaN(age.value)){ alert("年龄必须是数字"); return false; } return true; } </script>


源代码
1. 双击选中单词 2. 三击选中整行 3. CTRL+F 查找 4. F8 全屏编辑,再次点击恢复
渲染中 渲染完成
效果
示例 8 :

答案-提交数据,验证年龄是否为数字

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法
账号未激活 账号未激活,功能受限。 请点击激活
运行效果
<form method="post" action="/study/register.jsp" onsubmit="return register()"> 账号:<input id="name" type="text" name="name"> <br><br> 年龄:<input id="age" type="text" name="age"> <br><br> <input type="submit" value="注册"> <br> </form> <script> function register(){ var name = document.getElementById("name"); if(name.value.length<3){ alert("用户名至少需要3位长度"); return false; } var age = document.getElementById("age"); if(age.value.length==0){ alert("年龄不能为空"); return false; } if(isNaN(age.value)){ alert("年龄必须是数字"); return false; } return true; } </script>


源代码
1. 双击选中单词 2. 三击选中整行 3. CTRL+F 查找 4. F8 全屏编辑,再次点击恢复
渲染中 渲染完成
效果
示例 9 :

练习-提交数据,验证年龄是否为整数

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
上一个练习有个缺陷,即当年龄输入是小数的时候,也能够通过判断。
那么接下来就要求,年龄只能输入整数,小数也不行
<form method="post" action="/study/register.jsp" onsubmit="return register()"> 账号:<input id="name" type="text" name="name"> <br><br> 年龄:<input id="age" type="text" name="age"> <br><br> <input type="submit" value="注册"> <br> </form> <script> function register(){ var name = document.getElementById("name"); if(name.value.length<3){ alert("用户名至少需要3位长度"); return false; } var age = document.getElementById("age"); if(parseInt(age.value)!=age.value){ alert("年龄必须是整数"); return false; } return true; } </script>


源代码
1. 双击选中单词 2. 三击选中整行 3. CTRL+F 查找 4. F8 全屏编辑,再次点击恢复
渲染中 渲染完成
效果
示例 10 :

答案-提交数据,验证年龄是否为整数

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法
账号未激活 账号未激活,功能受限。 请点击激活
运行效果
<form method="post" action="/study/register.jsp" onsubmit="return register()"> 账号:<input id="name" type="text" name="name"> <br><br> 年龄:<input id="age" type="text" name="age"> <br><br> <input type="submit" value="注册"> <br> </form> <script> function register(){ var name = document.getElementById("name"); if(name.value.length<3){ alert("用户名至少需要3位长度"); return false; } var age = document.getElementById("age"); if(parseInt(age.value)!=age.value){ alert("年龄必须是整数"); return false; } return true; } </script>


源代码
1. 双击选中单词 2. 三击选中整行 3. CTRL+F 查找 4. F8 全屏编辑,再次点击恢复
渲染中 渲染完成
效果
示例 11 :

练习-提交数据,验证email格式是否正确

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
比如注册的时候,需要提交email信息,用户输入的email信息必须是电子邮箱格式的。
<form method="post" action="/study/register.jsp" onsubmit="return register()"> 账号:<input id="name" type="text" name="name"> <br><br> 年龄:<input id="age" type="text" name="age"> <br><br> EMail:<input id="email" type="text" name="email"> <br><br> <input type="submit" value="注册"> <br> </form> <script> function register(){ var name = document.getElementById("name"); if(name.value.length<3){ alert("用户名至少需要3位长度"); return false; } var age = document.getElementById("age"); if(isNaN(age.value)){ alert("年龄必须是数字"); return false; } var email = document.getElementById("email"); if(0==email.value.length){ alert("email不能为空"); return false; } var Regex = /^(?:\w+\.?)*\w+@(?:\w+\.)*\w+$/; if (!Regex.test(email.value)){ alert("email格式不正确"); return false; } return true; } </script>


源代码
1. 双击选中单词 2. 三击选中整行 3. CTRL+F 查找 4. F8 全屏编辑,再次点击恢复
渲染中 渲染完成
效果
示例 12 :

答案-提交数据,验证email格式是否正确

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法
账号未激活 账号未激活,功能受限。 请点击激活
运行效果
<form method="post" action="/study/register.jsp" onsubmit="return register()"> 账号:<input id="name" type="text" name="name"> <br><br> 年龄:<input id="age" type="text" name="age"> <br><br> EMail:<input id="email" type="text" name="email"> <br><br> <input type="submit" value="注册"> <br> </form> <script> function register(){ var name = document.getElementById("name"); if(name.value.length<3){ alert("用户名至少需要3位长度"); return false; } var age = document.getElementById("age"); if(isNaN(age.value)){ alert("年龄必须是数字"); return false; } var email = document.getElementById("email"); if(0==email.value.length){ alert("email不能为空"); return false; } var Regex = /^(?:\w+\.?)*\w+@(?:\w+\.)*\w+$/; if (!Regex.test(email.value)){ alert("email格式不正确"); return false; } return true; } </script>


源代码
1. 双击选中单词 2. 三击选中整行 3. CTRL+F 查找 4. F8 全屏编辑,再次点击恢复
渲染中 渲染完成
效果
示例 13 :

练习-隐藏和显示

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
首先通过document.getElementById 拿到div对应的节点
然后通过修改节点的style.display的值进行隐藏和显示
<button onclick="hide()">隐藏div</button> <button onclick="show()">显示div</button> <br> <br> <div id="d"> 这是一个div </div> <script> function hide(){ var d = document.getElementById("d"); d.style.display="none"; } function show(){ var d = document.getElementById("d"); d.style.display="block"; } </script>


源代码
1. 双击选中单词 2. 三击选中整行 3. CTRL+F 查找 4. F8 全屏编辑,再次点击恢复
渲染中 渲染完成
效果
示例 14 :

答案-隐藏和显示

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费1个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法
查看本答案会花费1个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法
账号未激活 账号未激活,功能受限。 请点击激活
运行效果
<button onclick="hide()">隐藏div</button> <button onclick="show()">显示div</button> <br> <br> <div id="d"> 这是一个div </div> <script> function hide(){ var d = document.getElementById("d"); d.style.display="none"; } function show(){ var d = document.getElementById("d"); d.style.display="block"; } </script>


源代码
1. 双击选中单词 2. 三击选中整行 3. CTRL+F 查找 4. F8 全屏编辑,再次点击恢复
渲染中 渲染完成
效果


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2024-07-29 完整地利用 dom 对象实现HTML元素的相关操作
虚心求学




1. e.keycode 已被弃用 注意,对于 onkeydown 事件传递 event 参数, 但是在绑定的方法中 使用 event.keycode 拿到的是 undefined 值, 说明了这个 e.keycode 已经被弃用了。 应该使用 e.key 来拿值。 e.key 不同的地方在于,按下 键盘1 ,返回 1;按下 a键 返回 a; 按下退格键,返回event.key === "Backspace"; 2.判断输入字符串是否为空,或纯空白文本的简便方法: if(!input.value()||input.value().trim()==="") 输入为空。 其中!对于 false、null、undefined 的取反为 true;可以根据这个性质, 很简便地判断字符串是否为空,然后结合 trim 去掉收尾空白进一步判读 输入是否为纯空白文本。 代码简单实现了,表格动态添加、删除、删除弹窗确认、清空、修改、插入内容、输入判断等等。
加载中
//------------------- DOM.js 文件 ---------------------
//Hero 对象
	function Hero(id,name,hp,damage){
		this.id = id;
		this.name = name;
		this.hp = hp;
		this.damage = damage;
		// hero 对象转为 tr 的 dom 对象
		this.trDOM = function(){
			let row = new dom('tr');
			row.append('td',this.id);
			row.append('td',this.name);
			row.append('td',this.hp);
			row.append('td',this.damage);
			return row;
		}
	}
	//dom 对象
	function dom(tagName){
		this.element = undefined;
		if(typeof tagName == 'object')
			this.element = tagName;
		else 
		this.element = document.createElement(tagName);
		this.get = function(){
			return this.element;
		}
		this.set = function(sender){
			this.element = sender;
		}
		//添加一个子dom对象
		this.add = function(...ds){
			for(const d of ds)
			this.element.appendChild(d.element);
			
		}
		//根据标签名字添加一个子节点
		this.addnew = function(tagName){
			let child = document.createElement(tagName);
			this.element.appendChild(child);
		}
		//追加元素
		this.append = function(tagName,text,css){
			let child = new dom(tagName);
			if(text!=null)
			       child.setText(text);
			if(css!=null)
			       child.addAttribute('style',css);
			this.add(child);
		}
		//设置属性
		this.setAttribute = function(att){
			this.element.setAttributeNode(att);
		}
		//添加属性
		this.addAttribute = function(name,value){
			let att = document.createAttribute(name);
			att.nodeValue = value;
			this.setAttribute(att);
			return att;
		}
		this.removeAttribute = function(name){
			this.get().removeAttribute(name);
		}
		//设置内部文本
		this.setText = function(str){
			this.get().innerText = str;
		}		
		//获得内部文本
		this.getText = function(str){
			return this.get().innerText;
		}
		//返回子元素节点的数量
		this.count=function(){
			return this.element.children.length;
		}
		//返回子节点的数量
		this.countAll=function(){
			return this.element.childNodes.length;
		}
		//清空结点
		this.clear = function(nodeName){
			let nodes = this.nodesAt(nodeName);
			for(const n of nodes)
				this.get().removeChild(n.get());
		}
		//删除第一个匹配的节点
		this.remove=function(nodeName){
			var nodes = this.element.childNodes;
			this.get().removeChild(this.first(nodeName).get());
		}
		//删除最后一个匹配的节点
		this.removeLast=function(nodeName){
			var nodes = this.element.childNodes;
			this.get().removeChild(this.last(nodeName).get());
		}
		this.parent = function(level){
			let parent = this.get().parentNode;
			if(typeof level == 'number')
			while(level-->1){
				parent = parent.parentNode;
			}
			return new dom(parent);
		}
		//根据id或节点名称找到第一个匹配的子节点
		this.at = function(id){
			if(typeof id =='number')
				return new dom(this.element.children[id]);
			var cs = this.element.children;
			for(const c of cs)
			if(c.nodeName.toLowerCase()==id.toLowerCase())
				return new dom(c);
		}
		//根据id或节点名称找到所有匹配的子节点
	                this.nodesAt = function(id){
			if(typeof id =='number')
				return new dom(this.element.children[id]);
			let doms = new Array();
			var cs = this.element.children;
			for(const c of cs)
			if(c.nodeName.toLowerCase()==id.toLowerCase())
				doms.push(new dom(c));
			return doms;
		}
		this.replace = function(src,dest){
			this.get().replaceChild(src.get(),dest.get());
		}
		//返回下一个兄弟节点
		this.next = function(){
			return new dom(this.get().nextSibling);
		}
		this.pre = function(){
			return new dom(this.get().previousSibling);
		}
		this.first = function(id){
			return this.nodesAt(id)[0];
		}
		this.last = function(id){
			let nodes = this.nodesAt(id);
			return nodes[nodes.length-1];
		}
		this.value = function(){
			return this.get().value;
		}
		this.values = function(){
			let vs = new Array();
			let inputs = this.nodesAt('input');
			for(const i of inputs){
				let value = i.get().value;
				if(typeof value  != 'undefined')
				{
					vs.push(value);
				}
			}
			return vs;
		}
		this.copy = function(){
			var node = this.get().cloneNode();
			const copy = new dom(node);
			if(typeof this.getText()!= 'undefined');
				copy.setText(this.getText());
			return copy;
		}
	}
	//建立 body 的dom对象 
	const body = new dom();
	function init(){
		body.setText('点击标题行即可进行排序');
		body.set(document.getElementsByTagName('body')[0]);
		body.addAttribute('style','width:800px;text-align:center;padding:10px;margin-left:10px');
		let h1 = new dom('h1');
		h1.addAttribute('style','auto;color:skyblue');
		h1.setText('点击表格的标题处可以自动排序');
		body.add(h1)
		getButton();
		body.add(new dom('br'));
		body.add(new dom('br'));
		createInput();
		createTable();
	}
	function createInput(){
		//create label of item
		let id = new dom('span');
		id.addAttribute('style','margin:1 1 1 10');
		let name = id.copy();
		let hp = id.copy();
		let damage = id.copy();
		let email = id.copy();
		let username = id.copy();
		let password = id.copy();

		//create input  of item
		let txtId = new dom('input');
		txtId.addAttribute('style','width:50px');
		txtId.addAttribute('placeholder','请输入');
		txtId.addAttribute('onkeydown','return checkNum(this,event)');
		let txtName = txtId.copy();
		let txtHp = txtId.copy();
		let txtDamage = txtId.copy();
		let txtEmail = new dom('input');
		txtEmail.addAttribute('style','width:143px');
		txtEmail.addAttribute('placeholder','请输入邮箱');
		let txtUserName = txtId.copy();	
		let txtPassword = txtId.copy();	
		txtUserName.addAttribute('name','name')
		txtPassword.addAttribute('name','password')
		txtPassword.removeAttribute('onkeydown');
		txtPassword.addAttribute('type','password');

		//create button of item
		let btn = new dom('input');
		btn.addAttribute('value','插入数据');
		btn.addAttribute('type','submit');
		btn.addAttribute('style','margin:0 15');
		btn.addAttribute('onclick','insertIntoTable(this);');
		let submit = btn.copy();
		submit.get().value = '登录';
		submit.addAttribute('onclick','return checkLogin(this)')

		//create msgBox of item
		let msgBox = new dom('span');
		msgBox.addAttribute('style','display:none');
		msgBox.addAttribute('id','msg');
		
		//set text of label
		id.setText('id:');
		hp.setText('hp:');
		name.setText('name:');
		hp.setText('hp:');
		damage.setText('damage:');
		email.setText('邮箱:');
		username.setText('账号:');
		password.setText('密码:');		

		//set form
		let form = new dom('form');
		form.addAttribute('method','post');
		form.addAttribute('action','https://how2j.cn/study/login.jsp');
		form.addAttribute('style','margin:5px');
		form.addAttribute('onclick','');
		form.add(email,txtEmail,username,txtUserName,password,txtPassword,submit);

		//inset into parent node (div)
		let div = new dom('div');
		div.add(id,txtId,name,txtName,hp,txtHp,damage,txtDamage,btn,msgBox,form);
		body.add(div);
	}
	
	function createTable(){
		//建立 table 的 dom对象
		const table = new dom('table');
		//创建 table 的 style 属性
		table.addAttribute('style','width:100%;text-align:center;border-collapse:collapse;border-bottom:1px solid #bbb;margin:50 0 50 0;');
		//添加标题行
		table.add(getRowTitle());
		//添加其余行
		addRows(table);
		//向 table 添加 换行
		//table.add(new dom('br'));
		
		//向 body 添加 table
		body.add(table);
		
	}
	function setStyle(rows){
		for(const i in rows){
			let r = rows[i];
			if(i%2!=0)
			{
			       //let color = getRandColor();
			       r.addAttribute( 'style','background-color:#eee');
			}
			
		}
	}
	function addRows(sender){
		let gareen = new Hero('1','gareen',Math.round(Math.random()*500),'12');
		let teemo = new Hero('2','teemo',Math.round(Math.random()*500),'34');
		let annie = new Hero('3','annie',Math.round(Math.random()*500),'56');
		let deadbrother = new Hero('4','deadbrother',Math.round(Math.random()*500),'78');
		let rows = getRows(gareen,teemo,annie,deadbrother);
		setStyle(rows);
		for(let r of rows)
		sender.add(r);
	}
	function getRows(...hs){
		let rows = new Array();
		for(let hero of hs){
			let row = hero.trDOM();
			row.addAttribute('style','border-bottom:1px solid #eee');
			rows.push(row);
		}
		return rows;
	}
	//获取表格的标题行
	function getRowTitle()
	{
		let row = new dom('tr');
		row.addAttribute('style','border-bottom:3px solid #bbb;background-color:#fafafa');
		let cols = new Array(4);
		let strColor = getRandColor();
		cols[0] = getCol('id','width:25%;color:'+strColor+';cursor:pointer');
		cols[1] = getCol('名称','width:25%;color:'+strColor+';cursor:pointer');
		cols[2] = getCol('血量','width:25%;color:'+strColor+';cursor:pointer');
		cols[3] = getCol('伤害','width:25%;color:'+strColor+';cursor:pointer');
		setEvent(cols);
		for(let col of cols){
			row.add(col);
		}
		return row;
	}
	function setEvent(cols){
		for(let i in cols){
			let c = cols[i];
			c.addAttribute('onclick','sortTable('+i+',this)');
		}
	}
	function getCol(txt,css){
		let col = new dom('td');
		col.setText(txt);
		if(css!=null)
		col.addAttribute('style',css);
		return col;
	}

	function getButton(){
	    addButton('更新表格','onclick','clearTable();createTable()');
	    addButton('动态创建一个新表','onclick','createTable()');
	    addButton('按名称排序','onclick','sortTable(1)');
	    addButton('按id排序','onclick','sortTable(0)');
	    addButton('标题置顶/置底','onclick','reverseTable()');
	    addButton('删除表格','onclick','removeTable()');
	    addButton('清空表格','onclick','clearTable()');

	}
	function addButton(name,eventType,eventValue){
	    let btn = new dom('button');
	    btn.addAttribute(eventType,eventValue);
	    btn.addAttribute('style','margin:5px');
	    btn.setText(name);
	    body.add(btn);
	}
	function clearTable(){
	    body.clear('table');
	}
	function removeTable(){
	    if(typeof body.at('table') == 'undefined')return;
	    let res = confirm('是否确定删除最近的表格?');
	    if(res)
	    body.removeLast('table');
	}
	function getRandColor(){
		let ir = Math.random()*255;
		let ig = Math.random()*255;
		let ib = 255-ir;
		let r = Math.round(ir).toString(16);
		let g = Math.round(ig).toString(16);
		let b = Math.round(ib).toString(16);
		return '#'+r+g+b;
	}
	function getInvColor(strColor){
		strColor = strColor.replace('#');
		let r =  ( 255-parseInt(strColor.substring(0,2).toString(10)) ).toString(16);
		let g = ( 255-parseInt(strColor.substring(2,4).toString(10)) ).toString(16);
		let b = ( 255-parseInt(strColor.substring(4,6).toString(10)) ).toString(16);
		return '#'+r+g+b;
	}
	function checkTitle(first){
		return first.at('td').getText().trim().toLowerCase().charAt(0)==='i';
	}
	function sortTable(id,sender){
	    let table = body.at('table');
	    if(typeof sender != 'undefined'){
 	    if(sender.nodeName.toLowerCase()=='td')
	   	 table = new dom(sender.parentNode.parentNode)
	    else if(sender.nodeName.toLowerCase()=='tr')
	   	 table = new dom(sender.parentNode);
	    }
	    var rows = table.nodesAt('tr');
	    let title = undefined;
	    let isFirst = checkTitle(rows[0]);
	    if(isFirst)
	          title = rows.shift();
	    else
	          title = rows.pop();
	    var titleCol = title.nodesAt('td')[id];
	    var text = titleCol.getText();
	    var txtMain = text.replace('↓','').replace('↑','');
	    let isDescend = false;
	    for(let i in title.nodesAt('td')){
		if(i!=id)
		title.nodesAt('td')[i].setText(title.nodesAt('td')[i].getText().replace('↓','').replace('↑',''));
	    }
	    if(text.charAt(text.length-1)=='↑'){
		isDescend = true;
		titleCol.setText(txtMain+"↓");
	    }else 
		titleCol.setText(txtMain+"↑");
	   
	    rows.sort((r1,r2)=>{
		var c1 = r1.nodesAt('td')[id].getText().trim();
		var c2 = r2.nodesAt('td')[id].getText().trim();
		     let i1 = parseInt(c1);
		     let i2 = parseInt(c2);
		     if(Number.isNaN(i1)||Number.isNaN(i2)){
			let res = c1.localeCompare(c2);
		     	if(isDescend)
		     	res = c2.localeCompare(c1);
		     	return res;
		     }
		     res = i1-i2;
	                     if(isDescend)res*=-1;
		     return res;
		
	    });
	    table.clear('tr');
	    if(isFirst)
	    table.add(title);
	    for(const r of rows)
		table.add(r);
	    if(!isFirst)
	    table.add(title);
	}
	function reverseTable(){
	    let table = body.at('table');
	    var firstRow = table.first('tr');
	    var lastRow = table.last('tr');
	    table.replace(lastRow,firstRow);
	    table.add(firstRow);
	}
	function insertIntoTable(sender){
		sender = new dom(sender);
		let table = body.at('table');
		let parent = sender.parent();
		if(!checkInput(parent))return;
		let values = parent.values();
		let hero = new Hero(values[0],values[1],values[2],values[3]);
		let row = hero.trDOM();
		if(table.count()%2==0)
			row.addAttribute( 'style','background-color:#eee');
		table.add(row);
	}
	function checkInput(parent){
		let is = parent.nodesAt('input');
		let msg = new dom(document.getElementById('msg'));
		for(const input of is){
			if(!input.value()||input.value().trim()==="")
			{
				msg.get().style.color = "red";
				msg.get().style.display = "inline";
				msg.setText(input.pre().getText()+'输入为空!');
				return false;
			}
		}
		msg.get().style.color = "lightgreen";
		msg.get().style.display = "inline";
		msg.setText('数据合理');
		return true;
		
	}
	function checkNum(sender,e){
		if(e.key === 'Backspace')return true;
		let txt = new dom(sender);
		let lal = txt.pre().getText();
		if(lal=='name:')return true;
		let msg = new dom(document.getElementById('msg'));
		if(parseInt(e.key)!=e.key||txt.value()&&parseInt(txt.value())!=txt.value())
		{
			msg.get().style.color = "red";
			msg.get().style.display = "inline";
			msg.setText(lal +'请输入整数');
			return false;
		}		
		msg.get().style.display = "none";
		return true;
	}
	function checkLogin(sender){
		let parent = new dom(sender).parent();
		let is = parent.nodesAt('input');
		is.pop();//移除按钮input
		for(const input of is){
			let value = input.value();
			let lal = input.pre().getText();
			if(!value||value.trim()==="")
			{	
				alert(lal+'输入为空');
				return false;
			}
			if(lal =='账号:'||lal=='邮箱:'){
				if(value.length<3)
				{
					alert(lal+'最少为三位数');
					return false;
				}
			}
			if(lal =='邮箱:'){
				let reg = /.*@.*\.com$/;
				if(!reg.test(value))
				{
					alert(lal+'邮箱格式不正确');
					return false;
				}
			}
		}
		return true;
	}

<!------------------- html 文件 ------------------->

<html>
    <head>
    <script src = "DOM.js"></script>
    </head>

    <body onload="init();">
    </body>

</html>

							





回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2024-03-18 练习- 哈哈哈
起个名




1 : 练习-删除行为前的提示 2 : 练习-登陆时候,验证账号密码是否为空 3: 练习-提交数据,验证长度 4 : 练习-提交数据,验证年龄是否为数字 5: 练习-提交数据,验证年龄是否为整数 6 : 练习-提交数据,验证email格式是否正确 7 : 练习-隐藏和显示
1: 练习-删除行为前的提示

在进行删除操作前,都应该提示用户是否要删除
<style>
	table{
		width: 600px;
	}
	tr{
		text-align: center;
	}
	td{
		 width: 200px;
	}
</style>

<div id ="d1">
	<table>
		<tr>
			<td>id</td><td>英雄名称</td><td>操作</td>
		</tr>
		<tr>
			<td>1</td><td>gareen</td><td><a href="#" onclick="delTR(this)">删除</td>
		</tr>
		<tr>
			<td>2</td><td>teemo</td><td><a href="#" onclick="delTR(this)">删除</td>
		</tr>
		<tr>
			<td>3</td><td>annie</td><td><a href="#" onclick="delTR(this)">删除</td>
		</tr>
		<tr>
			<td>4</td><td>dreadbrotherr</td><td><a href="#" onclick="delTR(this)">删除</td>
		</tr>
	</table>
</div>

<script>
	var trs = document.getElementsByTagName("tr");
	for(var m = 0; m < trs.length; m++){
		if(m % 2 == 0 && m!= 0)
			trs[m].style.backgroundColor = "#F0FFFF";
		else if(m % 2 != 0)
			trs[m].style.backgroundColor = "#F0F8FF";
	}
	function delTR(link){
		var de = confirm("确认删除?");
		if(!de)
			return;
		var td = link.parentNode;
		var tr = td.parentNode;
		var table = tr.parentNode;
		table.removeChild(tr);
	}
</script>

2:练习-登陆时候,验证账号密码是否为空
比如在登陆的时候,如果账号或者密码为空,弹出提示,并且不提交

<form method="post"action="/study/login.jsp" onsubmit="return login()">
账号:<input id="name" type="text" name="name"> <br/>
密码:<input id="password" type="password" name="password" > <br/>
<input type="submit" value="登录">
</form>
  
<script>
	function login(){
		var name = document.getElementById("name");
		var password = document.getElementById("password");
		if(name.value.length==0 && password.value.length!=0){
			alert("用户名不能为空");
			return false;
		}else if(name.value.length!=0 && password.value.length==0){
			alert("密码不能为空");
			return false;
		}else if(name.value.length==0 && password.value.length==0){
			alert("用户名和密码不能为空");
			return false;
		}
	return true;
    
  }
</script>

3: 练习-提交数据,验证长度
比如注册用户名的时候,用户名至少需要3位长度.

<form method="post"action="/study/register.jsp" onsubmit="return register()">
账号:<input id="name" type="text" name="name"> <br/>

<input type="submit" value="注册">
</form>
  
<script>
	function register(){
		var name = document.getElementById("name");
		if(name.value.length < 3){
			alert("用户名长度不能小于3");
			return false;
		}
	return true;
    
  }
</script>

4 : 练习-提交数据,验证年龄是否为数字
比如注册的时候,需要提交年龄信息,用户输入的年龄信息必须是数字的

<form method="post"action="/study/register.jsp" onsubmit="return register()">
账号:<input id="name" type="text" name="name"> <br/>
年龄:<input id="age" type="text" name="age"> <br/>

<input type="submit" value="注册">
</form>
  
<script>
	function register(){
		var name = document.getElementById("name");
		var age = document.getElementById("age");
		if(name.value.length < 3){
			alert("用户名长度不能小于3");
			return false;
		}
		if(isNaN(age.value)){
			alert("年龄必须是数字");
			return false;
		}
	return true;
  }
</script>

5: 练习-提交数据,验证年龄是否为整数
上一个练习有个缺陷,即当年龄输入是小数的时候,也能够通过判断。
那么接下来就要求,年龄只能输入整数,小数也不行

<form method="post" action="/study/register.jsp" onsubmit="return register()">
账号:<input id="name" type="text" name="name"> <br/>
年龄:<input id="age" type="text" name="age"> <br/>

<input type="submit" value="注册">
</form>
  
<script>
	function register(){
		var name = document.getElementById("name");
		var age = document.getElementById("age").value;
		if(name.value.length < 3){
			alert("用户名长度不能小于3");
			return false;
		}
		var tf = true;
            for (var i = 0;i < age.length;i++) {
                if (age[i] != '0' && age[i] != '1' &&age[i] != '2' && age[i] != '3' && age[i] != '4' && age[i] != '5' && age[i] != '6' && age[i] != '7' && age[i] != '8' && age[i] != '9' ) {
                    tf = false;
                    break;
                } 
            }
            if(tf == false){
				alert("年龄必须是整数");
				return false;
			}
               
		return true;
	}
</script>

6: 练习-提交数据,验证email格式是否正确
比如注册的时候,需要提交email信息,用户输入的email信息必须是电子邮箱格式的。

<form method="post" action="/study/register.jsp" onsubmit="return register()">
账号:<input id="name" type="text" name="name"> <br/>
年龄:<input id="age" type="text" name="age"> <br/>
Email:<input id="email" type="text" name="email"> <br/>

<input type="submit" value="注册">
</form>
  
<script>
	function register(){
		var name = document.getElementById("name");
		var age = document.getElementById("age").value;
		var email = document.getElementById("email");
		if(name.value.length < 3){
			alert("用户名长度不能小于3");
			return false;
		}
		var tf = true;
            for (var i = 0;i < age.length;i++) {
                if (age[i] != '0' && age[i] != '1' &&age[i] != '2' && age[i] != '3' && age[i] != '4' && age[i] != '5' && age[i] != '6' && age[i] != '7' && age[i] != '8' && age[i] != '9' ) {
                    tf = false;
                    break;
                } 
            }
            if(tf == false){
				alert("年龄必须是整数");
				return false;
			}
        if(email.value.length == 0){
			alert("email不能为空白");
			return false;
		}   
		var Regex = /^(?:\w+\.?)*\w+@(?:\w+\.)*\w+$/;
		
		if(!Regex.test(email.value)){
			alert("email格式不正确");
			return false;
		}
		return true;
	}
</script>

7: 练习-隐藏和显示
首先通过document.getElementById 拿到div对应的节点
然后通过修改节点的style.display的值进行隐藏和显示
<button onclick="hide()">隐藏div</button>
<button onclick="show()">显示div</button>

<div id="div1">这是一个div</div>
<script>
	function hide(){
		var d = document.getElementById("div1");
		d.style.display = "none";
	}
	function show(){
		var d = document.getElementById("div1");
		d.style.display = "block";
	}
</script>

							





回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2022-12-23 我的答案
2021-05-23 实例1 onclick在script中添加
2021-04-22 实例1解析


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 53 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 前端部分-HTML DOM-常用场景 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 578362961
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图