一、概述
1.1、什么是DOM
            文档对象模型(Document Object Model,简称 DOM),是 W3C 组织推荐的处理可扩展标记语言(HTML或者XML)的标准编程接口。 
            W3C 已经定义了一系列的 DOM 接口,通过这些 DOM 接口可以改变网页的内容、结构和样式。
1.2、DOM 树

- 文档:一个页面就是一个文档,DOM 中使用 document 表示
- 元素:页面中的所有标签都是元素,DOM 中使用 element 表示
- 节点:网页中的所有内容都是节点(标签、属性、文本、注释等),DOM 中使用 node 表示
二、获取元素
2.1、概述
        DOM在我们实际开发中主要用来操作元素。我们如何来获取页面中的元素呢?
        获取页面中的元素可以使用以下几种方式:
- 根据 ID 获取
- 根据标签名获取
- 根据name名称获取
- 通过 HTML5 新增的方法获取
- 特殊元素获取
2.2、根据ID获取
        使用 getElementById() 方法可以获取带有 ID 的元素对象。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | <body><div id="myDiv">HelloWorld</div>
 <script>
 var divObj = document.getElementById("myDiv");
 console.log(divObj);
 console.log(typeof divObj);
 
 
 console.dir(divObj);
 </script>
 </body>
 
 | 
2.3、根据标签名获取
        使用getElementsByTagName() 方法可以返回带有指定标签名的对象的集合。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 
 | <body><ul>
 <li>HTML</li>
 <li>JavaScript</li>
 <li>CSS3</li>
 </ul>
 
 <script>
 var liObjs = document.getElementsByTagName("li");
 console.log(liObjs);
 
 
 for (var i = 0; i < liObjs.length; i++) {
 console.log(liObjs[i]);
 }
 </script>
 </body>
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 
 | <body><ul>
 <li>HTML</li>
 <li>JavaScript</li>
 <li>CSS3</li>
 </ul>
 <ol>
 <li>Vue</li>
 <li>React</li>
 </ol>
 <script>
 
 
 
 var olObjs = document.getElementsByTagName("ol");
 
 
 var liObjs = olObjs[0].getElementsByTagName("li");
 
 
 for (var i = 0; i < liObjs.length; i++) {
 console.log(liObjs[i]);
 }
 </script>
 </body>
 
 | 
2.4、根据name名称获取
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | <body>跳舞: <input type="checkbox" name="hobby">
 唱歌: <input type="checkbox" name="hobby">
 学习: <input type="checkbox" name="hobby">
 
 <script>
 var hobbyObjs = document.getElementsByName("hobby");
 
 
 for (var i = 0; i < hobbyObjs.length; i++) {
 console.log(hobbyObjs[i]);
 }
 </script>
 </body>
 
 | 
2.5、通过 HTML5 新增的方法获取
2.5.1、根据类名获得某些元素集合
        方法:getElementsByClassName
| 12
 3
 4
 5
 6
 7
 8
 
 | <body><div class="box">盒子1</div>
 <div class="box">盒子2</div>
 <script>
 var boxObjs = document.getElementsByClassName("box");
 console.log(boxObjs);
 </script>
 </body>
 
 | 
2.5.2、根据指定选择器返回第一个元素对象
        方法:querySelector
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 
 | <body><div class="box">盒子1</div>
 <div class="box">盒子2</div>
 <div id="nav">
 <ul>
 <li>首页</li>
 <li>产品</li>
 </ul>
 </div>
 <script>
 
 var boxObj = document.querySelector(".box");
 console.log(boxObj);
 
 
 var liObj = document.querySelector("li");
 console.log(liObj);
 </script>
 </body>
 
 | 
2.5.3、根据指定选择器返回所有元素
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 
 | <body><div class="box">盒子1</div>
 <div class="box">盒子2</div>
 <div id="nav">
 <ul>
 <li>首页</li>
 <li>产品</li>
 </ul>
 </div>
 <script>
 
 var boxObjs = document.querySelectorAll(".box");
 console.log(boxObjs);
 
 
 var liObjs = document.querySelectorAll("li");
 console.log(liObjs);
 </script>
 </body>
 
 | 
2.6、特殊元素获取
2.6.1、获取body 元素
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | <body><script>
 
 
 
 var bodyObj1 = document.body;
 console.log(bodyObj1);
 
 
 var bodyObj2 = document.getElementsByTagName("body")[0];
 console.log(bodyObj2);
 </script>
 </body>
 
 | 
