🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[toc] # 每日英语 1. `collection` 收集/集合 2. `foreach` 循环 3. `entry/entries` 项目 4. `area` 区域 5. `map` 映射 6. `rectangular` 矩形 7. `coords` 坐标 # 什么是 NodeList 和 HTMLCollection 节点都是单个对象,有时需要一种数据结构,能够容纳多个节点。DOM 提供两种节点集合,用于容纳多个节点:`NodeList` 和 `HTMLCollection`。 这两种集合都属于接口规范。许多 DOM 属性和方法,返回的结果是 NodeList 实例或 HTMLCollection 实例。 主要区别是,`NodeList` 可以包含各种类型的节点,`HTMLCollection` 只能包含 HTML 元素节点。 # NodeList 接口 ## 概述 `NodeList` 实例是一个类似数组的对象,它的成员是节点对象。通过以下方法可以得到 `NodeList` 实例。 - `Node.childNodes` - `document.querySelectorAll()`等节点搜索方法 `document.body.childNodes instanceof NodeList // true` `document.querySelectorAll('body') instanceof NodeList` `NodeList` 实例很像数组,可以使用 `length` 属性和 `forEach` 方法。 但是,它不是数组,不能使用 `pop` 或 `push` 之类数组特有的方法。 `Array.isArray(document.body.childNodes)` `document.body.childNodes.length` `children.forEach(console.log)` 上面代码中,NodeList 实例 children 不是数组,但是具有 length 属性和 forEach 方法。 顺便提一下`foreach` ```javascript var arr = [ "The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog" ]; arr.forEach(console.log); ``` 对象转数组 如果 NodeList 实例要使用数组方法,可以将其转为真正的数组。 `var children = document.body.childNodes;` `var nodeArr = Array.prototype.slice.call(children);` ```javascript var arr = [ "The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog" ]; var obj = { 0: "xujunhao", 1: "good", 2: "man", length: 3 }; // var res = [].slice.call(obj); // console.log(res); var arr = []; for (var i = 0; i < obj.length; i++) { arr.push(obj[i]); } console.log(arr); ``` 除了使用 `forEach` 方法遍历 `NodeList` 实例,还可以使用 `for` 循环。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> <script> window.onload = function() { var obj = document.body.childNodes; for (var i = 0; i < obj.length; i++) { console.log(obj[i]); } }; </script> </head> <body> <div><span></span></div> </body> </html> ``` 注意,NodeList 实例可能是动态集合,也可能是静态集合。 所谓动态集合就是一个活的集合,DOM 删除或新增一个相关节点,都会立刻反映在 NodeList 实例。 目前,只有 Node.childNodes 返回的是一个动态集合,其他的 NodeList 都是静态集合。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> <script> window.onload = function() { var children = document.body.childNodes; console.log(children.length); document.body.appendChild(document.createElement("p")); console.log(children.length); }; </script> </head> <body> <div><span></span></div> </body> </html> ``` `document.querySelectorAll()`就不行... ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> <script> window.onload = function() { var children = document.querySelectorAll("div"); console.log(children.length); document.body.appendChild(document.createElement("div")); console.log(children.length); }; </script> </head> <body> <div><span></span></div> </body> </html> ``` ## NodeList.prototype.length `length` 属性返回 `NodeList` 实例包含的节点数量。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> <script> window.onload = function() { var objLength = document.querySelectorAll("span").length; console.log(objLength); }; </script> </head> <body> <div><span></span></div> <div><span></span></div> <div><span></span></div> <div><span></span></div> <div><span></span></div> <div><span></span></div> </body> </html> ``` 对于那些不存在的 HTML 标签,length 属性返回 0。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> <script> window.onload = function() { var objLength = document.querySelectorAll("p").length; console.log(objLength); }; </script> </head> <body> <div><span></span></div> <div><span></span></div> <div><span></span></div> <div><span></span></div> <div><span></span></div> <div><span></span></div> </body> </html> ``` 支持自定义标签吗? ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> <script> window.onload = function() { var objLength = document.querySelectorAll("span").length; console.log(objLength); }; </script> </head> <body> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> </body> </html> ``` ## NodeList.prototype.forEach() `forEach` 方法用于遍历 `NodeList` 的所有成员。它接受一个回调函数作为参数,每一轮遍历就执行一次这个回调函数,用法与数组实例的 `forEach` 方法完全一致。 ```javascript var children = document.body.childNodes; children.forEach(function f(item, i, list) { // ... }, this); ``` 上面代码中,回调函数 f 的三个参数依次是当前成员、位置和当前 NodeList 实例。forEach 方法的第二个参数,用于绑定回调函数内部的 this,该参数可省略。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> <script> window.onload = function() { document.body.childNodes.forEach(function(a, b, c) { console.log(b); }, this); }; </script> </head> <body> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> </body> </html> ``` ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> <script> window.onload = function() { document.body.childNodes.forEach(function(a, b, c) { console.log(this.childNodes.item(b)); }, document.getElementById("div1")); }; </script> </head> <body> <div id="div1"> <div><span111></span111></div> </div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> </body> </html> ``` ## NodeList.prototype.item() `item` 方法接受一个整数值作为参数,表示成员的位置,返回该位置上的成员。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> <script> window.onload = function() { console.log(document.body.childNodes.item(1)); }; </script> </head> <body> <div id="div1"> <div><span111></span111></div> </div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> </body> </html> ``` 如果参数值大于实际长度,或者索引不合法(比如负数),item 方法返回 null。如果省略参数,item 方法会报错。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> <script> window.onload = function() { console.log(document.body.childNodes.item(111)); }; </script> </head> <body> <div id="div1"> <div><span111></span111></div> </div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> </body> </html> ``` ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> <script> window.onload = function() { console.log(document.body.childNodes.item()); }; </script> </head> <body> <div id="div1"> <div><span111></span111></div> </div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> </body> </html> ``` 所有类似数组的对象,都可以使用方括号运算符取出成员。一般情况下,都是使用方括号运算符,而不使用 item 方法。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> <script> window.onload = function() { console.log(document.body.childNodes[1]); }; </script> </head> <body> <div id="div1"> <div><span111></span111></div> </div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> </body> </html> ``` ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> <script> window.onload = function() { console.log(document.body.childNodes[11111]); }; </script> </head> <body> <div id="div1"> <div><span111></span111></div> </div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> </body> </html> ``` ```javascript var arr = [ "The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog" ]; console.log(arr[11111]); ``` ## NodeList.prototype.keys(),NodeList.prototype.values(),NodeList.prototype.entries() 这三个方法都返回一个 ES6 的遍历器对象,可以通过 for...of 循环遍历获取每一个成员的信息。 区别在于,keys()返回键名的遍历器,values()返回键值的遍历器,entries()返回的遍历器同时包含键名和键值的信息。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> <script> window.onload = function() { var children = document.body.childNodes; for (var key of children.keys()) { console.log(key); } for (var value of children.values()) { console.log(value); } for (var entry of children.entries()) { console.log(entry); } }; </script> </head> <body> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> <div><span111></span111></div> </body> </html> ``` # HTMLCollection 接口 ## 概述 `HTMLCollection` 是一个节点对象的集合,只能包含元素节点(`element`),不能包含其他类型的节点。 它的返回值是一个类似数组的对象,但是与 `NodeList` 接口不同,HTMLCollection 没有 `forEach` 方法,只能使用 `for` 循环遍历。 返回 `HTMLCollection` 实例的,主要是一些 `Document` 对象的集合属性,比如 `document.links、docuement.forms、document.images` 等。 ### document.links links 集合返回当期文档所有链接的数组。 提示: links 集合计算 <a href=""> 标签和 <area> 标签。 ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> </head> <body> <img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1544033630190&di=f5c4771e31c4cb1951729a4bc86ba214&imgtype=0&src=http%3A%2F%2Fwww.yliywai.com%2Fyyact%2Fimages%2Fearth%2Ft1.jpg" usemap="#planetmap" /> <map name="planetmap"> <area shape="rect" coords="0,0,82,126" href="sun.htm" alt="Sun" /> </map> <p><a href="http://www.baidu.com">百度一下</a></p> <p> 链接/地址数目: <script> document.write(document.links.length); </script> </p> </body> </html> ``` ### docuement.forms forms 集合可返回对文档中所有 Form 对象的引用。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <form name="Form1"></form> <form name="Form2"></form> <form name="Form3"></form> <script> document.write("This document contains: "); document.write(document.forms.length + " forms."); </script> </body> </html> ``` ### document.images `images` 集合可返回对文档中所有 Image 对象的引用。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1544033630190&di=f5c4771e31c4cb1951729a4bc86ba214&imgtype=0&src=http%3A%2F%2Fwww.yliywai.com%2Fyyact%2Fimages%2Fearth%2Ft1.jpg" /> <br /> <img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1544033630190&di=f5c4771e31c4cb1951729a4bc86ba214&imgtype=0&src=http%3A%2F%2Fwww.yliywai.com%2Fyyact%2Fimages%2Fearth%2Ft1.jpg" /> <br /> <br /> <img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1544033630190&di=f5c4771e31c4cb1951729a4bc86ba214&imgtype=0&src=http%3A%2F%2Fwww.yliywai.com%2Fyyact%2Fimages%2Fearth%2Ft1.jpg" /> <br /> <br /> <img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1544033630190&di=f5c4771e31c4cb1951729a4bc86ba214&imgtype=0&src=http%3A%2F%2Fwww.yliywai.com%2Fyyact%2Fimages%2Fearth%2Ft1.jpg" /> <br /> <br /> <script type="text/javascript"> document.write("This document contains: "); document.write(document.images.length + " images."); </script> </body> </html> ``` `document.links instanceof HTMLCollection` `HTMLCollection` 实例都是动态集合,节点的变化会实时反映在集合中。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> <script> window.onload = function() { var htmlForms = document.forms; var nodeForms = document.body.childNodes; console.log(htmlForms.length); console.log(nodeForms.length); document.body.appendChild(document.createElement("form")); console.log(htmlForms.length); console.log(nodeForms.length); }; </script> </head> <body> <form name="Form1"></form> <form name="Form2"></form> <form name="Form3"></form> </body> </html> ``` 如果元素节点有 `id` 或 `name` 属性,那么 `HTMLCollection` 实例上面,可以使用 id 属性或 name 属性引用该节点元素。 如果没有对应的节点,则返回 null。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <img src="haha.jpg" alt="" id="img1" /> <script> window.onload = function() { console.log(document.images.img1); console.log(document.images.img1.src); }; </script> </body> </html> ``` 上面代码中,document.images 是一个 HTMLCollection 实例,可以通过<img>元素的 id 属性值,从 HTMLCollection 实例上取到这个元素。 ## HTMLCollection.prototype.length `length` 属性返回 `HTMLCollection` 实例包含的成员数量。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <a href="">0</a> <a href="">1</a> <a href="">2</a> <a href="">3</a> <a href="">4</a> <a href="">5</a> <a href="">6</a> <a href="">7</a> <a href="">8</a> <a href="">9</a> <a href="">10</a> <a href="">11</a> <a href="">12</a> <a href="">13</a> <a href="">14</a> <a href="">15</a> <a href="">16</a> <a href="">17</a> <a href="">18</a> <a href="">19</a> <a href="">20</a> <script> window.onload = function() { console.log(document.links.length); }; </script> </body> </html> ``` ## HTMLCollection.prototype.item() `item` 方法接受一个整数值作为参数,表示成员的位置,返回该位置上的成员。 由于方括号运算符也具有同样作用,而且使用更方便,所以一般情况下,总是使用方括号运算符。 如果参数值超出成员数量或者不合法(比如小于 0),那么 item 方法返回 null。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <a href="">this is tag a 0</a> <br /> <a href="">this is tag a 1</a> <br /> <a href="">this is tag a 2</a> <br /> <a href="">this is tag a 3</a> <br /> <a href="">this is tag a 4</a> <br /> <a href="">this is tag a 5</a> <br /> <a href="">this is tag a 6</a> <br /> <a href="">this is tag a 7</a> <br /> <a href="">this is tag a 8</a> <br /> <a href="">this is tag a 9</a> <br /> <a href="">this is tag a 10</a> <br /> <a href="">this is tag a 11</a> <br /> <a href="">this is tag a 12</a> <br /> <a href="">this is tag a 13</a> <br /> <a href="">this is tag a 14</a> <br /> <a href="">this is tag a 15</a> <br /> <a href="">this is tag a 16</a> <br /> <a href="">this is tag a 17</a> <br /> <a href="">this is tag a 18</a> <br /> <a href="">this is tag a 19</a> <br /> <a href="">this is tag a 20</a> <br /> <script> window.onload = function() { console.log(document.links.item(3).innerHTML); console.log(document.links[4].innerHTML); console.log(document.links.item(33333)); console.log(document.links.item(-33)); console.log(document.links[33333]); console.log(document.links[-33]); }; </script> </body> </html> ``` ## HTMLCollection.prototype.namedItem() `namedItem` 方法的参数是一个字符串,表示 id 属性或 name 属性的值,返回对应的元素节点。 如果没有对应的节点,则返回 null。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <img id="pic" src="http://example.com/hello.jpg" name="hello" /> <script> window.onload = function() { console.log(document.images.namedItem("pic")); console.log(document.images.namedItem("hello")); }; </script> </body> </html> ``` 节点对象除了继承 `Node` 接口以外,还会继承其他接口。 `ParentNode`接口表示当前节点是一个父节点,提供一些处理子节点的方法。 `ChildNode`接口表示当前节点是一个子节点,提供一些相关方法。 # ParentNode 接口 如果当前节点是父节点,就会继承 ParentNode 接口。 由于只有元素节点(`element`)、文档节点(`document`)和文档片段节点(`documentFragment`)可以成为父节点, 因此只有这三类节点会继承`ParentNode`接口。 ## ParentNode.children `children`属性返回一个`HTMLCollection`实例, 成员是当前节点的所有元素子节点。该属性只读。 下面是遍历某个节点的所有元素子节点的示例。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> window.onload = function() { for (var i = 0; i < document.childNodes.length; i++) { console.log(document.childNodes[i]); } }; </script> </body> </html> ``` 注意,`children`属性只包括元素子节点,不包括其他类型的子节点(比如文本子节点)。 如果没有元素类型的子节点,返回值 `HTMLCollection` 实例的 `length` 属性为 0。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> <script> window.onload = function() { console.log(document.body.children.length); }; </script> </head> <body> <div></div> hello world </body> </html> ``` 另外,`HTMLCollection` 是动态集合,会实时反映 DOM 的任何变化。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> <script> window.onload = function() { console.log(document.body.children.length); document.body.appendChild(document.createElement("div")); console.log(document.body.children.length); }; </script> </head> <body> <div></div> hello world </body> </html> ``` ## ParentNode.firstElementChild `firstElementChild` 属性返回当前节点的第一个元素子节点。如果没有任何元素子节点,则返回 null。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> <script> window.onload = function() { console.log(document.body.firstChild.nodeName); console.log(document.body.firstElementChild.nodeName); }; </script> </head> <body> <div></div> hello world </body> </html> ``` 上面代码中,document 节点的第一个元素子节点是<HTML>。 ## ParentNode.lastElementChild `lastElementChild` 属性返回当前节点的最后一个元素子节点,如果不存在任何元素子节点,则返回 null。 `document.lastElementChild.nodeName` 上面代码中,document 节点的最后一个元素子节点是<HTML>(因为 document 只包含这一个元素子节点)。 ## ParentNode.childElementCount `childElementCount` 属性返回一个整数,表示当前节点的所有元素子节点的数目。如果不包含任何元素子节点,则返回 0。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> <script> window.onload = function() { console.log(document.body.childElementCount); }; </script> </head> <body> <div></div> <div></div> <div></div> <div></div> hello world </body> </html> ``` ## ParentNode.append(),ParentNode.prepend() `append` 方法为当前节点追加一个或多个子节点,位置是最后一个元素子节点的后面。 该方法不仅可以添加元素子节点,还可以添加文本子节点。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> window.onload = function() { var parent = document.body; // 添加元素子节点 var p = document.createElement("p"); parent.append(p); // 添加文本子节点 parent.append("Hello"); // 添加多个元素子节点 var p1 = document.createElement("p"); var p2 = document.createElement("p"); parent.append(p1, p2); // 添加元素子节点和文本子节点 var p = document.createElement("p"); parent.append("Hello", p); }; </script> </body> </html> ``` 注意,该方法没有返回值。 `prepend` 方法为当前节点追加一个或多个子节点,位置是第一个元素子节点的前面。 它的用法与 `append` 方法完全一致,也是没有返回值。 # ChildNode 接口 如果一个节点有父节点,那么该节点就继承了 `ChildNode` 接口。 ## ChildNode.remove() `remove` 方法用于从父节点移除当前节点。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <div>this is div 0</div> <div>this is div 1</div> <div>this is div 2</div> <div>this is div 3</div> <div>this is div 4</div> <div>this is div 5</div> <div>this is div 6</div> <div>this is div 7</div> <div>this is div 8</div> <div>this is div 9</div> </body> <script> window.onload = function() { document.body.remove(); }; </script> </html> ``` ## ChildNode.before(),ChildNode.after() `before` 方法用于在当前节点的前面,插入一个或多个同级节点。两者拥有相同的父节点。 如果是多个参数, 插入的是一个`整体` 注意,该方法不仅可以插入元素节点,还可以插入文本节点。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <div>div1</div> <script> window.onload = function() { var p = document.createElement("p"); var p1 = document.createElement("p"); var oDiv = document.getElementsByTagName("div")[0]; oDiv.before(p); oDiv.before("Hello"); oDiv.before(p, p1); oDiv.before(p, "Hello"); }; </script> </body> </html> ``` `after` 方法用于在当前节点的后面,插入一个或多个同级节点,两者拥有相同的父节点。用法与 `before` 方法完全相同。 ## ChildNode.replaceWith() `replaceWith` 方法使用参数节点,替换当前节点。参数可以是元素节点,也可以是文本节点。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <div>div1</div> <script> window.onload = function() { var span = document.createElement("span"); document.getElementsByTagName("div")[0].replaceWith(span); }; </script> </body> </html> ```