DOM 是网页元素的抽象结果,我们通过打开 Firebug
或是 Chrome 开发者工具
,在 Elements
栏目可以观察到,像树状的一级又一级的节点,这些就是当前网页的组成元素。
通过 JavaScript 我们能操作这些节点,从而在不需要刷新网页的情况下,就能改变了页面的显示效果。对 DOM 的操作,也是 JavaScript 在客户端应用领域的核心。
对 DOM 的操作,可以抽象成四个部分 获取
、修改
、新增
、删除
。
<!-- 假设下例是我们当前的网页元素,我们尝试对它进行以上操作 -->
<html>
<head><title>DOM</title></head>
<body>
<div class="div_class" id="div_id">
<p>1</p>
<p>2</p>
</div>
</body>
</html>
document.getElements
div = document.getElementsByTagName('div') // 通过元素名称获取元素对象
div = document.getElementsByClassName('div_class') // 通过元素类名获取元素对象
div = document.getElementById('div_id') // 通过元素ID获取元素对象
console.log(div) // [object HTMLCollection] | 上面三组获取得到的结果都是一样的,一个 DOM 的集合,因为有可能同时存在多个 div 对象
console.log(div[0]) // [object HTMLDivElement] | 指定获取 DOM 对象
/*
<div class="div_class" id="div_id">
<p>1</p>
<p>2</p>
</div>
*/
范围限定
div = document.getElementsByTagName('div')
div[0].getElementsByTagName('p') // HTMLCollection(2) [p, p]
/*
document 是从 body 开始获取下面的元素对象,我们可以把范围限定到 div[0],这样 getElementsByTagName('div') 就只获取到 div 下面到两个 p
*/
querySelector
document.querySelector('#div_id') // [object HTMLDivElement]
document.querySelectorAll('div.div_class > p') // [object HTMLCollection]
/*
document.getElements 可以兼容到古老 IE6、7、8
querySelector 是更新的获取元素语法、支持了大部分 CSS 的选择器的功能
*/
children
div = document.getElementsByTagName('div')
div[0].children // HTMLCollection(2) [p, p]
div[0].children[0] // <p>1</p>
div[0].children[1] // <p>2</p>
/*
children 获取子元素
*/
firstElementChild
div = document.getElementsByTagName('div')
div[0].firstElementChild // <p>1</p>
/*
firstElementChild 获取第一个子元素
*/
parentElement
div = document.getElementsByTagName('div')
div[0].firstElementChild.parentElement // <div class="div_class" id="div_id">...</div>
/*
parentElement 获取父元素
*/
innerHTML
div = document.getElementsByTagName('div')
div[0].children[0].innerHTML // 1
/*
innerHTML 获取 HTML 标签里面到文本内容
*/
文本修改
div = document.getElementsByTagName('div')
div[0].children[0].innerHTML = 'p1'
样式修改
div = document.getElementsByTagName('div')
div[0].style.fontWeight = '20px'
/*
由于 JavaScript 中 '-' 符号会解析错误,所有 CSS 写法要改成 “驼峰命名法”
font-weight = fontWeight
background-color = backgroundColor
...
*/
属性修改
div = document.getElementsByTagName('div')
div[0].setAttribute('class', 'other_class') // 修改 class 属性名称
createElement
style = document.createElement('style') // 创建元素
style.setttribute('type','text/css') // 添加属性
style.innerHTML = '* {...}' // 添加内容
/*
上例创建的结果
<style type="text/css">
* {...} // 在这里面我们就能写 CSS 样式了
</style>
需要注意,通过 createElement 创建的元素,只保留在内存中,要配合后面的两个属性 appendChild & insertBefore 载入到网页中
*/
appendChild
/*
<p>3</p>
<div>
<p>1</p>
<p>2</p>
</div>
*/
p3 = document.getElementsByTagName('p')[0]
div = document.getElementsByTagName('div')[0]
div.appendChild(p3)
/*
<div>
<p>1</p>
<p>2</p>
<p>3</p>
</div>
*/
/*
appendChild 把元素移动到某个元素的下级
*/
insertBefore
/*
<p>3</p>
<div>
<p>1</p>
<p>2</p>
</div>
*/
p3 = document.getElementsByTagName('p')[0]
p1 = document.getElementsByTagName('p')[1]
div = document.getElementsByTagName('div')[0]
div.insertBefore(p1,p3)
/*
<div>
<p>3</p>
<p>1</p>
<p>2</p>
</div>
*/
/*
insertBefore 把元素移动到某个元素的同级
*/
removeChild
div = document.getElementsByTagName('div')
div.children[0].removeChild(p)
div.children[1].removeChild(p) // error 此时 p2 = 0 删除后位置被更新了