2.6.2、获取html 元素
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | <body><script>
 
 
 
 var htmlObj1 = document.documentElement;
 console.log(htmlObj1);
 
 
 var htmlObj2 = document.getElementsByTagName("html")[0];
 console.log(htmlObj2);
 </script>
 </body>
 
 | 
三、事件基础
3.1、概述
        网页中的每个元素都可以产生某些可以触发 JavaScript 的事件,例如,我们可以在用户点击某按钮时产生一个事件,然后去执行某些操作。
3.2、事件三要素
- 事件源 (谁,指的是事件被触发的对象 ) 
- 事件类型 (什么事件,指的是鼠标点击、还是鼠标经过、还是键盘按下) 
- 事件处理程序 (做啥, 通过一个函数赋值的方式完成一个功能) 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
 | <body><button id="btn">点我</button>
 <script>
 
 
 
 var btnObj = document.getElementById("btn");
 
 
 
 btnObj.onclick = function() {
 alert("按钮被点击了...");
 }
 </script>
 </body>
 
 | 
3.3、常见的鼠标事件

四、操作元素
4.1、概述
        JavaScript 的 DOM 操作可以改变网页内容、结构和样式,我们可以利用 DOM 操作元素来改变元素里面的内
容 、属性等。注意以下都是属性。
4.2、改变/获取元素内容
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | <body><div id="myDiv">HelloWorld</div>
 <script>
 
 var divObj = document.getElementById("myDiv");
 console.log(divObj.innerHTML);
 console.log(divObj.innerText);
 </script>
 </body>
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 
 | <body><button id="btn1">通过innertHTML改变div内容</button>
 <button id="btn2">通过innertText改变div内容</button>
 
 <div id="myDiv">HelloWorld</div>
 <script>
 
 var divObj = document.getElementById("myDiv");
 
 
 var btn1Obj = document.getElementById("btn1");
 var btn2Obj = document.getElementById("btn2");
 
 btn1Obj.onclick = function() {
 divObj.innerHTML = "<h1>JavaScript</h1>"
 }
 
 btn2Obj.onclick = function() {
 divObj.innerText = "<h1>JavaScript</h1>"
 }
 </script>
 </body>
 
 | 
4.3、常用元素的属性操作

| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 
 | <body><button id="ldh">刘德华</button>
 <button id="zxy">张学友</button> <br>
 <img src="images/ldh.jpg" alt="" title="刘德华">
 <script>
 
 var btn1Obj = document.getElementById("ldh");
 var btn2Obj = document.getElementById("zxy");
 
 
 var imgObj = document.querySelector("img");
 
 btn1Obj.onclick = function() {
 imgObj.src = "images/ldh.jpg";
 }
 
 btn2Obj.onclick = function() {
 imgObj.src = "images/zxy.jpg";
 }
 </script>
 </body>
 
 | 
4.4、表单元素的属性操作
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 
 | <body><button>按钮</button>
 <input type="text" value="用户名">
 <script>
 
 
 
 var btnObj = document.querySelector("button");
 
 var inputObj = document.querySelector("input");
 
 btnObj.onclick = function() {
 
 inputObj.value = '张三';
 
 this.disabled = true;
 }
 </script>
 </body>
 
 | 
4.5、样式属性操作
4.5.1、说明
        我们可以通过 JS 修改元素的大小、颜色、位置等样式。

        注意:
