网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM中,节点使用node来表示。
HTML DOM树中的所有节点均可通过JavaScript进行访问,所有HTML元素(节点)均可被修改,也可以创建或删除。
一般地,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个基本属性。
- 元素节点nodeType为1
- 属性节点nodeType为2
- 文本节点nodeType为3(文本节点包含文字、空格、换行等)
我们在实际开发中,节点操作主要操作的是元素节点。
利用DOM树可以把节点划分为不同的层级关系,常见的是父子兄层级关系。
<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>
此方法创建由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()
此方法返回调用该方法的节点的一个副本。也称为克隆节点/拷贝节点。
<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>
直接将内容写入页面的内容流,但是文档流执行完毕,则它会导致页面全部重绘。
将内容写入某个DOM节点,不会导致页面全部重绘。创建多个元素效率更高(不要拼接字符串,采取数组形式拼接),结构稍微复杂。
创建多个元素效率稍低一点点,但是结构更清晰。
深圳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次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运