[toc]
web APIs
1,作用和分类
- 作用:就是使用JS去操作html和浏览器
- 分类: DOM(文档对象模型) ,BOM(浏览器对象模型) (注意:DOM属于BOM里面)
JavaScript:
1,ECMAScript (定义规则)
2,Web APIs :
- 2-1:DOM 页面对象模型
- 2-2:BOM 浏览器对象模型
DOM-获取DOM元素,修改属性
DOM定义:
DOM(Document Object Model——文档对象模型)是用来呈现以及与任意 HTML 或 XML文档交互的API 解释:DOM是浏览器提供的一套专门用来 操作网页内容 的功能 DOM作用:
* 开发网页内容特效和实现用户交互
小结:
Web API阶段我们学习那两部分? DOM BOM DOM 是什么?有什么作用? DOM 是文档对象模型 操作网页内容,可以开发网页内容特效和实现用户交互
DOM树
定义:可以把HTML文档以树状结构直观的表现出来,(文档树或DOM数)
描述网页内容关系的名词
作用:DOM树可以直接体现标签之间的关系
DOM对象
DOM对象:浏览器根据html标签生成的JS对象
所有标签属性都可以在这个对象上面找到
修改这个对象的属性会自动映射到标签身上
DOM的核心:把网页内容当做对象来处理
document对象:
1,DOM里面提供的一个对象
2,它提供的属性和方法都是用来访问和操作网页内容的
document.write()
注意:网页所有的内容都在document中
- DOM 树是什么? 将 HTML 文档以树状结构直观的表现出来,我们称之为文档树或 DOM 树 作用:文档树直观的体现了标签与标签之间的关系
- DOM对象怎么创建的? 浏览器根据html标签生成的 JS对象(DOM对象) DOM的核心就是把内容当对象来处理
- document 是什么? 是 DOM 里提供的一个对象 网页所有内容都在document里面
获取DOM元素
可以:根据css选择器来获取DOM元素
操作某个标签 ,先得选中这个标签,与css选中器理性
查找元素DOM元素就是选种某个标签元素
获取DOM对象
1,根据css选择器来获取DOM元素
语法:
document.querySelector("css选择器") //css选择器 为:类名
参数:包含一个或多个有效的CSS选择器 字符串
返回值:
如果有多个选择的标签时,CSS选择器匹配第一个元素,一个HTMLElement对象
如果没有匹配到,则返回null
文档:developer.mozilla.org/zh-CN/docs/…
2,根据css选择器来获取多个DOM元素
语法:document.querySelectorAll("css选择器")
document.querySelectorAll("css选择器") 获取到符合要求的多个元素组成的伪数组
let li = document.querySelectorAll("css选择器")
<ul>
<li>1</li>
<li>2</li>
</ul>
let li = document.querySelector("ul li")
console.log(li) //一个li
console.dir(li) //第一个li
参数:
包含一个或者多个有小CSS选择器 字符串
返回值 :
css选择器匹配的NodeList 对象集合
如:
<ul>
<li>1</li>
<li>2</li>
</ul>
let lis = document.querySelectorAll("ul li")
console.log(lis) //数组 里面两个li
querySelect和querySelectAll举例:
<!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.querySelectorAll("css选择器")</title>
</head>
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<div>123</div>
<script>
// 获取第一个符合要求的li
let li = document.querySelector('li');
console.log('li -----> ', li);
// 缩写 qsa
// 获取所有的li标签 返回一个伪数组
// 不管有没都返回伪数组
let lis = document.querySelectorAll('li');
console.log('lis -----> ', lis);
// 伪数组 和 for循环搭配
for (let i = 0; i < lis.length; i++) {
// lis[i] dom元素
// 文本
lis[i].innerText = `这是第${i + 1}个li标签`;
}
//
let divs = document.querySelectorAll('div'); //没有这个元素时是空数组
console.log('divs -----> ', divs); //[div]//有一个div就
/*
小结:querySelect和querySelectAll区别:
querySelect
1,能找到 返回dom元素 dom对象
2,找不到 返回null
querySelectAll
1,能找到 返回含dom的伪数组
2,找不到 返回一个空的伪数组
*/
</script>
</body>
</html>
小结:
获取一个DOM元素我们使用谁? querySelector() 获取多个DOM元素我们使用谁? querySelectorAll() querySelector() 方法获取到的元素能直接操作修改吗? 可以 querySelectorAll() 方法获取到的元素能直接修改吗? 如果不能可以怎么做到修改? 不可以, 只能通过遍历的方式。依次给里面的元素做修改
document.querySelectorAll("css选择器")得到是一个伪数组:
- 有长度有索引的数组
- 但是没有pop() push()等数组方法
如果得到里面的每一个对象,则需要遍历(for) 的方式获得
用document.querySelectorAll("css选择器"),即使一个也是伪数组,里面一个元素
querySelect和querySelectAll区别:
小结:querySelect和querySelectAll区别:
querySelect
1,能找到 返回dom元素 dom对象
2,找不到 返回null
querySelectAll
1,能找到 返回含dom的伪数组
2,找不到 返回一个空的伪数组
根据其它方式获取DOM元素
根据id获取一个元素
document.getElementById("nav")
根据标签获取一类元素,获取页面所有div
document.getElementsByTagName("div")
根据类名获取元素 获取页面所有类名为 pp的
document.getElementsByClassName("pp")
小结:
- 获取页面中的标签我们最终常用那两种方式? querySelectorAll() querySelector()
- 他们两者的区别是什么? querySelector() 只能选择一个元素, 可以直接操作 querySelectorAll() 可以选择多个元素,得到的是伪数组,需要遍历得到每一个元素
- 他们两者小括号里面的参数有神马注意事项? 里面写css选择器 必须是字符串,也就是必须加引号
<!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>innerText和innerHTML</title>
</head>
<body>
<div id="nav">id选择器</div>
<p>我是p1标签</p>
<p>我是p2标签</p>
<div class="box">11111</div>
<p class="box">11111</p>
<script>
// 根据id来获取 一个dom
let nav = document.getElementById("nav")
console.log('nav -----> ', nav);
// 根据标签 来获取 元素 一组元素
let p = document.getElementsByTagName('p')
console.log('p -----> ', p);
// 根据类名获取元素 ---带s 一组伪元素
let box = document.getElementsByClassName('box')
console.log('box -----> ', box);
box[0].innerText = "我是box"
/*
innerText 给元素dom插入内容
dom.innerText = 内容
*/
</script>
</body>
</html>
设置修改DOM元素内容
作用:可以修改元素文本更好元素的内容
DOM对象是根据标签生成的,所以操作标签,本质是操作DOM对象
就是操作对象使用的点语法
document.write() 方法 对象.innerText 属性 对象.innerHTML 属性
document.write()
作用:
1,只能将文本内容追加到标签前面的位置
2,文本中包含的标签会被解析
如:
document.write(`<h1>你好</h1>`)
只能将文本内容追加到<body>标签前面的位置的操作,局限性大
元素innerText属性
作用:
1,将文本内容添加/更新到任意标签位置
2,文本包含的标签不会被解析
如:
<ul>
<li>1</li>
<li id="info">2</li>
</ul>
let li = document.getElementById("info")
info.innerText = "1111" //页面对应的Li标签内容出现11111
元素.innerText 属性
将文本内容添加/更新到任意标签位置
文本中包含的标签不会被解析
小结:
设置/修改DOM元素内容有哪3钟方式? document.write() 方法 元素.innerText 属性 元素.innerHTML 属性 2. 三者的区别是什么? document.write() 方法 只能追加到body中 元素.innerText 属性 只识别内容,不能解析标签 元素.innerHTML 属性 能够解析标签 如果还在纠结到底用谁,你可以选择innerHTML
innerHTML
作用;
1,将文本内容添加/更新到任意标签位置
2,文本中包含的标签会被解析
<ul>
<li>1</li>
<li id="info">2</li>
</ul>
let li = document.getElementById("info")
info.innerText = "1111" //页面对应的Li标签内容出现11111
元素.innerHTML 属性
将文本内容添加/更新到任意标签位置
文本中包含的标签会被解析
小结:
- 设置/修改DOM元素内容有哪3钟方式? document.write() 方法 元素.innerText 属性 元素.innerHTML 属性
- 三者的区别是什么? document.write() 方法 只能追加到body中 元素.innerText 属性 只识别内容,不能解析标签 元素.innerHTML 属性 能够解析标签 一般选择innerHTML
改标签内容
<!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>
</head>
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<script>
// document.write 功能弱 只能把标签写在body标签下面 ---不能写《/body》
// 改文字
document.querySelector('li:nth-child(2)').innerText =
'<span>随便改<span>';
document.querySelector('li:nth-child(3)').innerHTML =
'<span>随便改1111<span>';
/*
3种方式在标签中写 动态设置文本
1,document.write 只能在body标签中写 以后看不到
2,innerText 只能设置文本 , 不能解析 html字符串
3,innerHTML 可以设置文本 也可以解析html 字符串
*/
</script>
</body>
</html>
案例-随机抽取的名字显示到指定的标签内部
<body>
<div class="box">
抽中英雄是: <span></span> <span></span>
</div>
<script>
let arr = ['赵云', '黄忠', '关羽', '张飞', '马超', '刘备', '曹操']
let random = Math.floor(Math.random()*arr.length)
let span = document.querySelector('span')
span.innerText = arr[random]
</script>
</body>
设置/修改元素常用属性
可以通过JS设置/修改标签元素属性,比如 src更好 图片
常见属性都可以修改:href,title,src等。。。。
语法:
对象.属性 = 值
<ul>
<li>1</li>
<li >2</li>
<img id="info"/>
</ul>
let img = document.getElementById("info")
img.src = "/image/o1.jpg"
img.title = "这是神图"
案例-页面刷新-更换图片
<div class="box">
图片:<img src="./images/09.jpg" id="img" alt="">
</div>
<script>
let num = ["00","01","02","03","04","05","06","07","08","09",10]
let random = Math.floor(Math.random()*num.length)
console.log('random -----> ', num[random]);
let img = document.getElementById("img")
img.src = `./images/${num[random]}.jpg`
设置/修改元素样式属性
还可以通过 JS 设置/修改标签元素的样式属性。 比如通过 轮播图小圆点自动更换颜色样式 点击按钮可以滚动图片,这是移动的图片的位置 left 等等 学习路径: 通过 style 属性操作CSS ,立即可以生效 操作类名(className) 操作CSS ,会覆盖之前类名 通过 classList.add 操作类控制CSS ,不会覆盖之前类名
通过 style 属性操作CSS
语法:
对象.style.样式属性 = 值
注意:
修改样式通过style属性引出
如果属性有-连接符,需要转换为小驼峰命名法
赋值的时候,需要的时候不要忘记加css单位
let box = document.querySelector(".box")
box.style.backgroundColor = "yellow"
box.style.width = "400px"
box.style.marginTop = "50px"
背景颜色随机显示
<!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>09-背景颜色的随机显示.html</title>
<style>
body {
height: 100vh;
}
.box {
background-image: linear-gradient();
}
</style>
</head>
<body>
<script>
function getColor(){
let color1 = Math.round(Math.random() * 255);
let color2 = Math.round(Math.random() * 255);
let color3 = Math.round(Math.random() * 255);
let color4 = Math.round(Math.random() * 255);
let color5 = Math.round(Math.random() * 255);
let color6 = Math.round(Math.random() * 255);
console.log(' -----> ', `rgb(${color1},${color2},${color3})`);
// console.log(' -----> ', document.getElementsByTagName('body')[0]);
// document.getElementsByTagName('body')[0].style.backgroundColor = `rgb(${color1},${color2},${color3})`
document.getElementsByTagName(
'body'
)[0].style.backgroundImage = `linear-gradient(rgb(${color1},${color2},${color3}),rgb(${color4},${color5},${color6}),rgb(${color2},${color2},${color1}))`;
}
setInterval(() => {
getColor()
}, 1000);
</script>
</body>
</html>
小结:
- 设置/修改元素样式属性通过style属性引出来 2. 如果需要修改一个div盒子的样式,比如 padding-left, 如何写? element.style.paddingLeft = ‘300px’ 小驼峰命名法 3. 因为我们是样式属性,一定别忘记,大部分数字后面都需要加单位
操作类名(className)操作css
如果修改的样式比较多,直接通过style属性修改比较繁琐,我们可以通过借助于css类名的形式
语法:
<div class="box">
图片:<img src="./images/09.jpg" id="img" alt="">
</div>
元素.className = "active"
注意:
由于class是关键字, 所以使用className去代替
className是使用新值换旧值, 如果需要添加一个类,需要保留之前的类名
使用 className 有什么好处?
可以同时修改多个样式
2. 使用 className 有什么注意事项?
直接使用 className 赋值会覆盖以前的类名
<!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>08-className设置样式类来操作css样式</title>
<style>
.active{
color: red;
}
.btn{
color:pink;
}
</style>
</head>
<body>
<ul>
<li><a href="">1</a></li>
<li><a href="">2</a></li>
<li><a href="">3</a></li>
<li><a href=""><buttton class="pp kk">点击</buttton> </a></li>
<li><a href="">3</a></li>
</ul>
<script>
let red = document.getElementsByTagName("a")
red[1].className = "active"
let btn = document.getElementsByClassName("pp")
btn[0].className = "btn"
</script>
</body>
</html>
通过设置classList操作类控制css
有的:
解决className 容易覆盖以前的类名,我们可以通过classList方式追加和删除类名
追加一个类: 元素。classList.add("类名")
删除一个类: 元素.classList.remove("类名")
切换一个类: 元素.claseeList.toggle("类名")
判断一个类有无: 元素.classList.contains("类名") //返回true和false
小结:
使用 className 和classList的区别? 修改大量样式的更方便 修改不多样式的时候方便 classList 是追加和删除不影响以前类名
设置元素样式
<!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>07-设置元素的样式</title>
<style>
ul li {
list-style: none;
}
a{
text-decoration: none;
color: #000;
}
</style>
</head>
<body>
<ul>
<li><a href="#">百度</a></li>
<li><a href="#">百度1</a></li>
<li><a href="#">百度2</a></li>
<button id="btn">点击</button>
<input type="" class="inp">
</ul>
<script>
// 设置元素的样式
let baiDu = document.getElementsByTagName("a")
baiDu[0].href = "https://www.baidu.com/"
document.getElementById("btn").disabled = "false"
document.getElementsByClassName("inp")[0].type = "password"
</script>
</body>
</html>
设置/修改 表单元素 属性
作用:设置表单类型框转文本框
获取:DOM对象.属性名
设置:DOM对象.属性名 = 新值
表单.value = "用户命"
表单.type = "password"
特点:
表单属性中添加就有效果,移除就没有效果,一律使用布尔值表示 如果为true 代表添加了该属性 如果是false 代表移除了该属性
如:disabled checked, selected
定时器--(间歇函数)
作用:
每隔一段时间需要自动执行一段代码,不需要我们手动去触发
运用:网页中的倒计时
- 定时器函数有两种:
- 定时器
- 延时器
作用:能够使用定时器函数重复执行代码
定时器函数可以开启和关闭定时器:
setInterval(函数,间隔时间)
作用:每隔一段时间调用这个函数
间隔时间单位是毫秒
function repeat(){
console.log("万少今天真帅")
}
setInterval(repeat,1000) //一秒调用一次
注意:
函数名字不需要加括号
定时器返回的是一个id数字 句柄,可以用来关闭定时器
2,关闭定时器
let 变量名 = setIterval(函数,间隔时间)
clearInterval(变量名)
一般不会刚创建就停止,而是满足一定条件再停止
注意:
函数名字不需要加括号
定时器返回的是一个id数字
小结:
定时器函数有什么作用? 可以根据时间自动重复执行某些代码 定时器函数如何开启? setInterval(函数名, 时间) 定时器函数如何关闭?
句柄 let 变量名 = setInterval(函数,间隔时间)
clearInterval(变量名)
定时器的使用和清理
<!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>10定时器的使用和清除</title>
</head>
<body>
<script>
/*
每隔一秒执行一次函数 时间单位 毫秒 1000毫秒 = 1 秒
1,语法:
前面有函数 调用函数 setInterval(匿名函数,时间)
*/
// function repeat(){
// document.write("我喜欢你")
// }
// setInterval(repeat,5000) //注意 : 函数不带括号 setInterval(匿名函数,时间)
// 2,语法:
setInterval(function () {
document.write('打印');
}, 1000);
// 定时器清理 用 句柄(end) let end = setInterval(function () {
// document.write('打印');
// }, 1000);
// clearInterval(句柄end) 句柄关闭定时器
</script>
</body>
</html>
案例-倒计时60秒定时器关闭-按钮可以点击
<button disabled>倒计时<span>60</span>秒</button>
<script>
let btn = document.getElementsByTagName("button")
let num = document.getElementsByTagName("span")
console.log('btn -----> ', btn);
// let num = document.querySelector('button')
console.log('num -----> ', num);
let end = setInterval(() => {
num[0].innerText--
if(num[0].innerText == 0){
console.log('1111 -----> ', 1111);
clearInterval(end)
btn[0].disabled = false
}
}, 60);
简易轮播图案例:
<!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>0-0轮播图案例</title>
<style>
*{
padding: 0;
margin: 0;
box-sizing: border-box;
}
.box{
margin: 50px auto;
position: relative;
width: 700px;
height: 320px;
background-color: #ff0;
display: flex;
flex-direction: column;
}
ul{
width: 700px;
height: 320px;
overflow: hidden;
}
ul li{
width: 700px;
height: 320px;
display: none;
list-style: none;
}
img{
width: 100%;
}
.active{
display: block;
}
.title{
width: 100%;
left: 0;
bottom: 0;
background-color: #232c2f;
position: absolute;
color: #8fd40f;
padding: 5px;
display: block;
}
</style>
</head>
<body>
<div class="box">
<ul>
<li class="active">
<img src="./image/b01.jpg" alt="">
</li>
<li>
<img src="./image/b02.jpg" alt="">
</li>
<li>
<img src="./image/b03.jpg" alt="">
</li>
<li>
<img src="./image/b04.jpg" alt="">
</li>
<li>
<img src="./image/b05.jpg" alt="">
</li>
<li>
<img src="./image/b06.jpg" alt="">
</li>
<li>
<img src="./image/b07.jpg" alt="">
</li>
<li>
<img src="./image/b08.jpg" alt="">
</li>
<li>
<img src="./image/b09.jpg" alt="">
</li>
<li>
<img src="./image/b10.jpg" alt="">
</li>
<li>
<img src="./image/b11.jpg" alt="">
</li>
<li>
<img src="./image/b12.jpg" alt="">
</li>
<li>
<img src="./image/b13.jpg" alt="">
</li>
</ul>
<div class="title">第1张图的描述信息</div>
</div>
<script>
let lis = document.querySelectorAll("li")
let title = document.querySelector('.title')
let i = 0
let end = setInterval(() => {
if(i > 12){i = 0}
document.querySelector(".active").classList.remove("active")
lis[i].classList.add("active")
title.innerText = `第 ${i + 1} 张图的描述信息`
i++
}, 1000);
</script>
</body>
</html>
题目
浏览器从上到下解析 , 碰到
3 c BOM 包含 DOM
4 css样式没有//
5, d 变量数字开头错
7 b 数组Array 是引用型类型
8, b if(true)let aaa = 123 console.log(aaa) //报错
a 如果 if 大括号里面只有一行代码 可以省略大括号
if 简写
if(true) console.log("正常")
9,b pop() 删除最后一个 返回删除的元素
11 d num2++ + num1* 2 + num2*2 - 2
在外面定义,报错 ,i全局变量
obj.aaa 直接往里找
引用类型
函数不调用,自己不执行,形参一定是局部变量
转布尔类型 都是true
转布尔类型 都是false 数字0转布尔为false
0 “ ” false undefined NaN null
多行注释不能套多行注释