JavaScript---DOM---节点操作---12.3

news/2024/9/25 1:58:33/

为什么学节点操作?

获取元素通常使用两种方式:

1.利用DOM提供的方法获取元素

  • document.getElementByld()
  • document.getElementsByTagName()
  • document.querySelector等
  • 逻辑性不强,繁琐

2.利用节点层级关系获取元素(操作更简单)

  • 利用父子兄节点关系获取元素
  • 逻辑性强,但是兼容性稍差

节点概述

网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM中,节点使用node来表示。
HTML DOM树中的所有节点均可通过JavaScript进行访问,所有HTML元素(节点)均可被修改,也可以创建或删除。

一般地,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个基本属性。

  • 元素节点nodeType为1
  • 属性节点nodeType为2
  • 文本节点nodeType为3(文本节点包含文字、空格、换行等)

我们在实际开发中,节点操作主要操作的是元素节点。

节点层级

利用DOM树可以把节点划分为不同的层级关系,常见的是父子兄层级关系

父级节点:node.parentNode

<div class="box"><span class="erweima">×</span>
</div>
<script>var erweima = document.querySelector('.erweima');erweima.parentNode;//parentNode属性返回某节点的最近的一个父节点//如果指定的节点没有父节点,则返回nullconsole.log(erweima.parentNode);
</script>

子级节点

1.parentNode.childNodes(标准)

parentNode.childNodes返回包含指定节点的子节点的集合,该集合为即时更新的集合。

注意:返回值里面包含了所有的子节点,包括元素节点,文本节点等。
如果只想要获得里面的元素节点,则需要专门处理。所以我们一般不提倡使用childNodes!!!!

var ul = document.queryselector('ul');
for(var i=0;i<ul.childNodes.length;i++) {
     if (ul.childNodes[i].nodeType == 1) {
          //ul.childNodes[i]是元素节点
          console.log(ul.childNodes[i]);

     }

}

2.parentNode.children(非标准)

parentNode.children是一个只读属性,返回所有的子元素节点。它只返回子元素节点,其余节点不返回。这个是我们重点掌握的!!!!!
虽然children是一个非标准,但是得到了各个浏览器的支持,因此我们可以放心使用。

<ul><li></li><li></li>
</ul>
<script>var ul = document.querySelector('ul');ul.children;console.log(ul.children);
</script>

3.parentNode.firstChild

firstChild返回第一个子节点,找不到侧返回null。同样,也是包含所有的节点。

4.parentNode.lastChild

lastChild返回最后一个子节点,找不到则返回null。同样,也是包含所有的节点。

5.parentNode.firstElementChild

firstElementchild返回第一个子元素节点,找不到则返回null。

6.parentNode.lastElementChild
lastElementChild返回最后一个子元素节点,找不到则返回null。

<ol><li>我是1</li><li>我是2</li><li>我是3</li><li>我是4</li>
</ol>
<script>var ol = document.querySelector('ol');ol.firstElementChild;console.log(ol.firstElementChild);console.log(ol.lastElementChild);
</script>

案例:下拉菜单

<style>* {padding: 0;margin: 0;list-style: none;}.nav>li {position: relative;float: left;width: 80px;height: 41px;text-align: center;}.nav li a {display: block;width: 100%;height: 100%;line-height: 41px;text-decoration: none;color: black;}.nav>li>a:hover {background-color: pink;}.nav ul {display: none;position: absolute;top: 41px;left: 0;width: 100%;border-left: 1px solid skyblue;border-right: 1px solid skyblue;}.nav ul li {border-bottom: 1px solid skyblue;}.nav ul li:hover {background-color: skyblue;}
</style><ul class="nav"><li><a href="#">微博</a><ul><li><a href="#">私信</a></li><li><a href="#">评论</a></li></ul></li><li><a href="#">微博</a><ul><li><a href="#">私信</a></li><li><a href="#">评论</a></li></ul></li>
</ul><script>var nav = document.querySelector('.nav');var lis = nav.children;for(var i=0; i<lis.length; i++) {lis[i].onmouseover = function() {this.children[1].style.display = 'block';}lis[i].onmouseout = function() {this.children[1].style.display = 'none';}}
</script>

兄弟节点

1.node.nextSibling

nextSibling返回当前元素的下一个兄弟节点,找不到则返回null。同样也包含所有节点。

2.node.previousSibling

previousSibling返回当前元素的上一个兄弟节点,找不到则返回null。同样也包含所有节点。

3.node.nextElementSibling

nextElementSibling返回当前元素的下一个兄弟元素节点,找不到则返回null。

4.node.previousElementSibling

previousElementSibling返回当前元素的上一个兄弟元素节点,找不到则返回null。