- JS 里面的样式采取驼峰命名法 比如 fontSize、 backgroundColor
- JS 修改 style 样式操作,产生的是行内样式,CSS 权重比较高
4.5.2、行内样式操作
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 
 | <head><style>
 div {
 width: 200px;
 height: 200px;
 background-color: pink;
 }
 </style>
 </head>
 <body>
 <div></div>
 <script>
 
 
 
 var divObj = document.querySelector("div");
 
 divObj.onclick = function() {
 this.style.backgroundColor = 'red';
 this.style.width = '500px';
 }
 </script>
 </body>
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 
 | <head><style>
 div {
 width: 200px;
 height: 200px;
 background-color: pink;
 }
 </style>
 </head>
 <body>
 <div></div>
 <button>隐藏</button>
 <script>
 
 
 
 var divObj = document.querySelector("div");
 
 var buttonObj = document.querySelector("button");
 
 var flag = true;
 buttonObj.onclick = function() {
 if (flag) {
 
 divObj.style.display = 'none';
 flag = false;
 this.innerHTML = '显示'
 } else {
 divObj.style.display = 'block';
 flag = true;
 this.innerHTML = '隐藏'
 }
 }
 </script>
 </body>
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 
 | <body><input type="text" value="搜索你想要的内容呗">
 <script>
 
 
 
 var inputObj = document.querySelector("input");
 
 
 inputObj.onfocus = function() {
 if (this.value === '搜索你想要的内容呗') {
 this.value = '';
 }
 };
 
 inputObj.onblur = function() {
 if (this.value === '') {
 this.value = '搜索你想要的内容呗';
 }
 };
 </script>
 </body>
 
 | 
4.5.3、类名样式操作
| 12
 3
 4
 
 | # 使用场景1. 如果样式修改较多,可以采取操作类名方式更改元素样式。
 2. class因为是个保留字,需要使用className来操作元素类名属性
 3. className会直接更改元素的类名,会覆盖原先的类名。
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 
 | <head><style>
 .first {
 width: 200px;
 height: 200px;
 background-color: pink;
 margin-top: 100px;
 }
 
 .newChangeStyle {
 width: 300px;
 height: 300px;
 background-color: red;
 color: blue;
 }
 </style>
 </head>
 <body>
 <div class="first">HelloWorld</div>
 <script>
 
 
 
 var divObj = document.querySelector("div");
 
 divObj.onclick = function() {
 
 
 
 
 this.className = 'first newChangeStyle';
 };
 </script>
 </body>
 
 | 
4.6、总结

4.7、排他思想
4.7.1、需求

        如果有同一组元素,我们想要某一个元素实现某种样式, 需要用到循环的排他思想算法:
- 所有元素全部清除样式(干掉其他人)
- 给当前元素设置样式 (留下我自己)
- 注意顺序不能颠倒,首先干掉其他人,再设置自己
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 
 | <body><button>按钮1</button>
 <button>按钮2</button>
 <button>按钮3</button>
 <button>按钮4</button>
 <button>按钮5</button>
 <script>
 
 
 
 var buttonObjs = document.querySelectorAll("button");
 
 for (var i = 0; i < buttonObjs.length; i++) {
 buttonObjs[i].onclick = function() {
 
 for (var j = 0; j < buttonObjs.length; j++) {
 buttonObjs[j].style.backgroundColor = '';
 }
 
 this.style.backgroundColor = 'red';
 }
 }
 </script>
 </body>
 
 | 
