下面我们接着介绍创建节点。

创建节点,插入节点的方式,就好像是买一个大袋子,一个大袋子里装着一些小袋子,小袋子里分别装着不同的东西。

我们来看看代码就一目了然了:

<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相关推荐

  1. 第十一届蓝桥杯赛后总结 —— 两年征战蓝桥,惜败来年再战。

    两年征战蓝桥,惜败来年再战. 第二次参加蓝桥杯,水了个国三,虽然有点不满意,但比去年省二好了一点点. 第十一届蓝桥杯增加了Python组,正好我也入坑了Python,就直接试水了,Python不分AB ...

  2. 华为手机卡在升级界面_你的华为手机变卡了,1分钟调整这3个功能,让手机再战3年...

    华为手机在国内深受用户欢迎,越来越多的朋友在换手机的时候都会选择华为手机. 但手机使用就久了就会变得卡顿起来,这是各大品牌手机都不可避免的. 不过手机变卡后,一分钟调整这3个功能,让你的华为手机再战3 ...

  3. iPhone6s用户感动!升级ios13还能再战两年

    昨日,苹果召开了2019年WWDC全球开发者大会,大会上最受关注的就是ios13的更新了,在未发布之前就传ios13将不支持iPhone6.iPhoneSE等机型了,没想到结果还真是这样. 虽然没有抛 ...

  4. 升级总代分享思路_旧笔记本光驱换SSD,升级内存,改造散热还能再战5年

    哈喽,大家好,我是Fanfan,今天给大家分享一下怎么升级家里的旧笔记本电脑,让旧笔记本在2020焕发第二春.这就是本次的主角DELL N4050. 背景 家里有三个笔记本电脑.xps,MacBook ...

  5. 面试归来,感觉无望,下次再战

    今天去面阿里校招研发岗,同去的还有同班的同学,去之前,我看了自己的简历.感觉写得还不算非常花俏,由于之有非常多面经都提示,在简历技能那里写上熟悉时,你得考虑面试官会问你什么.谨慎. 下去4点多过去的, ...

  6. 小米4 第三方re奇兔_再战三年?小米6支持升级Android 11,米10都没它快!

    最近,谷歌正式推出了Android 11 beta操作系统,一大票安卓旗舰机将会逐步更新.说出来你可能不信,小米6比小米10更早的用上了最新的Android 11.据微博数码爆料大神@数码闲聊站透露: ...

  7. 挥别2022再战2023 | 平行云“逆势增长”与“顺势而为”

    脚踏实地,2022充满艰辛但也充满干劲儿,平行云厚积薄发,逆势增长,全力革新技术高度,不断探索业务边界-- 仰望星空,2022元宇宙及XR产业爆发,作为Cloud XR技术布道者与产业推动者,平行云顺 ...

  8. 生死狙击2等待服务器响应,《生死狙击2》劫掠测试结束:热爱不止 来日再战!...

    原标题:<生死狙击2>劫掠测试结束:热爱不止 来日再战! <生死狙击2>已于12月6日晚22时正式结束劫掠测试!感谢各位玩家的支持和参与,助力游戏品质打磨及体验优化! 劫掠玩法 ...

  9. 3B再战:360又一次挟持了用户

    3B再战:360又一次挟持了用户 3b大战过去一年多了,最近两个又开战了.还是一个robots协议的问题.大概就是百度控告360违反 robots协议,抓取百度平台的内容.360诉称,百度公司恶意阻断 ...

最新文章

  1. VM 7 下ubuntu安装vmtools
  2. websocket 发送给前端一个对象_前端WebSocket封装
  3. Ubuntu GitLab CI Docker ASP.NET Core 2.0 自动化发布和部署(1)
  4. android 将图片路径转二进制,将图像转换为二进制图像中的android
  5. XShell安装lrzsz实现文件上传到Linux服务器
  6. Spring boot 2.4开启静态资源缓存
  7. 学术论文写作的 paper、code 资源
  8. 2019Q1中高端人才报告:薪资TOP10,平均年薪超23万元
  9. 平时常见的音频文件格式有哪些呢?
  10. java算法竞赛入门经典_算法竞赛入门经典笔记(1-3章)
  11. tp1900芯片对比7621a_TP-LINK WDR7660千兆版 厉害了单芯片TP1900-路由器交流
  12. CS5460基本读写程序(无bug版本)
  13. 解决Redis错误MISCONF Redis is configured to save RDB snapshots
  14. dell计算机的硬盘如何分区,戴尔电脑分盘怎么分区
  15. 【强化学习1.0】导论 多臂赌博机问题(multi-armed bandit)
  16. 软件开发的一些注意事项
  17. ArcGIS操作Excel文件没有注册类解决办法
  18. 3DMAX 隐藏显示物体的快捷键
  19. 白杨SEO:微信视频号直播功能怎么开通?视频号有什么价值?
  20. CLEARCO Silicone Fluids Grease Compounds

热门文章

  1. linux创建raid5分区,linux RAID5 创建过程以及raid5扩容步骤(软raid)
  2. idea 快速导入实现父类方法_三步快速提高物理成绩!准初三生暑假实现逆袭的实用方法...
  3. 网页设计中JS与Java的区别
  4. vue报错问题记录1-Cannot read property '0' of null
  5. Jenkins在Linux环境安装
  6. 团队天梯赛L1-001
  7. Android开发系列(十七):读取assets文件夹下的数据库文件
  8. osharp3使用经验:整合DbContextScope 文章 1
  9. url 编码和解码网址
  10. Android studio安装及故障排除