<div>我是div</div>
<span>我是span</span>
<script>var div = document.querySelector('div');div.nextSibling;console.log(div.nextElementSibling);
</script>

创建添加节点

创建节点

document.createElement('tagName')

此方法创建由tagName指定的HTML元素。因为这些元素原先不存在,是根据我们的需求动态生成的,所以我们也称为动态创建元素节点

添加节点

1.node.appendChild(child)

此方法将一个节点添加到指定父节点的子节点列表末尾,类似于css里面的after伪元素。

<ul><li>1234</li></ul>
<script>var ul = document.querySelector('ul');var li = document.createElement('li');ul.appendChild(li);
</script>

2.node.insertBefore(child,指定元素)

此方法将一个节点添加到父节点的指定子节点前面。类似于css里面的before伪元素。

<ul><li>1234</li></ul>
<script>var ul = document.querySelector('ul');var lii = document.createElement('li');ul.insertBefore(lii,ul.children[0]);
</script>

案例:简单版发布留言案例

<textarea name="" id="" cols="30" rows="10"></textarea>
<button>发布</button>
<ul> <li>123</li> </ul>
<script>var btn = document.querySelector('button');var text = document.querySelector('textarea');var ul = document.querySelector('ul');btn.onclick = function() {if(text.value == '') {alert('您没有输入内容');return false;} else {var li = document.createElement('li');li.innerHTML = text.value;ul.insertBefore(li,ul.children[0]);}}
</script>

删除节点

node.removeChild(child)

此方法从DOM中删除一个子节点,返回删除的节点。

<button>删除</button>
<ul> <li>11</li> <li>22</li> <li>33</li> </ul>
<script>var ul = document.querySelector('ul');var btn = document.querySelector('button');btn.onclick = function() {if(ul.children.length == 0) {this.disabled = true;}else {ul.removeChild(ul.children[0]);}}
</script>

案例:简单版删除留言案例