4.7.2、案例1
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 
 | <body><table border="1px">
 <thead>
 <tr>
 <th>代码</th>
 <th>名称</th>
 <th>最新公布净值</th>
 <th>累计净值</th>
 <th>前单位净值</th>
 <th>净值增长率</th>
 </tr>
 </thead>
 <tbody>
 <tr>
 <td>003526</td>
 <td>农银金穗3个月定期开放债券</td>
 <td>1.075</td>
 <td>1.079</td>
 <td>1.074</td>
 <td>+0.047%</td>
 </tr>
 <tr>
 <td>003526</td>
 <td>农银金穗3个月定期开放债券</td>
 <td>1.075</td>
 <td>1.079</td>
 <td>1.074</td>
 <td>+0.047%</td>
 </tr>
 <tr>
 <td>003526</td>
 <td>农银金穗3个月定期开放债券</td>
 <td>1.075</td>
 <td>1.079</td>
 <td>1.074</td>
 <td>+0.047%</td>
 </tr>
 <tr>
 <td>003526</td>
 <td>农银金穗3个月定期开放债券</td>
 <td>1.075</td>
 <td>1.079</td>
 <td>1.074</td>
 <td>+0.047%</td>
 </tr>
 <tr>
 <td>003526</td>
 <td>农银金穗3个月定期开放债券</td>
 <td>1.075</td>
 <td>1.079</td>
 <td>1.074</td>
 <td>+0.047%</td>
 </tr>
 <tr>
 <td>003526</td>
 <td>农银金穗3个月定期开放债券</td>
 <td>1.075</td>
 <td>1.079</td>
 <td>1.074</td>
 <td>+0.047%</td>
 </tr>
 </tbody>
 </table>
 <script>
 
 
 
 var trObjs = document.querySelector("tbody").querySelectorAll("tr");
 
 for (var i = 0; i < trObjs.length; i++) {
 trObjs[i].onmouseover = function() {
 
 for (var j = 0; j < trObjs.length; j++) {
 trObjs[j].style.backgroundColor = '';
 }
 
 this.style.backgroundColor = 'red';
 }
 }
 </script>
 </body>
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 
 | <body><table border="1px">
 <thead>
 <tr>
 <th>代码</th>
 <th>名称</th>
 <th>最新公布净值</th>
 <th>累计净值</th>
 <th>前单位净值</th>
 <th>净值增长率</th>
 </tr>
 </thead>
 <tbody>
 <tr>
 <td>003526</td>
 <td>农银金穗3个月定期开放债券</td>
 <td>1.075</td>
 <td>1.079</td>
 <td>1.074</td>
 <td>+0.047%</td>
 </tr>
 <tr>
 <td>003526</td>
 <td>农银金穗3个月定期开放债券</td>
 <td>1.075</td>
 <td>1.079</td>
 <td>1.074</td>
 <td>+0.047%</td>
 </tr>
 <tr>
 <td>003526</td>
 <td>农银金穗3个月定期开放债券</td>
 <td>1.075</td>
 <td>1.079</td>
 <td>1.074</td>
 <td>+0.047%</td>
 </tr>
 <tr>
 <td>003526</td>
 <td>农银金穗3个月定期开放债券</td>
 <td>1.075</td>
 <td>1.079</td>
 <td>1.074</td>
 <td>+0.047%</td>
 </tr>
 <tr>
 <td>003526</td>
 <td>农银金穗3个月定期开放债券</td>
 <td>1.075</td>
 <td>1.079</td>
 <td>1.074</td>
 <td>+0.047%</td>
 </tr>
 <tr>
 <td>003526</td>
 <td>农银金穗3个月定期开放债券</td>
 <td>1.075</td>
 <td>1.079</td>
 <td>1.074</td>
 <td>+0.047%</td>
 </tr>
 </tbody>
 </table>
 <script>
 
 
 
 var trObjs = document.querySelector("tbody").querySelectorAll("tr");
 
 for (var i = 0; i < trObjs.length; i++) {
 trObjs[i].onmouseover = function() {
 this.style.backgroundColor = 'red';
 }
 trObjs[i].onmouseout = function() {
 this.style.backgroundColor = '';
 }
 }
 </script>
 </body>
 
 | 
4.7.3、案例2
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 
 | <body>全选:<input type="checkbox" id="checkAll" /> <br/>
 唱歌: <input type="checkbox" name="hobby" /> <br/>
 跳舞: <input type="checkbox" name="hobby" /> <br/>
 学习: <input type="checkbox" name="hobby" /> <br/>
 打游戏: <input type="checkbox" name="hobby" /> <br/>
 
 <script>
 
 var checkAllObj = document.getElementById("checkAll");
 
 var hobbyObjs = document.getElementsByName("hobby");
 
 
 checkAllObj.onclick = function() {
 for (var i = 0; i < hobbyObjs.length; i++) {
 hobbyObjs[i].checked = this.checked;
 }
 }
 
 
 for (var i = 0; i < hobbyObjs.length; i++) {
 hobbyObjs[i].onclick = function() {
 var flag = true;
 
 for (var j = 0; j < hobbyObjs.length; j++) {
 if (!hobbyObjs[j].checked) {
 flag = false;
 break;
 }
 }
 checkAllObj.checked = flag;
 }
 }
 </script>
 </body>
 
 | 
4.8、自定义属性的操作
4.8.1、获取属性值
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | <body><div id="myDiv"></div>
 <script>
 
 var divObj = document.querySelector("div");
 
 
 console.log(divObj.id);
 
 
 console.log(divObj.getAttribute("id"));
 </script>
 </body>
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | <body><div index="1"></div>
 <script>
 
 var divObj = document.querySelector("div");
 
 
 console.log(divObj.index);
 
 
 console.log(divObj.getAttribute("index"));
 </script>
 </body>
 
 | 
| 12
 3
 
 | # 总结1. element.属性 获取内置属性值(元素本身自带的属性)
 2. element.getAttribute(‘属性’); 主要获得自定义的属性 (标准) 我们程序员自定义的属性
 
 | 
