webapi 介绍
通过对 JavaScript 基础语法的学习,我们已经能够动态地渲染页面内容了。在 webapi 阶段,我们会学习一系列操作页面元素的方法,并能够做出炫酷的页面交互效果
什么是API
API(Application Programming Interface)
: 应用程序接口
在学习前期可以简单地把接口理解为对象中的方法,我们不需要关心接口内部如何实现,只需要调用它们实现需要的功能。 webapi
就是使用 JavaScript 提供的一系列方法去操作页面文档和浏览器
- DOM:文档对象模型
- BOM:浏览器对象模型
接口由官方定义、由各大浏览器厂商实现、最后交给开发者调用
什么是DOM
DOM 的核心思想就是把网页内容当做对象来处理,通过对象的属性和方法对网页内容进行操作(把标签解析成对象,把标签属性解析成对象的属性)。比如:
html
<div id=''box''>我是盒子</div>
最后会被解析成:
js
{
id:"box",
innerHTML="我是盒子"
... ...
}
我们可以使用 console.dir()
打印解析后的对象:
document 是 DOM 的顶级对象,也是页面文档的入口
什么是BOM
BOM 是浏览器对象模型,定义了一套操作浏览器窗口的API
window是 JavaScript 中的顶级对象,包含一些全局属性和方法,调用时可以省略 window
DOM基础操作
获取DOM元素
querySelector
querySelector()
:获取满足条件的第一个元素,该方法返回一个对象
js
const li = document.querySelector(".nav li");
如果没有找到满足条件的元素,返回 null
在使用 querySelector 和类名获取元素时,不要忘了加点!
querySelectorAll
querySelectorAll()
:获取满足条件的所有元素
js
const lis = document.querySelectorAll(".nav li");
该方法返回一个伪数组,数组中每个对象都是一个满足条件的 html 元素
如果没有找到满足条件的元素,返回一个空的伪数组
伪数组:有长度有索引可以遍历,但没有操作数组元素的方法
其他方法
JavaScript 也提供了一些其他获取元素的方法:
在使用这些方法时,不需要书写 CSS 选择器前缀
操作DOM元素
修改元素内容
使用 innerHTML
和 innerText
都可以操作元素内容
innerHTML
:
- 可以解析字符串中的html标签
- 保留字符串中的换行
innerText
:
- 不能解析标签
- 将字符串中的换行解析为一个空格
下面是一个例子:
js
const box = document.querySelector(".box");
const box2 = document.querySelector(".box2");
box.innerText = "<h1>迪丽热巴</h1>";
box2.innerHTML = "<h1>迪丽热巴</h1>";
赋值为空字符串会清空元素中的所有内容
修改元素原有属性
DOM 会把标签解析成对象,把标签属性解析成对象中的属性。因此我们可以直接用 对象.属性=值
的方式修改元素的原有属性
常见的原有属性有:
src
:图片地址href
:链接地址title
:提示文本id
:元素唯一标识
js
// 随机更换图片
let arr = [
"./images/1.png",
"./images/2.png",
"./images/3.png",
"./images/4.png",
];
const img = document.querySelector("img");
const random = Math.floor(Math.random() * arr.length);
img.src = arr[random];
修改元素样式属性
style
语法:元素.style.属性=属性值
js
box.style.width = "300px";
box.style.marginTop = "50px";
box.style.backgroundColor = 'skyblue'
如果样式属性中包含中横线,需要转换为小驼峰命名法
这种方式是直接修改的行内样式,一般在修改单个样式属性时使用
className
当样式属性过多时,style 方式就会变的很繁琐
我们可以把多个样式放到一个 CSS 类选择器中,然后把这个类添加到元素身上,这就是 className 操作样式的核心思想
语法:元素.className=类名字符串
html
<div class="main">123</div>
<script>
const box = document.querySelector(".main");
// box.className = "content"; //错误写法,原有类名被覆盖
box.className = "main content"; // 或 box.className += " content";
</script>
为什么不用 class 获取类名?因为 class 是类关键字,已经被占用了
className 会覆盖原有类名,不推荐使用
classList
相比 className,使用 classList 添加类或许是一个更好的方式
元素.classList.add(类名字符串)
:追加类名元素.classList.remove(类名字符串)
:移除类名元素.classList.toggle(类名字符串)
:切换类名的有无元素.classList.contains(类名字符串)
:判断类名是否存在
classList 不会覆盖已有的类名,推荐使用!
修改表单相关属性
元素.type
:修改表单元素的类型元素.value
:修改表单元素的值元素.checked
:是否选中元素.disabled
:是否禁用
html
<input type="text" name="username" value="abc" />
<button>按钮</button>
<input type="checkbox" name="agree" />
js
// 修改输入框类型和值
const input = document.querySelector("input[name=username]");
input.value = "123";
input.type = "password";
// 禁用按钮
const button = document.querySelector("button");
button.disabled = true;
// 选择按钮
const multSelect = document.querySelector("input[type=checkbox]");
multSelect.checked = true;
修改自定义属性
自定义属性可以暂时存储数据供 JavaScript 使用:
使用 元素.dataset
可以获取元素所有自定义属性的集合(一个对象)
html5 规定自定义属性必须使用
data-
前缀,元素.dataset
返回一个对象,是元素所有自定义属性的集合
定时器
定时器可以每隔一段时间自动执行一次代码:
setInterval(fn,ms)
:间隔定时器,每隔一段时间执行一次setTimeout(fn,ms)
:延迟定时器,等待一段时间后执行一次(仅一次)clearInterval(timer)
:停止一个定时器
js
// 使用定时器在控制台打印3次hello
let num = 0;
let fn = function () {
num++;
if (num >= 3) {
clearInterval(timer);
}
console.log("hello");
};
let timer = setInterval(fn, 1000);
setInterval 和 setTimeout 都是由 window 顶级对象直接调用的
setInterval 和 setTimeout 都会返回一个定时器ID,供 clearInterval 使用
fn 是一个回调函数,在 setInterval 中做参数,不需要加小括号(不是函数调用)
回调函数
一个函数在另一个函数中做参数,这个函数就是回调函数。比如:
回调函数通常是一个匿名函数
综合案例
js
// 初始数据
const sliderData = [
{
url: "./images/slider01.jpg",
title: "对人类来说会不会太超前了?",
color: "rgb(100, 67, 68)",
},
... ...
];
// 1.获取元素
const img = document.querySelector(".slider-wrapper img");
const p = document.querySelector(".slider-footer p");
const footer = document.querySelector(".slider-footer");
let i = 0;
function change() {
i++;
i = i >= sliderData.length ? 0 : i;
// 2.更改元素样式
img.src = sliderData[i].url;
p.innerHTML = sliderData[i].title;
footer.style.backgroundColor = sliderData[i].color;
// 移动小圆点
document
.querySelector(`.slider-indicator li.active`)
.classList.remove("active");
const li = document.querySelector(
`.slider-indicator li:nth-child(${i + 1})`
);
li.classList.add("active");
}
// 定时器自动轮播
setInterval(change, 1000);