<textarea name="" id="" cols="30" rows="10"></textarea>
<button>发布</button>
<ul> <li>123</li> </ul>
<script>var btn = document.querySelector('button');var text = document.querySelector('textarea');var ul = document.querySelector('ul');btn.onclick = function() {if(text.value == '') {alert('您没有输入内容');return false;} else {var li = document.createElement('li');li.innerHTML = text.value + "<a href='javascript:;'>删除</a>";ul.insertBefore(li,ul.children[0]);var as = document.querySelectorAll('a');for(var i=0; i<as.length; i++) {as[i].onclick = function() {ul.removeChild(this.parentNode);//当前a所在的li就是this.parentNode}}}}
</script>

复制节点(克隆节点)

node.cloneNode()

此方法返回调用该方法的节点的一个副本。也称为克隆节点/拷贝节点。

  • 如果cloneNode()参数为空或false,则为浅拷贝,只复制节点本身,不复制子节点(内容)。
  • 如果cloneNode()参数为true,则为深度拷贝,会复制节点本身以及里面的所有子节点。
<ul> <li>1</li> <li>2</li> <li>3</li> </ul>
<script>var ul = document.querySelector('ul');var lii = ul.children[0].cloneNode(true);ul.appendChild(lii);
</script>

案例:动态生成表格

<style>table {width: 500px;border-collapse: collapse;text-align: center;}td,th {border: 1px solid #333;}thead tr {height: 40px;background-color: #ccc;}
</style><table cellspacing="0"><thead><tr><th>姓名</th> <th>科目</th> <th>成绩</th> <th>操作</th></tr></thead><tbody></tbody>
</table><script>var datas = [{name:'陈亚婷',subject:'JavaScript',score:'100'},{name:'赵飞帆',subject:'JavaScript',score:'99' },{name:'张三三',subject:'JavaScript',score:'88' }];// 创建tbody的行var tbody = document.querySelector('tbody');for(var i=0; i<datas.length; i++) {var tr = document.createElement('tr');tbody.appendChild(tr);for(var k in datas[i]) {  //for…in 用于对数组或者对象的属性进行循环操作//创建单元格var td = document.createElement('td');td.innerHTML = datas[i][k];tr.appendChild(td);}var td = document.createElement('td');td.innerHTML = '<a href="javascript:;">删除</a>';tr.appendChild(td);}var as = document.querySelectorAll('a');for(var i=0; i<as.length; i++) {as[i].onclick = function() {tbody.removeChild(this.parentNode.parentNode);}}
</script>

三种动态创建元素区别

document.write()  了解即可

直接将内容写入页面的内容流,但是文档流执行完毕,则它会导致页面全部重绘。

element.innerHTML   效率高

将内容写入某个DOM节点,不会导致页面全部重绘。创建多个元素效率更高(不要拼接字符串,采取数组形式拼接),结构稍微复杂。

document.createElement()   效率低

创建多个元素效率稍低一点点,但是结构更清晰。


http://www.ppmy.cn/news/9425.html

相关文章

5G NR标准 第13章 重传协议

5G NR标准 第13章 重传协议

第13章 重传协议 通过无线信道的传输容易出错&#xff0c;例如&#xff0c;由于接收信号质量的变化。 在某种程度上&#xff0c;这种变化可以通过第 14 章中讨论的链路适配来抵消。但是&#xff0c;接收机噪声和不可预测的干扰变化无法抵消。 因此&#xff0c;几乎所有无线通…
阅读更多...
fs 文件系统模块

fs 文件系统模块

1、什么是 fs 文件系统模块 fs 模块是 Node.js 官方提供的、用来操作文件的模块。它提供了一系列的方法和属性&#xff0c;用来满足用户对文件的操作需求。 方法名 说明 fs.readFile() 用来读取指定文件中的内容 fs.writeFile() 用来向指定的文件中写入内容 如果要在 J…
阅读更多...
uniapp开发小程序引入微信快递跟踪(快递100)插件

uniapp开发小程序引入微信快递跟踪(快递100)插件

目录 1.小程序插件接入 2.代码示例 3.页面接收参数 4.常用快递100公司编码表 1.小程序插件接入 微信快递100插件地址&#xff1a;快递100-快递查询&#xff08;免费接入&#xff09; | 微信服务市场 (qq.com) 1&#xff09;进入链接地址 2&#xff09;登陆开发小程序的账…
阅读更多...
C++模板

C++模板

文章目录C模板函数模板函数模板的实例化隐式实例化&#xff1a;让编译器根据实参推演模板参数的实际类型显示实例化&#xff1a;在函数名后用<>来指定实际类型模板参数的匹配原则总结&#xff1a;类模板模板的分离编译问题C模板 函数模板 前面学过了函数重载&#xff0…
阅读更多...
cc1-7分析-2

cc1-7分析-2

cc2 cc2和cc4呢其实区别也不是很大&#xff0c;最后的rce的方式也都是一样的。区别在哪呢&#xff0c;之前我们说过TemplatesImpl.newTransformer是可以直接进行rce的&#xff0c;cc2就是通过 InvokerTransformer直接去调用TemplatesImpl.newTransformer&#xff0c;不走Insta…
阅读更多...
【论文阅读】《知识图谱可解释推理研究综述》阅读(二)

【论文阅读】《知识图谱可解释推理研究综述》阅读(二)

声明:仅学习使用~ 此为个人阅读笔记。 上一篇:【论文阅读】《知识图谱可解释推理研究综述》阅读(一),介绍了可解释性推理知识推理的由来 以及 事前可解释推理,并详细介绍了事前可解释推理 的类型 以及 其中 涉及到的具体算法。在阅读算法的具体解析时,深刻感受到了 国…
阅读更多...
我的【二哈喇子!】周岁生日

我的【二哈喇子!】周岁生日

文章目录回看CSDN的2022新年新Flag回看CSDN的2022 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 各位朋友大家好&#xff0c;我是二哈喇子&#xff01;谢谢你现在在阅读这篇文章。 二零二二年一月二十一日&#xff0c;我的小二哈"出生"了&#x…
阅读更多...
Rxjava源码分析实践(八)【源码环节:Rxjava 常见创建操作符原理解析】

Rxjava源码分析实践(八)【源码环节:Rxjava 常见创建操作符原理解析】

之前的Rxjava几节课,我们通过自己编程实现了Rxjava的基本框架、事件切换、线程切换等主要功能,而且简单实现了一个map操作符。本节,我们和大家一起来直接看一下,Rxjava几个重要的操作符的源码,我们就不再一一编程实现了。 总体来说, Rxjava的常见操作符分为创建操作符、转…
阅读更多...
最新文章

深圳SEO优化公司齐齐哈尔市网站seo优化排名嘉兴网站深度优化鸡西网站优化公司哪家好大连实力强的珠宝行业网站优化seo网站优化价格韶关公司网站关键词优化推广淮安网站优化公司方案网站优化师资格证莒南临沂网站优化银川网站优化加盟三亚网站优化多少钱怀柔哪家网站优化好如何在seo优化网站北京网站推广优化报价麻涌网站优化多少钱静安区官网网站优化价格费用淮南优化网站建设江苏网站优化公司排名临清网站优化企业服务网站的优化找选火11星无锡网站优化收费价格青县网站优化选哪家网站性能和优化深圳国内网站优化哪家好优化广告网站百姓网标王网站seo优化论坛盘锦软件优化网站郑州seo网站优化方案什么网站是优化网歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化