1.属性
1.1 Node.prototype.nodeType
document.nodeType // 9
不同节点的nodeType
的属性值不同
- 文档节点(document):9,对应常量
Node.DOCUMENT_NODE
- 元素节点(element):1,对应常量
Node.ELEMENT_NODE
- 属性节点(attr):2,对应常量
Node.ATTRIBUTE_NODE
- 文本节点(text):3,对应常量
Node.TEXT_NODE
- 文档片断节点(DocumentFragment):11,对应常量
Node.DOCUMENT_FRAGMENT_NODE
- 文档类型节点(DocumentType):10,对应常量
Node.DOCUMENT_TYPE_NODE
- 注释节点(Comment):8,对应常量
Node.COMMENT_NODE
1.2 Node.prototype.nodeName
nodeName
属性返回节点的名称
let div = document.getElementById('d1');
div.nodeName // "DIV"
不同节点的nodeName
属性值不同
- 文档节点(document):
#document
- 元素节点(element):大写的标签名
- 属性节点(attr):属性的名称
- 文本节点(text):
#text
- 文档片断节点(DocumentFragment):
#document-fragment
- 文档类型节点(DocumentType):文档的类型
- 注释节点(Comment):
#comment
1.3 Node.prototype.nodeValue
nodeValue
属性返回一个字符串,表示当前节点本身的文本值,该属性可读写
只有文本节点(text)、注释节点(comment)和属性节点(attr)有文本值,其他类型的节点一律返回null
// <div id="d1">hello world</div>
let div = document.getElementById('d1');
div.nodeValue // null
div.firstChild.nodeValue // "hello world"
1.4 Node.prototype.textContent
textContent
属性返回当前节点和它的所有后代节点的文本内容
// <div id="box">This is <span>some</span> text</div>
document.getElementById('box').textContent
// This is some text
textContent
属性会自动忽略节点内部的HTML标签,返回所有文本内容
该属性是可读写的,设置属性的值,会用一个新的文本节点替换掉所有原来的子节点
该属性会自动对HTML 标签转义
document.getElementById('box').textContent = '<p>GoodBye!</p>';
将<p>
标签解释为文本,而不会当作标签处理
1.5 Node.prototype.ownerDocument
Node.ownerDocument
属性返回当前节点所在的顶层文档对象,即document
对象
let div = d1.ownerDocument
console.log(div === document) //True
document
对象本身的ownerDocument
属性,返回null
1.6 Node.prototype.nextSibling
Node.nextSibling
属性返回紧跟在当前节点后面的第一个节点,如果没有节点返回null
// <div id="d1">hello</div><div id="d2">world</div>
let d1 = document.getElementById('d1');
let d2 = document.getElementById('d2');
d1.nextSibling === d2 // true
该属性还包括文本节点和注释节点,如果节点后面有空格,该属性会返回一个文本节点
1.7 Node.prototype.previousSibling
previousSibling
属性返回当前节点前面的、距离最近的一个节点。如果当前节点前面没有节点,返回null
// <div id="d1">hello</div><div id="d2">world</div>
let d1 = document.getElementById('d1');
let d2 = document.getElementById('d2');
d2.previousSibling === d1 // true
该属性还包括文本节点和注释节点,如果节点前面有空格,该属性会返回一个文本节点
1.8 Node.prototype.parentNode
parentNode
属性返回当前节点的父节点
对于一个节点,他的父元素只可能是三种元素:元素节点,文档节点和文档片段节点
let div = document.getElementById("d1")
div.parentNode.removeChild(div)
上面代码,用过div.parentNode
属性将div
元素删除
文档节点和文档片段节点的父节点都是null
1.9 Node.prototype.parentElement
parentElement
属性返回当前节点的父元素节点。如果当前节点没有父节点,或者父节点类型不是元素节点,则返回null
1.10 Node.prototype.firstChild,Node.prototype.lastChild
firstChild
属性返回当前节点的第一个子节点,如果当前节点没有子节点,则返回null
。
// <p id="p1"><span>First span</span></p>
let p1 = document.getElementById('p1');
p1.firstChild.nodeName // "SPAN"
firstChild
返回的除了元素节点,还可能是文本节点或注释节点
// <p id="p1">
// <span>First span</span>
// </p>
let p1 = document.getElementById('p1');
p1.firstChild.nodeName // "#text"
p
元素和span
元素之间有换行,所以firstChild
返回的是文本节点
lastChild
属性返回当前节点的最后一个子节点,如果当前节点没有子节点,则返回null
。用法与firstChild
属性相同
1.11Node.prototype.childNodes
childNodes
属性返回一个类似数组的对象(NodeList
集合),成员包括当前节点的所有子节点。
let children = document.querySelector('ul').childNodes;
//children就是ul元素的所有子节点
该属性可以遍历某个节点的所有子节点
let div = document.getElementById("d1")
let Child = div.childNodes
for(let i = 0; i< Child.length; i++){
//...
}
除了元素节点,childNodes
属性的返回值还包括文本节点和注释节点
如果当前节点不包括任何子节点,则返回一个空的NodeList
集合
NodeList
对象是一个动态集合,一旦子节点发生变化,立刻会反映在返回结果之中。
1.12 Node.prototype.isConnected
isConnected
属性返回一个布尔值,表示当前节点是否在文档之中
let test = document.createElement('p');
test.isConnected // false
document.body.appendChild(test);
test.isConnected // true
test
节点是生成的节点,没有插入文档之前 isConnected
返回的是False
,插入之后返回True
2.方法
2.1 Node.prototype.appendChild()
appendChild()
方法接受一个节点对象作为参数,将其作为最后一个子节点,插入当前节点
该方法的返回值就是插入文档的子节点
let p = document.createElement('p');
document.body.appendChild(p);
新建一个<p>
节点,插入body
的尾部
如果参数节点是已经存在的节点,appendChild
方法会将其从原来的位置移动到新的位置
2.2 Node.prototype.hasChildNodes()
hasChildNodes
方法返回一个布尔值,表示当前节点是否有子节点
let div = document.getElementById("box")
if(div.hasAttributes()){
div.removeChild(div.childNodes[0])
}
如果div
节点有子节点,那么就移出第一个子节点
子节点包括所有类型的节点,不仅仅是元素节点。只包含一个空格,hasChildNodes
方法也会返回true
判断节点有没有子节点的方法
node.hasChildNodes()
node.firstChild !== null
node.childNodes && node.childNodes.length > 0
2.3 Node.prototype.cloneNode()
loneNode
方法用于克隆一个节点 它接受一个布尔值作为参数,表示是否同时克隆子节点.
它的返回值是一个克隆出来的新节点
let newDiv = document.querySelector('div').cloneNode(true);
- 该方法返回的节点不在文档之中,即没有任何父节点,必须使用诸如
Node.appendChild
这样的方法添加到文档之中 - 克隆一个节点,会拷贝该节点的所有属性,但会丢失事件方法
2.4 Node.prototype.insertBefore()
insertBefore
方法用于将某个节点插入父节点内部的指定位置
接受两个参数
- 第一个参数是所要插入的节点
- 第二个参数是父节点内部的一个子节点
- 新节点将插入到这个节点的前面,返回值是插入的新节点
let p = document.createElement('p');
document.body.insertBefore(p, document.body.firstChild);
新建一个<p>
节点,插在document.body.firstChild
的前面,<p>
节点就成为document.body
的第一个子节点。
如果insertBefore
方法的第二个参数为null
,则新节点将插在当前节点内部的最后位置,变成最后一个子节点。
let p = document.createElement('p');
document.body.insertBefore(p, null);
2.5 Node.prototype.removeChild()
removeChild
方法接受一个子节点作为参数,用于从当前节点移除该子节点。返回值是移除的子节点
let div = document.getElementById('box');
div.parentNode.removeChild(div);
注意,removeChild方法是在div
父节点上调用的,不是在dib
节点上调用的
如果参数节点不是当前节点的子节点,removeChild
方法将报错。
2.6 Node.prototype.replaceChild()
replaceChild
方法用于将一个新的节点,替换当前节点的某一个子节点
let replacedNode = parentNode.replaceChild(newChild, oldChild);
newChild
是用来替换的新节点oldChild
是将要替换走的子节点- 返回值是被替换的节点
oldChild
。
2.7 Node.prototype.isEqualNode(),Node.prototype.isSameNode()
isEqualNode
方法返回一个布尔值,用于检查两个节点是否相等
相等的节点指的是两个节点的类型,属性,子节点相同
let p1 = document.createElement('p');
let p2 = document.createElement('p');
p1.isEqualNode(p2) // true
isSameNode
方法返回一个布尔值,表示两个节点是否为同一个节点
let p1 = document.createElement('p');
let p2 = document.createElement('p');
p1.isSameNode(p2) // false
p1.isSameNode(p1) // true
2.8 Node.prototype.normalize()
normalize
方法用于清理当前节点内部的所有文本节点,它会去除空的文本节点,并且将相邻的文本节点合并成一个
let div = document.createElement('div');
div.appendChild(document.createTextNode('Part 1 '));
div.appendChild(document.createTextNode('Part 2 '));
div.childNodes.length // 2
div.normalize();
div.childNodes.length // 1