4.8.2、设置属性值
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | <body><div></div>
 <script>
 
 var divObj = document.querySelector("div");
 
 
 divObj.id = 'myDiv';
 divObj.className = 'content';
 
 
 divObj.setAttribute('style', 'width:200px');
 </script>
 </body>
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | <body><div></div>
 <script>
 
 var divObj = document.querySelector("div");
 
 
 divObj.index = 1;
 
 
 divObj.setAttribute('index2', 2);
 </script>
 </body>
 
 | 
| 12
 3
 
 | # 总结1、element.属性 设置内置属性值
 2、element.setAttribute(‘属性’); 主要设置自定义的属性 (标准)
 
 | 
4.8.3、移除属性
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | <body><div index="1">ss</div>
 <script>
 
 var divObj = document.querySelector("div");
 
 
 divObj.removeAttribute("index");
 </script>
 </body>
 
 | 
4.9、H5自定义属性
4.9.1、说明
| 12
 3
 4
 
 | 1. 自定义属性目的:是为了保存并使用数据。有些数据可以保存到页面中而不用保存到数据库中。2. 自定义属性获取是通过getAttribute(‘属性’) 获取。
 3. 但是有些自定义属性很容易引起歧义,不容易判断是元素的内置属性还是自定义属性。
 4. H5给我们新增了自定义属性:
 
 | 
4.9.2、设置H5自定义属性
        H5规定自定义属性是这样的:data-开头做为属性名并且赋值。
        比如 <div data-index="1"></div> ,或者使用 JS 设置 element.setAttribute(‘data-index’, 2)
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | <body><div></div>
 <script>
 
 var divObj = document.querySelector("div");
 
 
 divObj.setAttribute("data-index", 1);
 </script>
 </body>
 
 | 
4.9.3、获取H5自定义属性
| 12
 3
 
 | # 两种方式1. 兼容性获取 element.getAttribute(‘data-index’);
 2. H5新增 element.dataset.index 或者 element.dataset[‘index’] ie 11才开始支持
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 
 | <body><div></div>
 <script>
 
 var divObj = document.querySelector("div");
 
 
 divObj.setAttribute("data-index", 1);
 
 
 console.log(divObj.getAttribute("data-index"));
 
 
 console.log(divObj.dataset.index);
 console.log(divObj.dataset['index']);
 </script>
 </body>
 
 | 
五、节点操作
5.1、说明
        其实对于获取元素节点,一般来说有两种方式:

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

        一般地,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个
基本属性。 
- 元素节点 nodeType 为 1 
- 属性节点 nodeType 为 2 
- 文本节点 nodeType 为 3 (文本节点包含文字、空格、换行等)
        我们在实际开发中,节点操作主要操作的是元素节点
| 1
 | 1. 利用 DOM 树可以把节点划分为不同的层级关系,常见的是父子兄层级关系。
 | 
5.3、节点层级
5.3.1、父级节点
| 12
 3
 4
 5
 
 | # 获取方式node.parentNode
 # 说明
 1. parentNode 属性可返回某节点的父节点,注意是最近的一个父节点
 2. 如果指定的节点没有父节点则返回 null
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | <body><div>
 <div id="parent">
 <div id="child">HelloWorld</div>
 </div>
 </div>
 <script>
 
 var childObj = document.querySelector("#child");
 
 console.log(childObj.parentNode.id);
 </script>
 </body>
 
 | 
5.3.2、子级节点
5.3.2.1、方式一
| 12
 3
 4
 5
 6
 
 | # 方式parentNode.childNodes(标准)
 # 说明
 1. 返回包含指定节点的子节点的集合
 2. 返回值里面包含了所有的子节点,包括元素节点,【文本节点】等
 3. 如果只想要获得里面的元素节点,则需要专门处理。 所以我们一般不提倡使用childNodes
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
 | <body><ul>
 <li>我是li</li>
 <li>我是li</li>
 <li>我是li</li>
 <li>我是li</li>
 
 </ul>
 <script>
 
 var ulObj = document.querySelector("ul");
 
 console.log(ulObj.childNodes);
 </script>
 </body>
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 | <body><ul>
 <li>我是li</li>
 <li>我是li</li>
 <li>我是li</li>
 <li>我是li</li>
 
 </ul>
 <script>
 
 var ulObj = document.querySelector("ul");
 
 for (var i = 0; i < ulObj.childNodes.length; i++) {
 if (ulObj.childNodes[i].nodeType == 1) {
 
 console.log(ulObj.childNodes[i]);
 }
 }
 </script>
 </body>
 
 | 
