一、概述
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 的元素对象。
1 2 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()
方法可以返回带有指定标签名的对象的集合。
1 2 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>
|
1 2 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名称获取
1 2 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
1 2 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
1 2 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、根据指定选择器返回所有元素
1 2 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 元素
1 2 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 元素
1 2 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、事件三要素
事件源 (谁,指的是事件被触发的对象 )
事件类型 (什么事件,指的是鼠标点击、还是鼠标经过、还是键盘按下)
事件处理程序 (做啥, 通过一个函数赋值的方式完成一个功能)
1 2 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、改变/获取元素内容
1 2 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>
|
1 2 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、常用元素的属性操作
1 2 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、表单元素的属性操作
1 2 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、行内样式操作
1 2 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>
|
1 2 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>
|
1 2 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、类名样式操作
1 2 3 4
| # 使用场景 1. 如果样式修改较多,可以采取操作类名方式更改元素样式。 2. class因为是个保留字,需要使用className来操作元素类名属性 3. className会直接更改元素的类名,会覆盖原先的类名。
|
1 2 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、需求
如果有同一组元素,我们想要某一个元素实现某种样式, 需要用到循环的排他思想算法:
- 所有元素全部清除样式(干掉其他人)
- 给当前元素设置样式 (留下我自己)
- 注意顺序不能颠倒,首先干掉其他人,再设置自己
1 2 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
1 2 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>
|
1 2 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
1 2 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、获取属性值
1 2 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>
|
1 2 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>
|
1 2 3
| # 总结 1. element.属性 获取内置属性值(元素本身自带的属性) 2. element.getAttribute(‘属性’); 主要获得自定义的属性 (标准) 我们程序员自定义的属性
|
4.8.2、设置属性值
1 2 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>
|
1 2 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>
|
1 2 3
| # 总结 1、element.属性 设置内置属性值 2、element.setAttribute(‘属性’); 主要设置自定义的属性 (标准)
|
4.8.3、移除属性
1 2 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、说明
1 2 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)
1 2 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自定义属性
1 2 3
| # 两种方式 1. 兼容性获取 element.getAttribute(‘data-index’); 2. H5新增 element.dataset.index 或者 element.dataset[‘index’] ie 11才开始支持
|
1 2 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、父级节点
1 2 3 4 5
| # 获取方式 node.parentNode # 说明 1. parentNode 属性可返回某节点的父节点,注意是最近的一个父节点 2. 如果指定的节点没有父节点则返回 null
|
1 2 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、方式一
1 2 3 4 5 6
| # 方式 parentNode.childNodes(标准) # 说明 1. 返回包含指定节点的子节点的集合 2. 返回值里面包含了所有的子节点,包括元素节点,【文本节点】等 3. 如果只想要获得里面的元素节点,则需要专门处理。 所以我们一般不提倡使用childNodes
|
1 2 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>
|
1 2 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、方式二
1 2 3 4 5
| # 方式 parentNode.children(非标准) # 说明 1. parentNode.children是一个只读属性,返回所有的子元素节点。它只返回子元素节点,其余节点不返回。 2. 虽然children 是一个非标准,但是得到了各个浏览器的支持,因此我们可以放心使用
|
1 2 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、获取第一个和最后一个子节点
1 2 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>
|
1 2 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]
1 2 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、兄弟节点
1 2 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、语法
1 2 3 4 5 6 7 8 9 10
| # 1、创建节点 document.createElement('标签名') 创建由 标签名 指定的 HTML 元素,这些元素原先不存在,是根据我们的需求动态生成的,所以我们也称为动态创建元素节点。
# 2、添加节点 a. node.appendChild(child) 该方法将一个节点添加到指定父节点的子节点列表末尾。 b. node.insertBefore(child, 指定元素) 该方法将一个节点添加到父节点的指定子节点前面。
|
1 2 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、留言板案例
1 2 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、语法
1 2
| # 语法 node.removeChild(child)
|
1 2 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、留言板案例
1 2 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、语法
1 2 3 4 5 6 7
| # 语法 node.cloneNode() 该方法返回调用该方法的节点的一个副本。 也称为克隆节点/拷贝节点 # 注意点 1. 如果括号参数为空或者为 false ,则是浅拷贝,即只克隆复制节点本身,不克隆里面的子节点。 2. 如果括号参数为 true ,则是深度拷贝,会复制节点本身以及里面所有的子节点
|
1 2 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、动态生成表格
1 2 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>
|