1、document

document 整个文档(document节点)

html标签 是 document的根标签

js dom - 元素选择、节点树、元素节点树、节点属性_数组

 

2、元素选择

 (1)根据 id 选择:

let dom = document.getElementById('id')  // 根据id选择元素 - 一个

 (2)根据 标签名 选择元素 - 选出是一组元素 (类数组 ) 无兼容问题

let dom = document.getElementsByTagName('div')[0]

(3)根据 class 选择元素 - 选出是一组元素 (类数组 ) ie8和ie8以下的没有此方法

let dom = document.getElementsByClassName('div')[0]

(4)根据 name 选择元素 - 选出是一组元素 (类数组) 不常用 ,如:表单、 img、 iframe

<input name="username">
let dom = document.getElementsByName('username')[0]

(5)根据 css 选择元素 ,可写css选择器 - 选择出来的是一个

<div>
<p>
<span class="demo"></span>
</p>
</div>
let dom = document.querySelector('div > p >span.demo') // 一个元素
let dom = document.querySelectorAll('div > p >span.demo') // 一组数据(类数组)

tips: 

1》 ie6/7 没有此方法

2》选出来的元素不是实时的(如:先使用querySelectorAll选出来的元素,之后对元素进行增删改查,querySelectorAll选出来的元素不会改变!)

 

3、遍历节点树

无兼容问题,只不过选出来的包含多个节点:

 (1)dom.parentNode  获取父级元素(最顶层的parentNode为#document)

<div id="box">吕星辰
<!--<span></span>-->
<div class="son">123</div>
</div>
<script>
let dom = document.getElementsByClassName('son')[0]

// <div id="box">···</div>
console.log('1父节点为:', dom.parentNode)

// <body>···</body>
console.log('2父节点的父节点为:', dom.parentNode.parentNode)

// <html lang="en">···</html>
console.log('3父节点的父节点的父节点为:', dom.parentNode.parentNode.parentNode)

// #document
console.log('4父节点的父节点的父节点的父节点为:', dom.parentNode.parentNode.parentNode.parentNode)

// null
console.log('5父节点的父节点的父节点的父节点的父节点为:', dom.parentNode.parentNode.parentNode.parentNode.parentNode)
</script>

js dom - 元素选择、节点树、元素节点树、节点属性_父节点_02

(2)dom.childNodes   获取直接子级元素(包含各类节点 文本节点··· ···

<div id="box">
吕星辰
<!--<span></span>-->
<div>123</div>
<span>345</span>
</div>
<script>
let dom = document.getElementById('box')
let r = dom.childNodes
console.log(r) // NodeList(7) [text, comment, text, div, text, span, text]
</script>

js dom - 元素选择、节点树、元素节点树、节点属性_元素节点_03

(3)dom.firstChild  获取第一个直接子集节点(不常用,通常选择出来的是文本节点)

(4)dom.lastChild 获取最后一个直接子集节点(不常用,通常选择出来的是文本节点)

(5)节点类型

元素节点:1

属性节点:2

文本节点:3

注释节点:8

document:9

DocumentFragment:11

 

4、遍历元素节点树

只会包含元素(标签),不会包含其他的文本节点 ··· ···

ie9及以下不兼容

dom.parentElement 父元素节点
dom.children 当前元素的直接子元素节点
dom.children.length 个数

dom.firstChild 当前元素的第一个子节点
dom.lastChild 当前元素的最后一个子节点

dom.nextElementSibling 当前元素的下一个元素的节点(是邻居节点,不是父子关系)
dom.previousElementSibling 当前元素的上一个元素的节点(是邻居节点,不是父子关系)

 

5、节点属性 

nodeName    元素的标签名,以大写形式表示,只读 返回字符串
nodeValue Text节点或Comment节点的文本内容,可读写
nodeType 返回该节点的类型 ,非常常用

 

封装  - 返回当前元素的子元素节点 

<div id="box">
吕星辰
<!--<span></span>-->
<div>123</div>
<span>345</span>
</div>
<script>
function retTemp(node) {
let temp = {
push: Array.prototype.push,
splice: Array.prototype.splice //加上splice 浏览器内部会把temp变为类数组
}
let childrenNodes = node.childNodes,
childrenNodesLength = childrenNodes.length
// 节点类型等于1 - 元素节点,才push
for(let i = 0; i < childrenNodesLength; i ++) {
if (childrenNodes[i].nodeType === 1) {
temp.push(childrenNodes[i])
}
}
return temp
}
let node = document.getElementById('box')
const r = retTemp(node)
console.log(r) // Object(2) [div, span, push: ƒ, splice: ƒ]
</script>

js dom - 元素选择、节点树、元素节点树、节点属性_元素节点_04

 

封装 - insertAfter 方法, 在某个元素之后插入元素节点

<div id="box">吕星辰
<span></span>
<p></p>
</div>
<script>
let div = document.getElementById('box')
let span = document.getElementsByTagName('span')[0]
let p = document.getElementsByTagName('p')[0]
let i = document.createElement('i')

// 封装insertAfter 在某个元素之后插入元素节点
Element.prototype.insertAfter = function(targetElement, afterElement) {
let proxy = afterElement.nextElementSibling // 获取到某个元素的下一个相邻元素节点
if (proxy === null) { // 有个可能是最后一个元素,获取到某个元素的下一个相邻元素就为null
this.appendChild(targetElement) // 直接插入
} else {
this.insertBefore(targetElement, proxy) // 在相邻元素的前边插入元素即可
}
}
div.insertAfter(i, p)
</script>