5.3.2.2、方式二
| 12
 3
 4
 5
 
 | # 方式parentNode.children(非标准)
 # 说明
 1. parentNode.children是一个只读属性,返回所有的子元素节点。它只返回子元素节点,其余节点不返回。
 2. 虽然children 是一个非标准,但是得到了各个浏览器的支持,因此我们可以放心使用
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
 | <body><ul>
 <li>我是li</li>
 <li>我是li</li>
 <li>我是li</li>
 <li>我是li</li>
 
 </ul>
 <script>
 
 var ulObj = document.querySelector("ul");
 
 console.log(ulObj.children);
 </script>
 </body>
 
 | 
5.3.3、获取第一个和最后一个子节点
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 
 | <body><ol>
 <li>我是li1</li>
 <li>我是li2</li>
 <li>我是li3</li>
 <li>我是li4</li>
 <li>我是li5</li>
 </ol>
 <script>
 
 var olObj = document.querySelector("ol");
 
 console.log(olObj.firstChild);
 
 console.log(olObj.lastChild);
 
 
 
 
 
 </script>
 </body>
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 
 | <body><ol>
 <li>我是li1</li>
 <li>我是li2</li>
 <li>我是li3</li>
 <li>我是li4</li>
 <li>我是li5</li>
 </ol>
 <script>
 
 var olObj = document.querySelector("ol");
 
 console.log(olObj.firstElementChild);
 
 console.log(olObj.lastElementChild);
 
 
 </script>
 </body>
 
 | 
        实际开发中,firstChild 和 lastChild 包含其他节点,操作不方便,而 firstElementChild 和 lastElementChild 又有兼容性问题,那么我们如何获取第一个子元素节点或最后一个子元素节点呢?
        解决方案:
- 如果想要第一个子元素节点,可以使用 parentNode.chilren[0]  
- 如果想要最后一个子元素节点,可以使用 parentNode.chilren[parentNode.chilren.length - 1]  
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 
 | <body><ol>
 <li>我是li1</li>
 <li>我是li2</li>
 <li>我是li3</li>
 <li>我是li4</li>
 <li>我是li5</li>
 </ol>
 <script>
 
 var olObj = document.querySelector("ol");
 
 console.log(olObj.children[0]);
 
 console.log(olObj.children[olObj.children.length - 1]);
 </script>
 </body>
 
 | 
5.3.4、兄弟节点
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 
 | <body><div>我是div1</div>
 <div class="div2">我是div2</div>
 <span>我是span</span>
 <script>
 var divObj = document.querySelector(".div2");
 
 
 var preObj1 = divObj.previousSibling;
 console.log(preObj1);
 var preObj2 = divObj.previousElementSibling;
 console.log(preObj2);
 
 
 var nextObj1 = divObj.nextSibling;
 console.log(nextObj1);
 
 var nextObj2 = divObj.nextElementSibling;
 console.log(nextObj2);
 </script>
 </body>
 
 | 
5.4、创建节点及添加节点
5.4.1、语法
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | # 1、创建节点document.createElement('标签名')
 创建由 标签名 指定的 HTML 元素,这些元素原先不存在,是根据我们的需求动态生成的,所以我们也称为动态创建元素节点。
 
 # 2、添加节点
 a. node.appendChild(child)
 该方法将一个节点添加到指定父节点的子节点列表末尾。
 
 b. node.insertBefore(child, 指定元素)
 该方法将一个节点添加到父节点的指定子节点前面。
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 
 | <body><ul>
 <li>高圆圆</li>
 </ul>
 <script>
 
 var liObj = document.createElement("li");
 liObj.innerHTML = '贾静雯';
 
 
 var ulObj = document.querySelector("ul");
 ulObj.appendChild(liObj);
 
 
 var liObj2 = document.createElement("li");
 liObj2.innerHTML = '赵敏';
 
 
 ulObj.insertBefore(liObj2, ulObj.children[0])
 </script>
 </body>
 
 | 
