💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
[TOC] # 页面添加节点步骤 我们想要页面添加一个新的元素: 1.创建元素2.添加元素 # 5.1为什么学节点操作 ![](https://img.kancloud.cn/d9/13/d913c9b5a0a2d5fdb9de7a761d14225b_1107x312.png) ~~~ 获取元素通常使用两种方式: 1.利用DOM提供的方法获取元素 document.getElementByld() document.getElementsByTagName() document.querySelector等 逻辑性不强、繁琐 2.利用节点层级关系获取元素 利用父子兄节点关系获取元素 逻辑性强,但是兼容性稍差 这两种方式都可以获取元素节点,我们后面都会使用,但是节点操作更简单 ~~~ # 5.2节点概述 (主要获取标签元素节点) ![](https://img.kancloud.cn/0d/79/0d794948ddb750640a3f73e1ad7bedd7_1012x511.png) # 5.2节点(使用)概述 ![](https://img.kancloud.cn/f3/8a/f38a964aad808f1326821d19bf79494b_1035x341.png) ~~~ 一般地,节点至少拥有nodeType(节点类型) 、nodeName(节点名称)和nodeValue(节点值)这三个基本属性。 1.元素节点nodeType为1 2.属性节点nodeType 为2 3.文本节点nodeType为3(文本节点包含文字、空格、换行等) 我们在实际开发中,节点操作主要操作的是元素节点 ~~~ # 5.3节点层级 (使用) 利用DOM树可以把节点划分为不同的层级关系,常见的是**父子兄层级**关系。 ![](https://img.kancloud.cn/fa/52/fa5290177bc352d1797365d3c7aad450_639x405.png) # 1.父级节点(父子节点) (**主要 重点**) ~~~ 根据这个元素获取他父元素属性 node.parentNode ~~~ 注意 ![](https://img.kancloud.cn/e8/3c/e83c733cb8ae8a436e65a99d871b9e18_712x87.png) ![](https://img.kancloud.cn/3a/63/3a631f330e3498b5e315bd6f031bc4e3_752x346.png) ## 2.子节点(1)(所有节点都获取 太麻烦 很少使用) ~~~ 1. parentNode.childNodes(标准) ~~~ parentNode.childNodes返回包含指定节点的子节点的集合,该集合为即时更新的集合。 ![](https://img.kancloud.cn/ce/58/ce582e9dd025824b33d299be7c1dd6d0_960x91.png) ~~~ var ul = document. queryselector ( 'ul'); for(var i = o; i < ul.childNodes . length; i++) { if (ul.childNodes[i].nodeType -- 1){ // ul.childNodes[i]是元素节点 console.log(ul.childNodes[i]); } } ~~~ ## 2.子节点(2 获取子节点**常用**)(只获取元素节点) ~~~ 2. parentNode.children(非标准) 在开发常用 ~~~ ![](https://img.kancloud.cn/0a/ba/0aba63661b00c66b8f308d1fc08a462f_994x120.png) ### 子节点使用 1、先获取父节点 2、父节点名.children(获取 子节点) ![](https://img.kancloud.cn/55/32/5532af160dd82ec67e0d97eafb3f9678_777x76.png) ![](https://img.kancloud.cn/51/b7/51b750de503cbd8c6fdd1ad9e80be5c4_788x77.png) ## 获取第一个子节点和最后一个节点 (不常用) 获取所有节点(包括不用的 换行,空格等**所以不常用**) 3\. parentNode.firstChild 第一个节点 firstChild返回第一个子节点,找不到则返回null。同样,也是**包含所有的节点。** 4\. parentNode . lastChild 最后一个节点 ## 获取第一个子节点和最后一个节点 注意:这两个方法有兼容性问题,IE9以上才支持。 ~~~ 第一个子元素节点 5. parentNode .firstElementChild firstElementchild 返回第一个子元素节点,找不到则返回null。 6. parentNode . lastElementChild lastElementchild返回最后一个子元素节点,找不到则返回null。 ~~~ ## 获取第一个子节点和最后一个节点 (开发版 使用) ~~~ //querySelector( 'ol ')获取ol元素 querySelector( '.call ')获取类元素 var ol = document.querySelector( 'ol ') //获取标签元素 // 3.实际开发的写法 既没有兼容性问题又返回第一个子元素 console.log(ol.children[0]);//获取第一个子节点 console.log(ol.children[ol.children.length -1]);//获取最后一个节点 ~~~ ## 2.兄弟节点 ### 下一个兄弟节点 ~~~ 1. node.nextsibling ~~~ nextsibling 返回当前元素的下一个兄弟节点,找不到则返回null。同样,也是包含所有的节点。 ### 下一个兄弟节点 ~~~ 2. node.previoussibling ~~~ previoussibling返回当前元素上一个兄弟节点,找不到则返回null。同样,也是包含所有的节点。 ## 兄弟元素节点 ![](https://img.kancloud.cn/e1/58/e1588bb6f61b4d64244ba090bcc3885e_538x41.png) ### 下一个兄弟元素节点 ~~~ 3. node.nextElementsibling nextElementsibling返回当前元素下一个兄弟元素节点,找不到则返回null ~~~ ### 上一个兄弟元素节点 ~~~ 4. node.previousElementsibling previousElementsibling返回当前元素上一个兄弟元素节点,找不到则返回null。 注意∶这两个方法有兼容性问题,IE9以上才支持。 ~~~ ![](https://img.kancloud.cn/33/bf/33bf30413cf75c8fbaa125571fed7095_914x308.png) ### 解决兄弟元素节点兼容性 ![](https://img.kancloud.cn/e7/05/e7050f3d6f779ae8a3497618499371f2_1058x564.png) # 5.4创建节点 ~~~ document.createElement ( "tagName " ) ~~~ ![](https://img.kancloud.cn/1a/f8/1af84748bed31020a1b34d71cddeeac4_983x79.png) ## 添加节点 (在后面添加节点) ~~~ 1. node.appendchild(child) ~~~ ![](https://img.kancloud.cn/a2/31/a231946b907f84ac046a345d3ef82ba6_970x91.png) ### 后面添加节点使用方法 ![](https://img.kancloud.cn/e8/8e/e88ed533a328166a09928d1de9b526fe_877x279.png) ## 添加节点 (在(指定的元素)前面添加节点) ~~~ 2. node.insertBefore (child,指定元素) ~~~ ![](https://img.kancloud.cn/ed/34/ed34aaa00bf68c8cb4d4d69d9c8585df_997x80.png) ### 前面添加节点使用方法 ![](https://img.kancloud.cn/a5/02/a50255280af783169118a7726b80c006_1375x449.png) # (父子节点)案例:下拉菜单 (节点) ![](https://img.kancloud.cn/34/4f/344f336596a883964314f6520b42425d_638x390.png) 一开始是显示布局的开发 (下面是用定位做的 做完隐藏 display: none ;) ![](https://img.kancloud.cn/6b/f9/6bf9ec0b0829f8236c4ce3fbf4f6bbf6_467x261.png) 布局完后,所有样式隐藏起来 (display: none ;) ![](https://img.kancloud.cn/2f/13/2f13dcce97132ee1754c84e454d57b49_451x191.png) ## 案例分析 ①导航栏里面的i都要有鼠标经过效果,所以需要循环注册鼠标事件 ②核心原理:当鼠标经过Ii里面的第二个孩子ul显示,当鼠标离开,则u|隐藏 ## 代码实验 1、获取元素 2、循环注册事件 ~~~ <script> // 1.获取元素 var nav = document.querySelector(' .nav' );//(获取它的类元素) var lis =nav.children; //得到4个小li (获取它的子节点) // 2.循环注册事件 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> ~~~ # (创建节点)案例:简单版发布留言案例 ![](https://img.kancloud.cn/24/fe/24fe0fd1abaffcc89f23f5d7b93cead9_500x263.png) ## 案例分析 ①核心思路:点击按钮之后,就动态创建一个i ,添加到ul里面。 ②创建i的同时,把文本域里面的值通过li.innerHTML赋值给li ③如果想要新的留言后面显示就用appendChild如果想要前面显示就用insertBefore ## 代码实验 ### html ![](https://img.kancloud.cn/93/cc/93ccb0141920340d3c1b6e4d8964a93d_756x163.png) ### js ~~~ <script> //1.获取元素 var text = document.querySelector( ' textarea'); //获取文本域 var btn = document.querySelector( ' button' ); // 获取发布按钮 var ul = document.querySelector('ul' ); // 获取 (内容发布后展示位置) //2.注册事件 btn. onclick = function() { if (text.value == ' ' ) { alert('你没有发布内容) return false } else { // console.log(text.value); //(1)创建元素 var li = document.createElement(' li' ) //先有li 才能赋值 li. innerHTML = text.value; //文本的内容 赋予给左边的 li.内容 //(2)添加元素 //ul.appendChild(li) //在后面 插入 ul.insertBefore(li, ul.children[0]) //在前面 插入 } </script> ~~~