1.1.什么是DOM
文档对象模型(Document Object Model,简称 DOM),是 W3C 组织推荐的处理可扩展标记语言(HTML或者XML)的标准编程接口。
W3C 已经定义了一系列的 DOM 接口,通过这些 DOM 接口可以改变网页的内容、结构和样式。
1.2.DOM树
- 文档:一个页面就是一个文档,DOM中使用doucument来表示
- 元素:页面中的所有标签都是元素,DOM中使用 element 表示
- 节点:网页中的所有内容都是节点(标签,属性,文本,注释等),DOM中使用node表示
DOM 把以上内容都看做是对象
2.获取元素
2.1.如何获取页面元素
DOM在我们实际开发中主要用来操作元素。
我们如何来获取页面中的元素呢?
获取页面中的元素可以使用以下几种方式:
- 根据ID获取
- 根据标签名获取
- 通过class类名获取
- 通过name属性获取
- 通过选择器获取
2.2.根据ID获取
使用 getElementById() 方法可以获取带ID的元素对象
document.getElementById('id名')
使用console.log()可以快速打印我们获取的元素对象,更好的查看对象里面的属性和方法。
示例
<div id="time">2022-08-08</div>
<script>
//1.因为我们文档页面从上往下加载,所以得先有标签,所以script写在标签下面
//2.get 获得 element 元素 by 通过 驼峰命名法
//3.参数 id是大小写敏感的字符串
//4.返回的是一个元素对象
var time = document.getElementById('time')
console.log(time)
//5.console.dir 打印我们的元素对象,更好的查看里面的属性和方法
console.dir(time)
</script>
2.3.根据标签名获取
根据标签名获取,使用 getElementByTagName() 方法可以返回带有指定标签名的对象的集合
- 因为得到的是一个对象的集合,所以我们想要操作里面的元素就需要遍历
- 得到元素对象是动态的
- 返回的是获取过来元素对象的集合,以伪数组的形式存储
- 如果获取不到元素,则返回为空的伪数组(因为获取不到对象)
<ul>
<li>123</li>
<li>456</li>
<li>789</li>
<li>abc</li>
</ul>
<script>
//1.返回的是获取过来元素对象的集合 以伪数组的形式存储
var li = document.getElementsByTagName('li')
console.log(li)
console.log(li[1])
//2.依次打印,遍历
for (var i = 0; i < li.length; i++) {
console.log(li[i])
}
// 3.如果页面中只有 1 个 li,返回的还是伪数组的形式
// 4.如果页面中没有这个元素,返回的是空伪数组
</script>
2.4.通过class类型获取
使用 getElementByClassName('类名') 方法可以返回元素对象合集
- 因为得到的是一个对象的集合,所以我们想要操作里面的元素就需要遍历
- 得到元素对象是动态的
- 返回的是获取过来元素对象的集合,以伪数组的形式存储
- 如果获取不到元素,则返回为空的伪数组(因为获取不到对象)
document.getElementByClassName('类名')
<div class="demo">测试</div>
<div class="demo">测试1</div>
<div class="demo">测试2</div>
<div class="demo">测试3</div>
<div class="demo">测试4</div>
<script>
var demo = document.getElementsByClassName('demo')
console.log(demo)
</script>
2.5.通过name属性获取
document.getElementByName('name名')
<input type="text" name="input" id="">
<script>
var input = document.getElementsByName('input')
console.log(input)
</script>
注意:该方法只有标签拥有name属性时,才能使用该方法。
2.6.通过选择器获取
使用 getElement.querySelector('选择器') 方法可以根据指定选择器返回第一个元素对象
document.querySelector('选择器');
// 切记里面的选择器需要加符号
// 类选择器.box
// id选择器 #nav
var firstBox = document.querySelector('.box');
<div class="app">
hello world
<p>111</p>
</div>
<script>
//通过选择器获取div下的p元素
var p = document.querySelector('.app p')
console.log(p)
</script>
注意:使用此方法我们只能根据指定选择器返回第一个元素对象,如果后面有多个相同的元素对象,也只能返回第一个元素对象。想要返回所有的元素对象,需要使用getElement.querySelectorAll('选择器')方法,此时得到的也是一个对象的集合。
document.querySelectorAll('选择器')
<div class="app">
hello world
<p>111</p>
<p>222</p>
<p>333</p>
</div>
<script>
//通过选择器获取div下的p元素
var p = document.querySelectorAll('.app p')
console.log(p)
</script>
2.7.通过节点关系获取节点
DOM节点并不是单独存在的,节点间存在相互关系:父子关系、非父子关系(兄弟关系)
2.7.1获取兄弟节点
- 获取下一个兄弟元素节点 || 获取下一个节点
nextElementSibling 下一个元素节点
nextElement 包含换行符、空格
<ul>
<li>
<span>6666</span>
<span>3333</span>
<p class="p">11111</p>
<span>4444</span>
</li>
<li>
<p>222</p>
</li>
</ul>
<script>
//选中第一个li中的p标签元素
var p = document.querySelector('li:nth-child(1) p')
//获取p标签元素的下一个元素节点,不包含空格、换行符
console.log(p.nextElementSibling) //<span>4444</span>
</script>
<ul>
<li>
<span>6666</span>
<span>3333</span>
<p class="p">11111</p>
<span>4444</span>
</li>
<li>
<p>222</p>
</li>
</ul>
<script>
//选中第一个li中的p标签元素
var p = document.querySelector('li:nth-child(1) p')
//获取p标签元素的下一个元素节点,包含空格、换行符,
//此时p标签元素后方有空格,所以它的下一个元素节点是文本节点
console.log(p.nextSibling) //#text
</script>
- 获取上一个兄弟元素节点 || 获取上一个节点
previousElementSibling 上一个元素节点
previousSibling 包含换行符、空格
<ul>
<li>
<span>6666</span>
<span>3333</span>
<p class="p">11111</p>
<span>4444</span>
</li>
<li>
<p>222</p>
</li>
</ul>
<script>
//选中第一个li中的p标签元素
var p = document.querySelector('li:nth-child(1) p')
//获取p标签元素的上一个节点元素,不包含空格、换行符
console.log(p.previousElementSibling) //<span>3333</span>
</script>
<ul>
<li>
<span>6666</span>
<span>3333</span>
<p class="p">11111</p>
<span>4444</span>
</li>
<li>
<p>222</p>
</li>
</ul>
<script>
//选中第一个li中的p标签元素
var p = document.querySelector('li:nth-child(1) p')
//获取p标签元素的上一个节点元素,包含空格、换行符
console.log(p.previousSibling) //#text
</script>
2.7.2.获取子节点
- 获取第一个子节点 || 获取第一个元素子节点
firsetChild 获取第一个子节点 包含空格、换行符
firstElementChild 获取第一个元素子节点
<ul>
<li>
<span>6666</span>
<span>3333</span>
<p class="p">11111</p>
<span>4444</span>
</li>
<li>
<p>222</p>
</li>
</ul>
<script>
var li = document.querySelector('ul li:first-child')
console.log(li.firstChild) //#text
</script>
<ul>
<li>
<span>6666</span>
<span>3333</span>
<p class="p">11111</p>
<span>4444</span>
</li>
<li>
<p>222</p>
</li>
</ul>
<script>
var li = document.querySelector('ul li:first-child')
console.log(li.firstElementChild) //<span>6666</span>
</script>
- 获取最后一个子节点 || 获取最后一个元素子节点
lastChild 获取最后一个子节点 包含空格、换行符
lastElementChild 获取最后一个元素子节点
<ul>
<li>
<span>6666</span>
<span>3333</span>
<p class="p">11111</p>
<span>4444</span>
</li>
<li>
<p>222</p>
</li>
</ul>
<script>
var li = document.querySelector('ul li:first-child')
console.log(li.lastChild) //#text
</script>
<ul>
<li>
<span>6666</span>
<span>3333</span>
<p class="p">11111</p>
<span>4444</span>
</li>
<li>
<p>222</p>
</li>
</ul>
<script>
var li = document.querySelector('ul li:first-child')
console.log(li.lastElementChild) //<span>4444</span>
</script>
- 获取所有的子节点(包含换行符、空格)
childNodes
<ul>
<li>
<span>6666</span>
<span>3333</span>
<p class="p">11111</p>
<span>4444</span>
</li>
<li>
<p>222</p>
</li>
</ul>
<script>
var li = document.querySelector('ul li:first-child')
console.log(li.childNodes)
</script>
注意:因为这种方法包含换行符和空格,所以最终集合的元素中元素个数为9
- 获取指定元素的子节点的集合(不包含换行符、空格)
children
<ul>
<li>
<span>6666</span>
<span>3333</span>
<p class="p">11111</p>
<span>4444</span>
</li>
<li>
<p>222</p>
</li>
</ul>
<script>
var li = document.querySelector('ul li:first-child')
console.log(li.children)
</script>
2.7.3获取父节点
获取指定元素的父元素
parentNode
<ul>
<li>
<span>6666</span>
<span>3333</span>
<p class="p">11111</p>
<span>4444</span>
</li>
<li>
<p>222</p>
</li>
</ul>
<script>
var li = document.querySelector('ul li:first-child')
console.log(li.parentNode)
</script>
<ul>
<li>
<span>6666</span>
<span>3333</span>
<p class="p">11111</p>
<span>4444</span>
</li>
<li>
<p>222</p>
</li>
</ul>
<script>
var ul = document.querySelector('ul')
console.log(ul.parentNode)
</script>
3.DOM内容及属性的设置
3.1.操作元素节点的属性
- 原生属性
class/id/style
元素.属性名 = 属性值
<div id="app" style="color: red;" class="demo">
11111
</div>
<script>
var app = document.querySelector('#app')
app.id = 'box'
app.className = 'text'
app.style = 'color:blue;font-size:50px'
</script>
- 自定义属性
不是标签原生自带的属性
元素.setAttribute('自定义的属性名','属性值')
<div id="app" style="color: red;" class="demo">
11111
</div>
<script>
var app = document.querySelector('#app')
app.setAttribute('a', '1')
</script>
<div>
11111
</div>
<script>
var div = document.querySelector('div')
div.setAttribute('class', 'demo')
div.setAttribute('id', 'app')
</script>
注意:推荐使用自定义属性的方法,因为自定义的方法使用范围大于原生属性的使用范围。
- data-自定义名
h5新标签属性
自定义属性
主要用来通过js操作当前dom
//格式
<元素标签 data-自定义名1="值1" data-自定义名2="值2" ...></元素标签>
获取data-自定名的值 通过元素.dataset.自定义名 获取
<div id="app" data-index="100" class="demo active app" data-item="hello" data-index="100">11111</div>
<script>
var app = document.querySelector('#app')
console.log(app.dataset.index, app.dataset.item)
</script>
3.2.原生操作处理类名
元素.className = '新值'
<div id="app" data-index="100" class="demo">11111</div>
<script>
var app = document.querySelector('#app')
app.className = ('active')
</script>
3.2.1.获取当前元素所有的类名的列表
元素.classList
<div id="app" data-index="100" class="demo active app">11111</div>
<script>
var app = document.querySelector('#app')
console.log(app.classList)
</script>
3.2.2.使用原生操作添加类名
元素.classList.add('类名')
<div id="app" data-index="100" class="demo active app">11111</div>
<script>
var app = document.querySelector('#app')
app.classList.add('test')
</script>
3.2.3.使用原生操作删除类名
元素.classList.remove('类名')
<div id="app" data-index="100" class="demo active app">11111</div>
<script>
var app = document.querySelector('#app')
app.classList.remove('app')
</script>
3.2.4.使用原生操作替换类名
元素.classList.replace('old','new')
<div id="app" data-index="100" class="demo active app">11111</div>
<script>
var app = document.querySelector('#app')
app.classList.replace('app', 'test')
</script>
3.2.5.使用原生操作切换类名
元素.classList.toggle('类名')
示例:
页面中有一行文字和一个按钮,点击按钮时文字会出现和隐藏。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.active {
display: none;
}
</style>
</head>
<body>
<div id="app" class="app demo">1111</div>
<button onclick="toggle()">显示/隐藏</button>
<script>
var app = document.querySelector('#app')
function toggle() {
app.classList.toggle('active')
}
</script>
</body>
</html>