DOM-获取DOM元素、修改属性
Web API 基本认知
1.作用和分类
- 作用: 就是使用 JS 去操作 html 和浏览器
- 分类:DOM (文档对象模型)、BOM(浏览器对象模型)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vPOKUg7l-1649142008677)(01-DOM-获取DOM元素、修改属性.assets/1648970987152.png)]
2.什么是DOM
- DOM(Document Object Model——文档对象模型)是用来呈现以及与任意 HTML 或 XML文档交互的API
- 白话文:DOM是浏览器提供的一套专门用来 操作网页内容 的功能
- DOM作用
- 开发网页内容特效和实现用户交互
3.DOM树
-
DOM树是什么
- 将 HTML 文档以树状结构直观的表现出来,我们称之为文档树或 DOM 树
- 描述网页内容关系的名词
-
作用
文档树直观的体现了标签与标签之间的关系
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aV3M0Dz1-1649142008678)(01-DOM-获取DOM元素、修改属性.assets/1648971136773.png)]
4.DOM对象
- DOM对象:浏览器根据html标签生成的 JS对象
- 所有的标签属性都可以在这个对象上面找到
- 修改这个对象的属性会自动映射到标签身上
- DOM的核心思想:把网页内容当做对象来处理
- document 对象
- 是 DOM 里提供的一个对象
- 所以它提供的属性和方法都是用来访问和操作网页内容的
- 网页所有内容都在document里面
获取DOM对象
- 根据CSS选择器来获取DOM元素 (重点)
- 其他获取DOM元素方法(了解)
1.根据CSS选择器来获取DOM元素 (重点)
1.选择匹配的第一个元素
如果该标签有多个,只会显示第一个
语法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BDjYDWfe-1649142008678)(01-DOM-获取DOM元素、修改属性.assets/1648971381312.png)]
参数:包含一个或多个有效的CSS选择器 字符串
返回值:CSS选择器匹配的第一个元素,一个 HTMLElement对象。
如果没有匹配到,则返回null。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8qZIfdkB-1649142008679)(01-DOM-获取DOM元素、修改属性.assets/1648988947151.png)]
代码展示
<script>
// 想要获取页面标签,需要使用document.querySelector选择器
let divDom = document.querySelector("div")
console.log(divDom);//输出为<div>123</div>
console.dir(divDom);//输出div 在输出DOM标签时,使用dir
//上方有两个div标签,但是只会输出第一个标签元素
</script>
案例
[‘马超’, ‘赵云’, ‘吕布’, ‘张飞’],随机出现该数组中的一个人名
<body>
<h1>来将可留姓名?</h1>
<h2 style="color: aqua;"></h2>
<script>
let friend = ['马超', '赵云', '吕布', '张飞']
// 数组中任选其一
function getFriend(min, max) {
return Math.round(Math.random() * (max - min) + min)
}
let index = getFriend(0, friend.length - 1)
let friends = friend[index];
// 定位网页dom元素
let h2Dom = document.querySelector('h2')
h2Dom.innerText = friends
</script>
</body>
2.选择匹配的多个元素
会选中所有符合条件的该标签
语法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lG2Bmoo1-1649142008679)(01-DOM-获取DOM元素、修改属性.assets/1648975185115.png)]
参数:
包含一个或多个有效的CSS选择器 字符串
返回值:
CSS选择器匹配的NodeList 对象集合
例子:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hGH1adkb-1649142008679)(01-DOM-获取DOM元素、修改属性.assets/1648975234791.png)]
代码展示:
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
<div>
</div>
<script>
let liDom = document.querySelectorAll('li');
for (let index = 0; index < liDom.length; index++) {
liDom[index].innerText = `这是Bom标签 ${index + 1}`;
}
console.log(liDom);
let divBom = document.querySelectorAll('div')
console.log(divBom);
</script>
</body>
3.伪数组
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cYqJeCU6-1649142008679)(01-DOM-获取DOM元素、修改属性.assets/1648987577859.png)]
得到的是一个伪数组:
- 有长度有索引号的数组
- 但是没有 pop() push() 等数组方法
想要得到里面的每一个对象,则需要遍历(如 for)的方式获得。
注意:哪怕只有一个元素,通过querySelectAll() 获取过来的也是一个伪数组,里面只有一个元素而已
3.其他获取DOM元素方法(了解)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tUSvFajB-1649142008680)(01-DOM-获取DOM元素、修改属性.assets/1648987667885.png)]
设置/修改DOM元素内容
1.设置文本内容(3种)
1.document.write()
- 只能将文本内容追加到 前面的位置
- 文本中包含的标签会被解析
- 用的比较少
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aLmVXhkL-1649142008680)(01-DOM-获取DOM元素、修改属性.assets/1648987786728.png)]
<script>
document.write('<button>按钮</button>')//会直接接在body的后面
</script>
2.元素innerText 属性
-
将文本内容添加/更新到任意标签位置
-
文本中包含的标签不会被解析
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-08lXEoZr-1649142008680)(01-DOM-获取DOM元素、修改属性.assets/1648987878101.png)]
<script>
document.querySelector('li:nth-child(3)').innerText = '<button>按钮</button>';
//可以设置文本,不能解析html字符串
</script>
3.元素.innerHTML 属性
- 将文本内容添加/更新到任意标签位置
- 文本中包含的标签会被解析
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pYnjyBns-1649142008680)(01-DOM-获取DOM元素、修改属性.assets/1648988003967.png)]
<script>
document.querySelector('li:nth-child(2)').innerHTML = '<button>按钮</button>';
//可以设置文本,也可以解析html字符串
</script>
4.修改元素属性
-
还可以通过 JS 设置/修改标签元素属性,比如通过 src更换 图片
-
最常见的属性比如: href、title、src 等
-
语法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B3IyXKLQ-1649142008681)(01-DOM-获取DOM元素、修改属性.assets/1648988215333.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G2KPQPCU-1649142008681)(01-DOM-获取DOM元素、修改属性.assets/1648988231827.png)]
5.练习
数组中放5张图片,每次刷新时,随机出现一张图片
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5S68MDw7-1649142008681)(01-DOM-获取DOM元素、修改属性.assets/1648988158796.png)]
代码展示
<body>
<img src="./images/1.png" alt="">
<script>
// 建立数组,将图片的位置放进去
let img1 = [
"./images/1.png",
"./images/2.png",
"./images/3.png",
"./images/4.png",
"./images/5.png"
]
// 随机挑选一张图片
let index = Math.round(Math.random() * 4)
// 获取img标签的的Bom元素
let img = document.querySelector('img')
// 修改img.src的属性
img.src = img1[index]
</script>
</body>
设置/修改元素样式属性
还可以通过 JS 设置/修改标签元素的样式属性。
1.通过 style 属性操作CSS
语法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0kIHP7G4-1649142008681)(01-DOM-获取DOM元素、修改属性.assets/1648988346959.png)]
例子
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gzqL2My9-1649142008682)(01-DOM-获取DOM元素、修改属性.assets/1648988366247.png)]
·
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uOEnBAjL-1649142008682)(01-DOM-获取DOM元素、修改属性.assets/1648988389146.png)]
代码展示
<body>
<div>设置元素样式</div>
<script>
let div = document.querySelector('div')
div.style.backgroundColor = "pink";
div.style.fontSize = "100px"
div.style.height = "200px"
div.style.margin = "100px auto"
div.style.textAlign = "center"
div.style.lineHeight = "200px"
</script>
</body>
案例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gpsvl7aP-1649142008682)(01-DOM-获取DOM元素、修改属性.assets/1648988456175.png)]
<body>
<script>
let Img = ["./images/1.png", "./images/2.png", "./images/3.png", "./images/4.png", "./images/5.png"];
let index = Math.round(Math.random() * 4);
// let body = document.querySelector('body');
// document.body.style.backgroundImage = `./images/${index}.png`
document.body.style.backgroundImage = `url(./images/${index}.png) `
</script>
</body>
2.操作类名(className) 操作CSS
如果修改的样式比较多,直接通过style属性修改比较繁琐,我们可以通过借助于css类名的形式。
语法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JDIbABx7-1649142008682)(01-DOM-获取DOM元素、修改属性.assets/1648988531619.png)]
注意:
- 由于class是关键字, 所以使用className去代替
- className是使用新值换旧值, 如果需要添加一个类,需要保留之前的类名
- 直接使用会覆盖之前写的样式,只留这个
3.通过 classList 操作类控制CSS
为了解决className 容易覆盖以前的类名,我们可以通过classList方式追加和删除类名
语法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eiA9hYvO-1649142008682)(01-DOM-获取DOM元素、修改属性.assets/1648988632869.png)]
代码展示
<style>
d1 {
border: 1px solid black;
background-color: aqua;
}
d2 {
width: 200px;
}
d3 {
height: 300px;
}
d4 {
border-radius: 50%;
}
</style>
</head>
<body>
<div class="d1"> 123</div>
<script>
let div = document.querySelector('div');
div.classList.add("d2", "d3") //可以同时添加多个样式
div.classList.remove("d1", "d2") //删除样式,同样可以删除多个
div.classList.toggle("d3")// 如果有这个样式,就会将这个样式删除,如果之前没有添加这样式,就会添加上
</script>
</body>
设置/修改表单样式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LyfVi4py-1649142008683)(01-DOM-获取DOM元素、修改属性.assets/1649039722331.png)]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
/>
<title>04-表单属性设置.html</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
</style>
</head>
<body>
<input type="text" class="username" />
是否同意协定
<input type="checkbox" class="isarg" checked />
<button class="code" disabled>发送验证码</button>
<select class="sel">
<option>去泰国</option>
<option>去非洲</option>
<option>去印度</option>
<option>去啊富汗</option>
</select>
<script>
/*
innerText innerHTML 主要是用来设置 双标签的文本内容的
*/
// 获取一下表单 dom元素
let username = document.querySelector('.username');
// 复选框
let isarg = document.querySelector('.isarg');
// 按钮
let code = document.querySelector('.code');
// 设置文本内容
// username.innerText = '我的用户名';
// 设置输入框的文本内容
username.value = '我的用户名';
// 设置勾选上
// isarg.checked = true;
// 不勾选
// isarg.checked = false;
// 设置按钮 可以启用 可以点击
// disabled 禁用
// code.disabled = true;// 禁用
code.disabled = false; // 启用
// select 选中
let option = document.querySelector('option:nth-child(4)');
// option.select = true; // 错误的单词
option.selected = true; // 正确的单词
// checked disabled selected
/*
表单属性的总结
1 设置普通的输入框 input.value ="表单的值"
2 设置 按钮的禁用
button.disabled=true 禁用
button.disabled=false 启用
3 设置单选框或者复选框
radio.checked=true 选中
checkbox.checked=false 取消选中
4 设置下拉列表 select
option.selected=true 选中
5 文本域标签 有点点特殊 ! 下一节课再来讲解
*/
</script>
</body>
</html>
定时器-间歇函数
定时器使用场景
- 网页中经常会需要一种功能:每隔一段时间需要自动执行一段代码,不需要我们手动去触发
- 例如:网页中的倒计时
- 要实现这种需求,需要定时器函数
- 定时器函数有两种,今天先了解讲间歇函数
定时器函数基本使用
定时器函数可以开启和关闭定时器
1. 开启定时器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vEchdTSK-1649142008683)(01-DOM-获取DOM元素、修改属性.assets/1648988752456.png)]
作用:每隔一段时间调用这个函数
单位:间隔时间单位是毫秒
例子:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9zPAMReZ-1649142008683)(01-DOM-获取DOM元素、修改属性.assets/1648988786859.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-36v73fJS-1649142008683)(01-DOM-获取DOM元素、修改属性.assets/1648988795752.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MCAZBu4j-1649142008683)(01-DOM-获取DOM元素、修改属性.assets/1648988884758.png)]代码展示
<script>
function repeat() {
console.log('头发多,就是玩');
}
setInterval(repeat, 1000)// setInterval(函数名,间隔时间)间隔时间的单位为毫秒
// 匿名函数的使用方法
setInterval(function () {
console.log('前端使我头秃');
}, 1000)
</script>
2. 关闭定时器
一般不会刚创建就停止,而是满足一定条件再停止
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DFFGnTr3-1649142008684)(01-DOM-获取DOM元素、修改属性.assets/1648988979506.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v3OXPAUP-1649142008684)(01-DOM-获取DOM元素、修改属性.assets/1648988999719.png)]
案例
1.制作一个60s的倒计时,当倒计时为0后,重新返回60再计算
<style>
d1 {
line-height: 200px;
text-align: center;
}
</style>
</head>
<body>
<div>
</div>
<script>
//图中的样式只是为了练手
let div = document.querySelector('div')
div.classList.add('d1')
div.style.width = "200px"
div.style.height = "200px"
div.style.backgroundColor = "pink"
div.style.margin = "100px auto"
let times = 60
setInterval(() => {
div.innerText = times;
times--
if (times === -1) {
times = 60
}
}, 100);
</script>
</body>
2.制作轮播图,每秒钟切换一张图片,一直循环
<body>
<img src="" alt="">
<script>
//获取img的dom标签
let img = document.querySelector('img')
let index = 1
// 使用计时器的方式进行更换图片
setInterval(() => {
// console.log(index);
img.src = `./images/b0${index}.jpg`
index++
// 共9张图,当index=10的时候,返回第一张图
if (index === 10) {
index = 1
}
}, 1000);
</script>
</body>
案例加强
1.书写一个倒计时的案例
从60开始倒计时,等到数字变为0时,再将数字变成60继续倒数,一直循环
<body>
<div></div>
<script>
let div = document.querySelector('div')
let times = 60
setInterval(() => {
div.innerHTML = times
times--
console.log(times);
if (times === -1) {
times = 60
}
}, 100);
</script>
</body>
2.轮播图案例
使用9张图片,一打开页面,每秒钟就会更换一张图片,一共九张一直循环播放
<body>
<img src="" alt="">
<script>
let img = document.querySelector('img')
let num = 1
setInterval(() => {
img.src = `../../01-day/images/b0${num}.jpg`
num++
if (num === 10) {
num = 1
}
}, 1000);
</script>
</body>
setInterval(() => {
div.innerHTML = times
times–
console.log(times);
if (times === -1) {
times = 60
}
}, 100);
2.轮播图案例
使用9张图片,一打开页面,每秒钟就会更换一张图片,一共九张一直循环播放
<body>
<img src="" alt="">
<script>
let img = document.querySelector('img')
let num = 1
setInterval(() => {
img.src = `../../01-day/images/b0${num}.jpg`
num++
if (num === 10) {
num = 1
}
}, 1000);
</script>
</body>