5.4.2、留言板案例
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 
 | <body><textarea name="" id=""></textarea>
 <button>发布</button>
 <ul>
 </ul>
 <script>
 
 var textAreaObj = document.querySelector("textarea");
 var btnObj = document.querySelector("button");
 var ulObj = document.querySelector("ul");
 
 
 btnObj.onclick = function() {
 
 var content = textAreaObj.value;
 if (content == null || content == '') {
 alert("请输入内容");
 return false;
 }
 
 var liObj = document.createElement("li");
 liObj.innerHTML = content;
 
 
 ulObj.insertBefore(liObj, ulObj.children[0]);
 }
 </script>
 </body>
 
 | 
5.5、删除节点
5.5.1、语法
| 12
 
 | # 语法node.removeChild(child)
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 
 | <body><button>删除</button>
 <ul>
 <li>高圆圆</li>
 <li>贾静雯</li>
 <li>赵敏</li>
 </ul>
 <script>
 
 var btnObj = document.querySelector("button");
 var ulObj = document.querySelector("ul");
 
 
 btnObj.onclick = function() {
 
 if (ulObj.children.length == 0) {
 btnObj.disabled = true;
 } else {
 ulObj.removeChild(ulObj.children[0]);
 }
 }
 </script>
 </body>
 
 | 
5.5.2、留言板案例
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 
 | <body><textarea name="" id=""></textarea>
 <button>发布</button>
 <ul>
 </ul>
 <script>
 
 var textAreaObj = document.querySelector("textarea");
 var btnObj = document.querySelector("button");
 var ulObj = document.querySelector("ul");
 
 
 btnObj.onclick = function() {
 
 var content = textAreaObj.value;
 if (content == null || content == '') {
 alert("请输入内容");
 return false;
 }
 
 var liObj = document.createElement("li");
 liObj.innerHTML = content;
 
 var aObj = document.createElement("a");
 aObj.innerHTML = '删除';
 aObj.setAttribute("href", "javascript:void(0)");
 
 
 aObj.onclick = function() {
 this.parentNode.parentNode.removeChild(this.parentNode);
 }
 
 
 liObj.appendChild(aObj);
 
 
 ulObj.insertBefore(liObj, ulObj.children[0]);
 }
 </script>
 </body>
 
 | 
5.6、复制节点/克隆节点
5.6.1、语法
| 12
 3
 4
 5
 6
 7
 
 | # 语法node.cloneNode()
 该方法返回调用该方法的节点的一个副本。 也称为克隆节点/拷贝节点
 
 # 注意点
 1. 如果括号参数为空或者为 false ,则是浅拷贝,即只克隆复制节点本身,不克隆里面的子节点。
 2. 如果括号参数为 true ,则是深度拷贝,会复制节点本身以及里面所有的子节点
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 
 | <body><ul>
 <li>高圆圆</li>
 <li>贾静雯</li>
 <li>赵敏</li>
 </ul>
 <script>
 
 var ulObj = document.querySelector("ul");
 
 
 var liObj1 = ulObj.children[0].cloneNode();
 ulObj.appendChild(liObj1);
 
 
 var liObj2 = ulObj.children[0].cloneNode(true);
 ulObj.appendChild(liObj2);
 </script>
 </body>
 
 | 
5.6.2、动态生成表格
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 
 | <body><table border="1px">
 <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: 'HTML',
 score: 98
 }, {
 name: '贾静雯',
 subject: 'CSS',
 score: 99
 }];
 
 var tbodyObj = document.querySelector("tbody");
 
 
 for (var i = 0; i < datas.length; i++) {
 
 var trObj = document.createElement("tr");
 
 for (var key in datas[i]) {
 
 var tdObj = document.createElement("td");
 
 tdObj.innerHTML = datas[i][key];
 
 trObj.appendChild(tdObj);
 }
 
 var delTdObj = document.createElement("td");
 delTdObj.innerHTML = '<a href="javascript:;">删除 </a>';
 trObj.appendChild(delTdObj);
 
 tbodyObj.appendChild(trObj);
 }
 
 var aObjs = document.querySelectorAll("a");
 for (var i = 0; i < aObjs.length; i++) {
 aObjs[i].onclick = function() {
 
 tbodyObj.removeChild(this.parentNode.parentNode);
 }
 }
 </script>
 </body>
 
 |