再战JavaScript
下面我们接着介绍创建节点。
创建节点,插入节点的方式,就好像是买一个大袋子,一个大袋子里装着一些小袋子,小袋子里分别装着不同的东西。
我们来看看代码就一目了然了:
<script type="text/javascript">//新创建一个元素节点,并把该节点添加为文档中指定节点的子节点window.onload = function() {//新创建一个元素节点,返回值为指向元素节点的引用//<li></li>var liNode = document.createElement("li");//新创建一个文本节点var textNode = document.createTextNode("华盛顿");//将文本节点添加到li的子节点//<li>华盛顿</li> liNode.appendChild(textNode);var cityNode = document.getElementById("city");//新添加一个子节点,该子节点将会被添加到最后的位置 cityNode.appendChild(liNode);}</script>
大袋子(city)里装着很多小袋子(li),小袋子里装着不同的东西(不同的城市名字的文本),没错吧?很简单。
难道JavaScript只能支持这么low的做法吗?当然不是,还可以在现有已经存在的节点中互换双方的位置。当然,需要一个中间变量做转换。
代码如下:
<script type="text/javascript">window.onload = function() {/*只能实现单向移动,被覆盖的节点还没拷贝var bjNode = document.getElementById("bj");var newNode = document.createElement("li");var cityNode = document.getElementById("city");//replaceChild()方法可以实现将"红警"移动到"北京"cityNode.replaceChild(newNode, bjNode);*//*var bjNode = document.getElementById("bj");var cityNode = document.getElementById("city");var hjNode = document.getElementById("hj");var gameNode = document.getElementById("game");//先将北京节点拷贝下来var tempNode = bjNode.cloneNode(true);gameNode.replaceChild(tempNode, hjNode);cityNode.replaceChild(hjNode, bjNode);*/var bjNode = document.getElementById("bj");var hjNode = document.getElementById("hj");replaceEach(bjNode, hjNode);}//自定义互换两个节点的函数function replaceEach(aNode, bNode) {//1.获取aNode和bNode的父节点,使用parentNode属性var aParent = aNode.parentNode;var bParent = bNode.parentNode;//当父节点存在的情况下才进行互换if (aParent && bParent) {//2.克隆aNodevar aNode2 = aNode.cloneNode(true);//3.分别调用aNode的父节点和bNode的父节点的peplaceChild()实现互换 bParent.replaceChild(aNode2, bNode);aParent.replaceChild(bNode, aNode);}} </script>
下面我们要介绍一下弹出可以选择是和否的对话框,也就是confirm()方法了。
练习需求:为每一个li节点添加一个confirm(),若确定,则删除,结合我们的removeChild()方法,这个练习so easy。
代码如下:
<script type="text/javascript">//为每一个li节点添加一个confirm(),若确定,则删除window.onload = function() {/*//测试:removeChild():删除节点var cityNode = document.getElementById("city");alert(cityNode.parentNode);//通过调用父节点的removeChild()来完成,更加快捷、方便cityNode.parentNode.removeChild(cityNode);*/var liNodes = document.getElementsByTagName("li");var length = liNodes.length;for (var i = 0; i < length; i++) {liNodes[i].onclick = function() {//confirm()方法会返回一个boolean值,选择确定未true,取消为falsevar flag = confirm("确定要删除\"" + this.innerHTML + "\"吗?");if (flag) {this.parentNode.removeChild(this);}}}} </script>
JavaScript还提供了insertBefore()方法,允许我们可以将某节点插入到指定节点的前面。
代码如下:
//把#hj插入到#bj的前面 var cityNode = document.getElementById("city"); var bjNode = document.getElementById("bj"); var hjNode = document.getElementById("hj"); cityNode.insertBefore(hjNode, bjNode);
但是并没有提供insertAfter()方法。那我们就自定义一个吧!
思路是这样的:先检查指定节点是否为父节点的最后一个节点。如果是,那就直接appendChild(),因为这个方法默认放到最后;如果不是,那么就获取下一个节点,也就是.nextSibling()方法,然后再使用insertBefore()方法。
代码如下:
<script type="text/javascript">window.onload = function() {var bjNode = document.getElementById("bj");var hjNode = document.getElementById("hj");insertAfter(hjNode, bjNode);}//把newNode插入到refNode的后面function insertAfter(newNode, refNode) {//1.验证refNode是否为其父节点的最后一个节点var parentNode = refNode.parentNode;if (parentNode) {var lastNode = parentNode.lastChild;if (lastNode == refNode) {//2.若是,则直接使用父节点的appendChild()将其插入到最后 parentNode.appendChild(newNode);}//3.若不是,则先获取refNode的下一个节点,再使用insertBefore()方法插入else {parentNode.insertBefore(newNode, refNode.nextSibling);}}} </script>
下面我们要做几个练习,HTML文档如下:
<p>你喜欢哪个城市?</p><ul id="city"><li id="bj">北京</li><li>上海</li><li>东京</li><li>首尔</li></ul><br><br><p>你喜欢哪款单击游戏?</p><ul id="game"><li id="hj">红警</li><li>实况</li><li>魔兽</li><li>星际</li></ul><br><br><input type="radio" id="myCity" name="myChoose" value="city" />城市<input type="radio" id="myGame" name="myChoose" value="game" />游戏<p>name:<input type="text" id="name" name="name" /></p><input type="submit" id="mySubmit" name="mySubmit" value="submit" />
需求如下:需求1:点击submit按钮时,检查是否选择type,若没有选择就给出提示:“请选择类型”;
检查文本框中是否有输入(可以去除前后空格),若没有输入,则给出提示:“请输入内容”;
若检查都通过,则在相应的ul节点中添加对应的li节点;
需求2:使包括新增的li都能响应onclick事件,弹出li的文本值。
根据需求的描述,我们可以知道,其实所有的事件触发都在button上,那么就可以将所有的逻辑判断都加入到button上。
代码如下:
<script type="text/javascript">window.onload = function() {function showContent(liNode) {alert(liNode.innerHTML);}var liNodes = document.getElementsByTagName("li");var liLength = liNodes.length;for (var i = 0; i < liLength; i++) {liNodes[i].onclick = function() {showContent(this);}}//获取到按钮,并添加事件var btn = document.getElementById("mySubmit");btn.onclick = function() {//根据组名获取是否被选中的条件var types = document.getElementsByName("myChoose");var typeVal = null;var name = document.getElementById("name");var length = types.length;//判断单选按钮是否被选中for (var i = 0; i < length; i++) {if (types[i].checked) {typeVal = types[i].value;break;}}if (!typeVal) {alert("请选择类型");return;}//判断用户是否输入if (!name.value) {alert("请输入内容");return;}//都通过的情况将添加一条livar li = document.createElement("li");//获取文本框的内容var text = document.createTextNode(name.value);//将文本框的内容添加到li li.appendChild(text);li.onclick = function() {showContent(this);}//将li添加到typeVal指定的ulvar ulNode = document.getElementById(typeVal);ulNode.appendChild(li);}} </script>
新的需求如下:需求:为所有的li节点添加onclick响应函数;
实现city子节点和game子节点对应位置的元素的互换。
思路是这样的:根据标签名获取到所有的li节点,这样一来,li就在一个数组里面有属于自己的下标了。根据提供的HTML文档,我们可以让(0,1,2,3)和+4的交换,让(4,5,6,7)和-4的交换。
交换结束之后,我们不仅仅是交换节点内容,我们还需要重新赋予onclick事件,还需要将新的下标赋予它。
代码如下:
<script type="text/javascript">window.onload = function() {var liNodes = document.getElementsByTagName("li");var length = liNodes.length;for (var i = 0; i < length; i++) {//使用index储存当前节点的下标,因为在触发事件的时候i的值已经是超过length的那个值了liNodes[i].index = i;liNodes[i].onclick = function() {var targetIndex = 0;if (this.index < 4) {targetIndex = this.index + 4;} else {targetIndex = this.index - 4;}replaceEach(this, liNodes[targetIndex]);}}//显示为8,没有局部变量这一说//alert(i); }function replaceEach(aNode, bNode) {var aParent = aNode.parentNode;var bParent = bNode.parentNode;if (aParent && bParent) {//拷贝的时候并未将事件、index拷贝var aNode2 = aNode.cloneNode(true);//alert(aNode.index);//alert(aNode2.index);//alert(bNode.index);//克隆aNode的同时,把onclick事件也复制aNode2.onclick = aNode.onclick;aNode2.index = bNode.index;bNode.index = aNode.index;bParent.replaceChild(aNode2, bNode);aParent.replaceChild(bNode, aNode);}} </script>
很简单吧!
下面我们又来一个一份新的HTML文档,文档如下:
你爱好的运动是?<input type="checkbox" id="checkedAll" />全选/全不选<br /><input type="checkbox" name="items" value="足球" />足球<input type="checkbox" name="items" value="篮球" />篮球<input type="checkbox" name="items" value="排球" />排球<input type="checkbox" name="items" value="乒乓球" />乒乓球<br /><input type="button" id="btnAll" value="全选" /><input type="button" id="btnNo" value="全不选" /><input type="button" id="checkedRev" value="反选" /><input type="button" id="send" value="提交" />
一看这份文档,我们第一反应肯定是与按钮事件响应有关了。
需求:当点击id为checkedAll的按钮时,先检查下面的爱好选择做出选择:如果爱好全部被选择,那么checkedAll按钮要做的事情就是“全不选”;否则就是“全选”功能。
下面的button按钮根据名字就可以得知了。
每当爱好全部被打上钩时,checkedAll按钮也要被打上钩;只要不满足前面的条件,checkedAll按钮不能被打上钩。
看上去很绕,其实理清了思路,非常简单。需求正好就是我们的思路方向。
代码如下:
<script type="text/javascript">window.onload = function() {var checkedAll = document.getElementById("checkedAll");var items = document.getElementsByName("items");var length = items.length;checkedAll.onclick = function() {var flag = 0;for (var i = 0; i < length; i++) {if (items[i].checked) {//每当一个选项已经被选中时就加1flag += 1;}}//只有当全部选项都被选中时,点击按钮的效果才是“全不选”if (flag == length) {for (var j = 0; j < length; j++) {items[j].checked = false;}//记得把按钮本身的状态切换成一致,否则将会出现按钮本身未打钩而爱好的选项全打钩或者反过来的“灵异”现象this.checked = false;}//其余情况下,都是“全选”else {for (var k = 0; k < length; k++) {items[k].checked = true;}this.checked = true;}}for (var l = 0; l < length; l++) {//给所有的爱好按钮增加事件items[l].onclick = function() {check();}}var btnAll = document.getElementById("btnAll");btnAll.onclick = function() {for (var i = 0; i < length; i++) {items[i].checked = true;}check();}var btnNo = document.getElementById("btnNo");btnNo.onclick = function() {for (var i = 0; i < length; i++) {items[i].checked = false;}checkedAll.checked = false;}var checkedRev = document.getElementById("checkedRev");checkedRev.onclick = function() {for (var i = 0; i < length; i++) {if (items[i].checked) {items[i].checked = false;} else {items[i].checked = true;}}check();}var send = document.getElementById("send");send.onclick = function() {for (var i = 0; i < length; i++) {if (items[i].checked) {alert(items[i].value);}}}//当所有爱好都打钩时,全选按钮也打上钩,否则就不打钩function check() {var myFlag = 0;for (var m = 0; m < length; m++) {if (items[m].checked) {myFlag += 1;}}if (myFlag == length) {checkedAll.checked = true;} else {checkedAll.checked = false;}}} </script>
最后一份HTML文档从天而降。文档如下:
<p align="center">添加新员工</p><table align="center"><tr><td>name:<input type="text" id="name" name="name" /></td><td>email:<input type="text" id="email" name="email" /></td><td>salary:<input type="text" id="salary" name="salary" /></td></tr></table><p align="center"><input type="button" id="add" name="add" value="新增" /></p><hr><table id="employeeTable" align="center" border="1" cellpadding="5"cellspacing="0"><tr><th>name</th><th>Email</th><th>Salary</th><th></th></tr><tr><td>Tom</td><td>tom@tom.com</td><td>5000</td><td><input type="submit" name="delete" value="Delete" /></td></tr><tr><td>Mary</td><td>mary@mary.com</td><td>10000</td><td><input type="submit" name="delete" value="Delete" /></td></tr></table>
需求:新增按钮:将员工的姓名、邮箱和薪水添加到表格中;
删除按钮:confirm()提示是否将"员工名字"信息删除?确定将整行员工信息删除,否则什么也不做。
新增按钮要做的事情,其实就是文章一开始要叙述的东西,也就是把某物品装进大袋子的事情。
删除按钮,其实只要能获取到它的父节点,也就解决了。
代码如下:
<script type="text/javascript">window.onload = function() {//删除按钮触发的函数function deleteInfo(node) {var currentTr = node.parentNode.parentNode;var name = currentTr.getElementsByTagName("td")[0];var flag = confirm("是否将\"" + name.innerHTML + "\"信息删除?");//当点击确定后触发事件if (flag) {/*第一个parentNode是td,第二个parentNode是tr,第三个parentNode是table也就是说根据delete按钮所在的列所在的行所在的表格中删除掉整行(很拗口是吧?)*/node.parentNode.parentNode.parentNode.removeChild(node.parentNode.parentNode);}}var addBtn = document.getElementById("add");addBtn.onclick = function() {//3个引用的value值可以获取到文本框的值var nameNode = document.getElementById("name");var emailNode = document.getElementById("email");var salaryNode = document.getElementById("salary");//获取table元素节点var tableNode = document.getElementsByTagName("table")[1];//创建一个tr节点,后面会添加到table元素节点中var newTrNode = document.createElement("tr");//创建一个td节点,后面会添加到tr元素节点中var newName = document.createElement("td");//创建一个文本节点,添加到td元素节点中 newName.appendChild(document.createTextNode(nameNode.value));var newEmail = document.createElement("td");newEmail.appendChild(document.createTextNode(emailNode.value));var newSalary = document.createElement("td");newSalary.appendChild(document.createTextNode(salaryNode.value));var newDelete = document.createElement("td");var newDeleteBtn = document.createElement("input");newDeleteBtn.type = "button";newDeleteBtn.name = "delete";newDeleteBtn.value = "Delete";//新创建的button也应该能触发删除函数newDeleteBtn.onclick = function() {deleteInfo(this);}newDelete.appendChild(newDeleteBtn);newTrNode.appendChild(newName);newTrNode.appendChild(newEmail);newTrNode.appendChild(newSalary);newTrNode.appendChild(newDelete);tableNode.appendChild(newTrNode);}//为所有已经存在的删除按钮添加删除函数事件var deleteNodes = document.getElementsByName("delete");var length = deleteNodes.length;for (var i = 0; i < length; i++) {deleteNodes[i].onclick = function() {deleteInfo(this);}}} </script>
今天就到这里,我们下次再见!
转载于:https://www.cnblogs.com/LeaderHonestQuality/p/5666391.html
再战JavaScript相关推荐
- 第十一届蓝桥杯赛后总结 —— 两年征战蓝桥,惜败来年再战。
两年征战蓝桥,惜败来年再战. 第二次参加蓝桥杯,水了个国三,虽然有点不满意,但比去年省二好了一点点. 第十一届蓝桥杯增加了Python组,正好我也入坑了Python,就直接试水了,Python不分AB ...
- 华为手机卡在升级界面_你的华为手机变卡了,1分钟调整这3个功能,让手机再战3年...
华为手机在国内深受用户欢迎,越来越多的朋友在换手机的时候都会选择华为手机. 但手机使用就久了就会变得卡顿起来,这是各大品牌手机都不可避免的. 不过手机变卡后,一分钟调整这3个功能,让你的华为手机再战3 ...
- iPhone6s用户感动!升级ios13还能再战两年
昨日,苹果召开了2019年WWDC全球开发者大会,大会上最受关注的就是ios13的更新了,在未发布之前就传ios13将不支持iPhone6.iPhoneSE等机型了,没想到结果还真是这样. 虽然没有抛 ...
- 升级总代分享思路_旧笔记本光驱换SSD,升级内存,改造散热还能再战5年
哈喽,大家好,我是Fanfan,今天给大家分享一下怎么升级家里的旧笔记本电脑,让旧笔记本在2020焕发第二春.这就是本次的主角DELL N4050. 背景 家里有三个笔记本电脑.xps,MacBook ...
- 面试归来,感觉无望,下次再战
今天去面阿里校招研发岗,同去的还有同班的同学,去之前,我看了自己的简历.感觉写得还不算非常花俏,由于之有非常多面经都提示,在简历技能那里写上熟悉时,你得考虑面试官会问你什么.谨慎. 下去4点多过去的, ...
- 小米4 第三方re奇兔_再战三年?小米6支持升级Android 11,米10都没它快!
最近,谷歌正式推出了Android 11 beta操作系统,一大票安卓旗舰机将会逐步更新.说出来你可能不信,小米6比小米10更早的用上了最新的Android 11.据微博数码爆料大神@数码闲聊站透露: ...
- 挥别2022再战2023 | 平行云“逆势增长”与“顺势而为”
脚踏实地,2022充满艰辛但也充满干劲儿,平行云厚积薄发,逆势增长,全力革新技术高度,不断探索业务边界-- 仰望星空,2022元宇宙及XR产业爆发,作为Cloud XR技术布道者与产业推动者,平行云顺 ...
- 生死狙击2等待服务器响应,《生死狙击2》劫掠测试结束:热爱不止 来日再战!...
原标题:<生死狙击2>劫掠测试结束:热爱不止 来日再战! <生死狙击2>已于12月6日晚22时正式结束劫掠测试!感谢各位玩家的支持和参与,助力游戏品质打磨及体验优化! 劫掠玩法 ...
- 3B再战:360又一次挟持了用户
3B再战:360又一次挟持了用户 3b大战过去一年多了,最近两个又开战了.还是一个robots协议的问题.大概就是百度控告360违反 robots协议,抓取百度平台的内容.360诉称,百度公司恶意阻断 ...
最新文章
- VM 7 下ubuntu安装vmtools
- websocket 发送给前端一个对象_前端WebSocket封装
- Ubuntu GitLab CI Docker ASP.NET Core 2.0 自动化发布和部署(1)
- android 将图片路径转二进制,将图像转换为二进制图像中的android
- XShell安装lrzsz实现文件上传到Linux服务器
- Spring boot 2.4开启静态资源缓存
- 学术论文写作的 paper、code 资源
- 2019Q1中高端人才报告:薪资TOP10,平均年薪超23万元
- 平时常见的音频文件格式有哪些呢?
- java算法竞赛入门经典_算法竞赛入门经典笔记(1-3章)
- tp1900芯片对比7621a_TP-LINK WDR7660千兆版 厉害了单芯片TP1900-路由器交流
- CS5460基本读写程序(无bug版本)
- 解决Redis错误MISCONF Redis is configured to save RDB snapshots
- dell计算机的硬盘如何分区,戴尔电脑分盘怎么分区
- 【强化学习1.0】导论 多臂赌博机问题(multi-armed bandit)
- 软件开发的一些注意事项
- ArcGIS操作Excel文件没有注册类解决办法
- 3DMAX 隐藏显示物体的快捷键
- 白杨SEO:微信视频号直播功能怎么开通?视频号有什么价值?
- CLEARCO Silicone Fluids Grease Compounds
热门文章
- linux创建raid5分区,linux RAID5 创建过程以及raid5扩容步骤(软raid)
- idea 快速导入实现父类方法_三步快速提高物理成绩!准初三生暑假实现逆袭的实用方法...
- 网页设计中JS与Java的区别
- vue报错问题记录1-Cannot read property '0' of null
- Jenkins在Linux环境安装
- 团队天梯赛L1-001
- Android开发系列(十七):读取assets文件夹下的数据库文件
- osharp3使用经验:整合DbContextScope 文章 1
- url 编码和解码网址
- Android studio安装及故障排除