Search K
Appearance
Appearance
如下对象取值的方式哪个正确?
let obj = {
name: '黑马',
};obj.aobj()a正确的取值方式是 obj.name。在给定的对象中,属性名是 name,因此应该使用点符号 (.) 来访问该属性的值。
哪个赋值会让浏览器解析成标签显示?
let ul = document.querySelector('#ul');
let str = `<span>我是span标签</span>`;ul.innerText = strul.innerHTML = strul.innerText = str) 会将字符串 str 的内容直接作为纯文本插入到 ul 元素中,而不会解析为 HTML 标签。ul.innerHTML = str) 将字符串 str 的内容插入到 ul 元素的内部,这将被浏览器解析为 HTML 标签并显示在页面上。 innerHTML 属性允许在元素内插入 HTML 标记。哪个是获取输入框值的方式?
let theInput = document.querySelector('#input');theInput.innerHTMLtheInput.valuetheInput.value) 用于获取输入框的值。value 属性用于表示输入框的当前值,而不同于 innerHTML,后者用于获取或设置元素内的 HTML 内容。哪个是用于获取标签内容?
let theP = document.querySelector('#p');theP.innerHTML = '内容'theP.innerHTMLtheP.innerHTML) 表示获取元素 theP 的内部 HTML 内容。这将返回标签内的所有内容,包括嵌套的 HTML 标签。theP.innerHTML = '内容') 是用于设置元素的 HTML 内容,而不是获取。哪个是数组的映射方法?
arr.forEacharr.maparr.map) 是用于在数组的每个元素上调用一个提供的函数,并返回一个新数组,包含每次函数调用的结果。这允许你对数组的每个元素进行转换、修改或其他操作,并生成一个新的数组。数组转字符串并指定拼接符的是哪个?
arr.join()arr.split()arr.join()。答案是 A。arr.join()) 是用于将数组的所有元素连接成一个字符串。你可以通过在括号内指定拼接符来定义连接的方式,例如 arr.join(', ') 将数组元素用逗号和空格连接起来。arr.split()) 是用于将字符串分割为数组的方法,并不适用于将数组转换为字符串。函数传参的方式哪个是正确的?
function showAlert(msg, className) {}showAlert('消息', '类名')showAlert()showAlert('消息', '类名')) 是正确的,因为函数 showAlert 定义了两个参数 msg 和 className,在调用函数时,传递相应数量和顺序的参数,即 '消息' 和 '类名'。showAlert()) 是不正确的,因为函数 showAlert 需要两个参数,而在这个调用中没有提供任何参数。函数调用应该符合函数定义的参数数量和顺序。以下哪套代码可以实现对象属性的简写?
const username = '老李';
let obj = {
username: username,
};const user = '老李';
let obj = {
username: user,
};以下代码的值是多少?
const age = 10;
const result = age > 18 ? '成年了' : '未成年';'成年了''未成年'age > 18,如果条件为真,则结果是 '成年了',否则结果是 '未成年'。age 是 10,不大于 18,所以条件为假,因此结果是 '未成年'。'未成年'。以下哪个方法可以添加一个额外类名?
标签对象.classList.add()标签对象.classList.contains()标签对象.classList.add()) 表示向元素的类列表中添加一个或多个类名。这是用于添加额外类名的方法。标签对象.classList.contains()) 则用于检查元素的类列表中是否包含特定的类名。学习目标
学习目标
Fetch API 标准取代。
引入 axios.js 文件到自己的网页中
<!-- 360 -->
<script
crossorigin="anonymous"
integrity="sha512-JWQFV6OCC2o2x8x46YrEeFEQtzoNV++r9im8O8stv91YwHNykzIS2TbvAlFdeH0GVlpnyd79W0ZGmffcRi++Bw=="
src="https://lib.baomitu.com/axios/1.6.3/axios.min.js"></script>
<!-- cdnjs -->
<script
src="https://cdnjs.cloudflare.com/ajax/libs/axios/1.6.3/axios.min.js"
integrity="sha512-JWQFV6OCC2o2x8x46YrEeFEQtzoNV++r9im8O8stv91YwHNykzIS2TbvAlFdeH0GVlpnyd79W0ZGmffcRi++Bw=="
crossorigin="anonymous"
referrerpolicy="no-referrer"></script>
<!-- jsDelivr -->
<script
src="https://cdn.jsdelivr.net/npm/axios@1.6.3/dist/axios.min.js"
integrity="sha256-OgjfiL+Y/3OY7dtKrPY7eizu+Zt+p9dWsAWROQsfCKU="
crossorigin="anonymous"></script>
<!-- unpkg -->
<script src="https://unpkg.com/axios@1.6.3/dist/axios.min.js"></script>明确 axios 函数的使用语法
axios({
url: '目标资源地址',
}).then((result) => {
// 对服务器返回的数据做后续处理
});注意
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>01 axios 使用 - 获取省份列表数据</title>
</head>
<body>
<p class="province-list"></p>
<!-- <script src="https://lib.baomitu.com/axios/1.6.3/axios.min.js"></script> -->
<script src="./js/axios.min.js"></script>
<script>
var config = {
method: 'get',
// url: 'https://ajax-api.itheima.net/api/province',
url: 'http://hmajax.itheima.net/api/province',
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0'
}
};
axios(config)
.then(response => {
console.log(response.data)
console.log(JSON.stringify(response.data))
// console.log(response.data.data.join(' '))
// document.querySelector('.province-list').innerHTML = response.data.data.join(' ')
console.log(response.data.list.join(' '))
document.querySelector('.province-list').innerHTML = response.data.list.join(' ')
})
</script>
</body>
</html>AJAX 有什么用?
AJAX 如何学:
这一节 axios 体验步骤(语法)?
学习目标
虽然是后端给我的一个地址,但是哪部分标记的是服务器电脑,哪部分标记的是资源呢?所以为了和服务器有效沟通我们要认识一下。
[协议类型]://[服务器地址]:[端口号]/[资源层级 UNIX 文件路径][文件名]?[查询]#[片段 ID][协议类型]://[访问资源需要的凭证信息]@[服务器地址]:[端口号]/[资源层级 UNIX 文件路径][文件名]?[查询]#[片段 ID]https://developer.mozilla.org/zh-CN/search?q=URLhttpsdeveloper.mozilla.org80 (默认端口号可以省略)/zh-CNsearchq=URL#Tip
你可能想到一个 URL 类似普通信件的地址:
http 是协议。它表明了浏览器必须使用何种协议。
它通常都是 HTTP 协议或是 HTTP 协议的安全版,即 HTTPS。Web 需要它们二者之一,但浏览器也知道如何处理其他协议,比如 mailto:(打开邮件客户端)或者 ftp:(处理文件传输),所以当你看到这些协议时,不必惊讶。
HTTP 协议类型
HTTP (The HyperText Transfer Protocol,超文本传输协议) 是用于在 Web 上传输超媒体文件的底层 协议 ,最典型场景的是在浏览器和服务器之间传递数据,以供人们浏览。现行的 HTTP 标准的版本是 HTTP/2。
http:// 称为 schema,是 URI 的组成部分,一般位于网络地址的开头。以 https://developer.mozilla.org 为例,该地址说明请求文档时使用 HTTP 协议;这里的 https 代指 HTTP 协议的安全版本,即 SSL (或称 TLS)
HTTP 是基于文本的 (所有的通信都以纯文本的形式进行) 以及无状态的 (当前通信状态不会发现以前的通信状态),该特性极大方便了在 www 上浏览网页的人。除此之外,HTTP 也可以用于构建服务器之间交互的 REST web 服务,以及使得网站内容更加动态化的 AJAX 请求。
HTTPS 协议类型
www.example.com 是域名。它表明正在请求哪个 Web 服务器。或者,可以直接使用IP address,但是因为它不太方便,所以它不经常在网络上使用。:80 是端口。它表示用于访问 Web 服务器上的资源的技术“门”。如果 Web 服务器使用 HTTP 协议的标准端口(HTTP 为 80,HTTPS 为 443)来授予其资源的访问权限,则通常会被忽略。否则是强制性的。/path/to/myfile.html 是网络服务器上资源的路径。在 Web 的早期阶段,像这样的路径表示 Web 服务器上的物理文件位置。?key1=value1&key2=value2 是提供给网络服务器的额外参数。这些参数是用 & 符号分隔的键/值对列表。#SomewhereInTheDocument 是资源本身的另一部分的锚点。#后面的部分(也称为片段标识符)从来没有发送到请求的服务器。<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>02 认识 URL - 获取新闻列表</title>
</head>
<body>
<div class="news">
<ul class="news-list"></ul>
</div>
<script src="./js/axios.min.js"></script>
<script>
var config = {
method: 'get',
// url: 'https://ajax-api.itheima.net/api/news',
url: 'http://hmajax.itheima.net/api/news',
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0'
}
};
axios(config)
.then(response => {
console.log(response.data)
console.log(JSON.stringify(response.data.data))
console.log(response.data.data.map(item => item.title).join('<br>'))
document.querySelector('.news-list').innerHTML = response.data.data.map(item => `<li>${item.title}</li>`).join('')
})
</script>
</body>
</html>URL 是什么?
请解释这个 URL,每个部分作用?
http://hmajax.itheima.net/api/news
协议://域名/资源路径
- 协议:http
- 域名:hmajax.itheima.net
- 资源路径:api/news学习目标

http://xxxx.com/xxx/xxx?参数名1=值1&参数名2=值2params 选项即可axios({
url: '目标资源地址',
params: {
参数名: 值,
},
}).then((result) => {
// 对服务器返回的数据做后续处理
});<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>03 URL 查询参数 - 获取河北省下属的城市列表</title>
</head>
<body>
<p class="province-city"></p>
<script src="./js/axios.min.js"></script>
<script>
var config = {
method: 'get',
// url: 'https://ajax-api.itheima.net/api/city',
url: 'http://hmajax.itheima.net/api/city',
params: {
pname: '河北省'
},
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0'
}
};
axios(config)
.then(response => {
console.log(response.data)
console.log(JSON.stringify(response.data))
console.log(response.data.list.join(' '))
document.querySelector('.province-city').innerHTML = response.data.list.join(' ')
})
</script>
</body>
</html>URL 查询参数有什么用?
axios 要如何携带查询参数?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>04 查询地区列表</title>
<!-- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" integrity="sha256-MBffSnbbXwHCuZtgPYiwMQbfE7z+GOZ7fBPCNB06Z98=" crossorigin="anonymous"> -->
<link rel="stylesheet" href="./css/bootstrap.min.css">
</head>
<body class="p-3">
<div class="container">
<h2>04 查询地区列表</h2>
<form class="form-group row" id="editForm">
<div class="mb-3 col">
<label for="province" class="form-label">省份</label>
<select class="form-select" id="province" name="province" onchange="updateCity()">
<option value="北京" selected>北京</option>
<option value="甘肃省">甘肃省</option>
<option value="辽宁省">辽宁省</option>
<option value="河北省">河北省</option>
<option value="西藏自治区">西藏自治区</option>
</select>
</div>
<div class="mb-3 col">
<label for="city" class="form-label">城市</label>
<select class="form-select" id="city" name="city">
<option value="北京市" selected>北京市</option>
</select>
</div>
</form>
<button class="btn btn-primary sel-btn mb-3" type="button">查询</button>
<div class="mt-3 result">
<p>地区列表</p>
<ul class="list-group">
<li class="list-group-item">东城区</li>
</ul>
</div>
</div>
<script src="./js/axios.min.js"></script>
<script>
function updateCity() {
var province = document.getElementById("province").value;
// console.log(province);
var citySelect = document.getElementById("city");
// 清空城市下拉菜单
citySelect.innerHTML = "";
if (province === "北京") {
var cities = ["北京市"];
} else if (province === "甘肃省") {
var cities = ["兰州市", "嘉峪关市", "金昌市", "白银市", "天水市", "武威市", "张掖市", "平凉市", "酒泉市", "庆阳市", "定西市", "陇南市", "临夏回族自治州", "甘南藏族自治州"];
} else if (province === "辽宁省") {
var cities = ["沈阳市", "大连市", "鞍山市", "抚顺市", "本溪市", "丹东市", "锦州市", "营口市", "阜新市", "辽阳市", "盘锦市", "铁岭市", "朝阳市", "葫芦岛市"];
} else if (province === "河北省") {
var cities = ["石家庄市", "唐山市", "秦皇岛市", "邯郸市", "邢台市", "保定市", "张家口市", "承德市", "沧州市", "廊坊市", "衡水市"];
} else if (province === "西藏自治区") {
var cities = ["拉萨市", "昌都地区", "山南地区", "日喀则地区", "那曲地区", "阿里地区", "林芝地区"];
} else {
var cities = [];
}
for (var i = 0; i < cities.length; i++) {
var option = document.createElement("option");
option.text = cities[i];
option.value = cities[i];
citySelect.add(option);
}
}
</script>
<script>
document.querySelector(".sel-btn").onclick = function () {
var province = document.getElementById("province").value;
var city = document.getElementById("city").value;
// console.log(province, city);
var config = {
method: 'get',
// url: `http://hmajax.itheima.net/api/area?pname=${province}&cname=${city}`,
url: `http://hmajax.itheima.net/api/area`,
params: {
pname: province,
cname: city
},
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0'
}
};
axios(config)
.then(response => {
// console.log(response.data)
console.log(JSON.stringify(response.data))
// console.log(response.data.data.join(' '))
// document.querySelector('.province-list').innerHTML = response.data.data.join(' ')
console.log(response.data.list.join(' '))
document.querySelector('.list-group').innerHTML = response.data.list.map(item => `<li class="list-group-item">${item}</li>`).join('')
})
}
</script>
</body>
</html>学习目标
| 请求方法 | 操作 |
|---|---|
| GET | 获取数据 |
| POST | 提交数据 |
| PUT | 修改数据(全部) |
| DELETE | 删除数据 |
| PATCH | 修改数据(部分) |
GET,POST,PUT,DELETE,PATCH(这些都是 HTTP 协议规定的),每个单词对应一种对服务器资源要执行的操作。
GET 请求方法,但是 axios 内部设置了默认请求方法就是 GET,我们就没有写POST 请求方法axios({
url: '目标资源地址',
method: '请求方法',
data: {
参数名: 值,
},
}).then((result) => {
// 对服务器返回的数据做后续处理
});在 axios 语法中要如何处理呢?
使用 axios 的 catch 方法,捕获这次请求响应的错误并做后续处理,语法如下:
axios({
// ...请求选项
})
.then((response) => {
// 处理成功数据
})
.catch((error) => {
// 处理失败错误
});<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>05 数据提交 - 注册账号</title>
<link rel="stylesheet" href="./css/bootstrap.min.css">
</head>
<body class="p-3 mb-2 d-flex justify-content-center align-items-center vh-100">
<div class="container p-5 shadow" style="width: 500px; background-color: #f5f5f5; border-radius: 10px;">
<h2>05 注册账号</h2>
<form class="form-group mt-5">
<div class="mb-3">
<label for="exampleInputUsername" class="form-label">Username</label>
<input type="text" class="form-control" id="username" name="username" placeholder="鸡你太美cxk"
aria-describedby="usernameHelp">
<div id="usernameHelp" class="form-text">中英文和数字组成,最少 8 位。</div>
</div>
<div class="mb-3">
<label for="exampleInputPassword1" class="form-label">Password</label>
<input type="password" class="form-control" id="password" name="password" placeholder="987654321"
aria-describedby="passwordHelp">
<div id="passwordHelp" class="form-text">最少 6 位。</div>
</div>
</form>
<button type="submit" class="btn btn-primary mb-3">注册账号</button>
</div>
<script src="./js/axios.min.js"></script>
<script>
var submitBtn = document.querySelector("button[type=submit]");
submitBtn.addEventListener("click", () => {
var username = document.querySelector("#username").value;
var password = document.querySelector("#password").value;
console.log(username, password);
axios.post("http://hmajax.itheima.net/api/register", {
username,
password
}).then(response => {
console.log(response);
console.log(response.data.message);
alert(response.data.message);
}).catch(error => {
console.log(error);
console.log(error.response.data.message);
alert(error.response.data.message);
});
});
</script>
</body>
</html>请求方法最常用的是哪 2 个,分别有什么作用?
POST 提交数据GET 查询数据axios 的核心配置项?
url:目标资源地址method:请求方法params:查询参数data:提交的数据axios 如何拿到请求响应失败的信息?
.catch 方法捕获学习目标
请求报文:是浏览器按照协议规定发送给服务器的内容,例如刚刚注册用户时,发起的请求报文:

POST /api/register HTTP/1.1
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Content-Length: 48
Content-Type: application/json
DNT: 1
Host: hmajax.itheima.net
Origin: http://127.0.0.1:3000
Proxy-Connection: keep-alive
Referer: http://127.0.0.1:3000/
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36
{"username":"itheima985","password":"987654321"}这里的格式包含:
Chrome 的网络面板如何查看请求体

学习目标
响应报文:是服务器按照协议固定的格式,返回给浏览器的内容

HTTP/1.1 400 Bad Request
Content-Length: 54
Accept-Ranges: bytes
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://127.0.0.1:3000
Connection: keep-alive
Content-Type: application/json; charset=utf-8
Date: Tue, 02 Jan 2024 10:40:27 GMT
Keep-Alive: timeout=4
Proxy-Connection: keep-alive
Server: nginx
Set-Cookie: acw_tc=2f624a4917041920275134830e32870255ed085870f4c45e154d2a290a6754;path=/;HttpOnly;Max-Age=1800
Vary: Origin
X-Content-Type-Options: nosniff
X-Download-Options: noopen
X-Frame-Options: SAMEORIGIN
X-Readtime: 10
X-Xss-Protection: 1; mode=block
{"code":10005,"message":"账号被占用","data":null}响应报文的组成:
| 状态码 | 含义 |
|---|---|
| 1XX | 信息提示类 |
| 2XX | 成功类 |
| 3XX | 重定向类 |
| 4XX | 客户端错误类 |
| 5XX | 服务器端错误类 |
响应报文的组成?
HTTP 响应状态码是做什么的?
.show 类名即可实现弹框的出现/隐藏。<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>06 用户登录</title>
<link rel="stylesheet" href="./css/bootstrap.min.css">
<style>
.alert {
transition: .5s;
opacity: 0;
}
.alert.show {
opacity: 1;
}
</style>
</head>
<body class="p-3 mb-2 d-flex justify-content-center align-items-center vh-100">
<div class="container p-5 shadow-lg bg-body-tertiary rounded-4" style="width: 500px;">
<h2>06 用户登录</h2>
<div class="alert alert-success" role="alert">
提示消息
</div>
<form class="form-group" id="editForm">
<div class="mb-3">
<label for="username" class="form-label">用户名</label>
<input type="text" class="form-control" id="username" name="username" placeholder="请输入用户名">
</div>
<div class="mb-3">
<label for="password" class="form-label">密码</label>
<input type="password" class="form-control" id="password" name="password" placeholder="请输入密码">
</div>
</form>
<button type="botton" class="btn btn-primary btn-login">登录</button>
</div>
<script src="./js/axios.min.js"></script>
<script>
function showAlert(message, isSuccess) {
var alert = document.querySelector(".alert");
alert.classList.add("show");
alert.innerHTML = message;
alertStyle = isSuccess ? "alert-success" : "alert-danger";
alert.classList.add(alertStyle);
setTimeout(() => {
alert.classList.remove("show");
alert.classList.remove(alertStyle);
}, 2000);
}
var loginBtn = document.querySelector(".btn-login");
loginBtn.addEventListener("click", () => {
var username = document.querySelector("#username").value;
var password = document.querySelector("#password").value;
console.log(username, password);
if (username.length < 8) {
console.log("用户名最少 8 位");
showAlert("用户名最少 8 位", false);
return;
}
if (password.length < 6) {
console.log("密码最少 6 位");
showAlert("密码最少 6 位", false);
return;
}
axios.post("http://hmajax.itheima.net/api/login", {
username,
password
}).then(response => {
console.log(response);
console.log(response.data.message);
showAlert(response.data.message, true);
}).catch(error => {
console.log(error);
console.log(error.response.data.message);
showAlert(error.response.data.message, false);
});
});
</script>
</body>
</html>使用 form-serialize 插件,快速收集目标表单范围内表单元素的值
语法:
const form = document.querySelector('form');
const data = serialize(form, {
hash: true, // true - 收集出来的是一个 JS 对象结构,false - 收集出来的是一个查询字符串格式
empty: true, // true - 收集空值,false - 不收集空值
});
console.log(data);
const { username, password } = data;我们什么时候使用 form-serialize 插件?
如何使用 form-serialize 插件?
配置对象中 hash 和 empty 有什么用?
hash 决定是收集为 JS 对象还是查询参数字符串,empty 决定是否收集空值<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>07 用户登录 form-serialize</title>
<link rel="stylesheet" href="./css/bootstrap.min.css">
<style>
.alert {
transition: .5s;
opacity: 0;
}
.alert.show {
opacity: 1;
}
</style>
</head>
<body class="p-3 mb-2 d-flex justify-content-center align-items-center vh-100">
<div class="container p-5 shadow-lg bg-body-tertiary rounded-4" style="width: 500px;">
<h2>07 用户登录 form-serialize</h2>
<div class="alert alert-success" role="alert">
提示消息
</div>
<form class="form-group" id="editForm">
<div class="mb-3">
<label for="username" class="form-label">用户名</label>
<input type="text" class="form-control" id="username" name="username" placeholder="请输入用户名">
</div>
<div class="mb-3">
<label for="password" class="form-label">密码</label>
<input type="password" class="form-control" id="password" name="password" placeholder="请输入密码">
</div>
</form>
<button type="botton" class="btn btn-primary btn-login">登录</button>
</div>
<script src="./js/axios.min.js"></script>
<script src="./js/form-serialize.js"></script>
<script>
function showAlert(message, isSuccess) {
var alert = document.querySelector(".alert");
alert.classList.add("show");
alert.innerHTML = message;
alertStyle = isSuccess ? "alert-success" : "alert-danger";
alert.classList.add(alertStyle);
setTimeout(() => {
alert.classList.remove("show");
alert.classList.remove(alertStyle);
}, 2000);
}
var loginBtn = document.querySelector(".btn-login");
loginBtn.addEventListener("click", () => {
// var username = document.querySelector("#username").value;
// var password = document.querySelector("#password").value;
// console.log(username, password);
const editForm = document.querySelector("#editForm");
const formData = serialize(editForm, { hash: true, empty: true });
console.log(formData);
const { username, password } = formData;
console.log(username, password);
if (username.length < 8) {
console.log("用户名最少 8 位");
showAlert("用户名最少 8 位", false);
return;
}
if (password.length < 6) {
console.log("密码最少 6 位");
showAlert("密码最少 6 位", false);
return;
}
axios.post("http://hmajax.itheima.net/api/login", {
username,
password
}).then(response => {
console.log(response);
console.log(response.data.message);
showAlert(response.data.message, true);
}).catch(error => {
console.log(error);
console.log(error.response.data.message);
showAlert(error.response.data.message, false);
});
});
</script>
</body>
</html>axios 的配置项有哪几个,作用分别是什么?
url: 请求的地址。method: 请求的方法,例如 GET、POST 等。params: 请求的查询参数。data: 请求的请求体数据。headers: 请求的头部信息。接口文档都包含哪些信息?
GET、POST、PUT 等。POST 或者其他有请求体的请求的数据。200、404 等。在浏览器中如何查看查询参数/请求体,以及响应体数据?
Network 标签。Headers 或 Query String Parameters 标签下查看查询参数。Network 标签下选择相应的请求。Headers 标签。Request Payload 或 Form Data 中查看请求体数据。Network 标签下选择相应的请求。Response 标签。Preview 或 Response 部分查看响应体数据。请求报文和响应报文由几个部分组成,每个部分的作用?
在线答题:Day01_AJAX 入门
什么是 AJAX(B)?
AJAX 和 axios 关系(D)?
以下哪个不是 url 组成部分(C)?
axios 传参要求用查询参数,选择哪个配置项(B)?
axios 传参要求用请求体,选择哪个配置项(A)?
以下哪个不是 AJAX 请求的方式(D)?
axios 接收错误结果的方法叫(B)?
以下哪个是浏览器发给服务器的(A)?
服务器返回数据的动作叫(A)?
以下哪个是 HTTP 响应状态码(B)?
目标:完成如下聊天效果
要求:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>08 微信聊天</title>
<link rel="stylesheet" href="./css/font_3736758_vxpb728fcyh.css">
<link rel="stylesheet" href="./css/reset.min.css">
<link rel="stylesheet" href="./css/index.css">
</head>
<body>
<div class="container">
<!-- 头部 -->
<div class="top">
<span>9:41</span>
<div class="icon">
<i class="iconfont icon-xinhao"></i>
<i class="iconfont icon-xinhao1"></i>
<i class="iconfont icon-electricity-full"></i>
</div>
</div>
<!-- 好友名字 -->
<div class="friend_name">
<img src="./assets/arrow-left.png" alt="">
<span>使劲夸夸</span>
</div>
<!-- 聊天区域 -->
<div class="chat">
<ul class="chat_list">
<!-- 他的消息 -->
<li class="left">
<img src="./assets/you.png" alt="">
<span>小宝贝</span>
</li>
<!-- 我的消息 -->
<li class="right">
<span>干啥</span>
<img src="./assets/me.png" alt="">
</li>
</ul>
</div>
<!-- 底部固定 -->
<div class="bottom_div">
<!-- 发送消息 -->
<div class="send_box">
<div class="input_bg">
<input class="chat_input" type="text" placeholder="说点什么吧">
</div>
<img class="send_img" src="./assets/send.png" alt="">
</div>
<!-- 底部黑条 -->
<div class="black_border">
<span></span>
</div>
</div>
</div>
<script src="./js/axios.min.js"></script>
<script src="./js/index.js"></script>
</body>
</html>// 获取机器人回答消息 - 接口地址:http://hmajax.itheima.net/api/robot
// 查询参数名:spoken
// 查询参数值:我说的消息
// 聊天函数:发送消息,获取机器人回答的消息
let chat = () => {
// 获取输入框里的消息
let chatInput = document.querySelector('.chat_input');
// 获取输入框里的内容,去除首尾空格
let chatInputValue = chatInput.value.trim();
console.log(chatInputValue);
// 判断输入框里的内容是否为空
if (chatInputValue.length === 0) {
console.log('输入框里的内容为空!!!');
return;
}
// 获取聊天列表
let chatList = document.querySelector('.chat_list');
// 将输入框里的内容添加到聊天列表,然后清空输入框
chatList.innerHTML += `<li class="right">
<span>${chatInputValue}</span>
<img src="./assets/me.png" alt="">
</li>`;
chatInput.value = '';
// 获取聊天区域
let chatDiv = document.querySelector('.chat');
// 将聊天区域滚动到底部
chatDiv.scrollTop = chatDiv.scrollHeight;
// 发送请求,获取机器人回答的消息
axios.get('http://hmajax.itheima.net/api/robot', {
params: {
spoken: chatInputValue
}
}).then(response => {
// 将机器人回答的消息添加到聊天列表
// console.log(response);
console.log(response.data.data.info.text);
chatList.innerHTML += `<li class="left">
<img src="./assets/you.png" alt="">
<span>${response.data.data.info.text}</span>
</li>`;
// 将聊天区域滚动到底部
chatDiv.scrollTop = chatDiv.scrollHeight;
}).catch(error => {
console.log(error.message);
});
}
// 点击发送
document.querySelector('.send_img').addEventListener('click', chat);
// 敲击回车键
document.querySelector('.chat_input').addEventListener('keyup', e => {
// 判断是否按下回车键
if (e.keyCode === 13) {
chat();
}
})目标:完成如下搜索效果
要求:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- <title>09 必要商城搜索</title> -->
<title>必要商城_大牌品质 工厂价格</title>
<link rel="shortcut icon" href="./favicon.ico" type="image/x-icon" />
<link rel="stylesheet" href="./css/common.css" />
<link rel="stylesheet" href="./css/elementUI.css" />
<link rel="stylesheet" href="./css/global.css" />
<link rel="stylesheet" href="./css/iprHeader.css" />
<link rel="stylesheet" href="./css/new.category.css" />
<link rel="stylesheet" href="./css/new.main.css" />
</head>
<body id="pagebody">
<div class="header header-index"></div>
<!-- 导航栏 -->
<div class="nav nav-index">
<div class="clearfix">
<a href="http://www.biyao.com/home/index.html" class="nav-logo"><img src="./assets/logo.png" height="51" /></a>
<div class="nav-category">
<p><span>全部分类</span><i></i></p>
<div>
<ul class="nav-list">
<li class="nav-main">
<p>
<a href="http://www.biyao.com/classify/category.html?categoryId=621"> 咖啡 </a>
<span>/</span>
<a href="http://www.biyao.com/classify/category.html?categoryId=627"> 饮食 </a>
<span>/</span>
<a href="http://www.biyao.com/classify/category.html?categoryId=691"> 正餐 </a>
</p>
</li>
<li class="nav-main">
<p>
<a href="http://www.biyao.com/classify/category.html?categoryId=279"> 男装 </a>
<span>/</span>
<a href="http://www.biyao.com/classify/category.html?categoryId=294"> 女装 </a>
<span>/</span>
<a href="http://www.biyao.com/classify/category.html?categoryId=35"> 鞋靴 </a>
</p>
</li>
<li class="nav-main">
<p>
<a href="http://www.biyao.com/classify/category.html?categoryId=122"> 眼镜 </a>
<span>/</span>
<a href="http://www.biyao.com/classify/category.html?categoryId=339"> 内衣配饰 </a>
<span>/</span>
<a href="http://www.biyao.com/classify/category.html?categoryId=39"> 运动 </a>
</p>
</li>
<li class="nav-main">
<p>
<a href="http://www.biyao.com/classify/category.html?categoryId=119"> 美妆 </a>
<span>/</span>
<a href="http://www.biyao.com/classify/category.html?categoryId=724"> 个护 </a>
<span>/</span>
<a href="http://www.biyao.com/classify/category.html?categoryId=391"> 母婴 </a>
</p>
</li>
<li class="nav-main">
<p>
<a href="http://www.biyao.com/classify/category.html?categoryId=652"> 生鲜直供 </a>
<span>/</span>
<a href="http://www.biyao.com/classify/category.html?categoryId=51"> 餐厨 </a>
<span>/</span>
<a href="http://www.biyao.com/classify/category.html?categoryId=334"> 电器 </a>
</p>
</li>
<li class="nav-main">
<p>
<a href="http://www.biyao.com/classify/category.html?categoryId=153"> 箱包 </a>
<span>/</span>
<a href="http://www.biyao.com/classify/category.html?categoryId=223"> 数码办公 </a>
<span>/</span>
<a href="http://www.biyao.com/classify/category.html?categoryId=429"> 汽配 </a>
</p>
</li>
<li class="nav-main">
<p>
<a href="http://www.biyao.com/classify/category.html?categoryId=355"> 家纺 </a>
<span>/</span>
<a href="http://www.biyao.com/classify/category.html?categoryId=10"> 家具 </a>
<span>/</span>
<a href="http://www.biyao.com/classify/category.html?categoryId=369"> 家装 </a>
</p>
</li>
<li class="nav-main">
<p>
<a href="http://www.biyao.com/classify/category.html?categoryId=546"> 健康保健 </a>
<span>/</span>
<a href="http://www.biyao.com/classify/category.html?categoryId=685"> 宠物 </a>
<span>/</span>
<a href="http://www.biyao.com/classify/category.html?categoryId=816"> 礼品 </a>
</p>
</li>
</ul>
</div>
</div>
<div class="nav-search">
<p><input type="text" id="searchInp" placeholder="请输入要搜索的商品" /><span id="searchButton"></span></p>
<ul style="">
<li>行李箱</li>
<li>洗面奶</li>
<li>枕头</li>
<li>袜子男夏季</li>
<li>防晒霜</li>
<li>洗发水</li>
<li>伞</li>
<li>香水</li>
<li>眼霜</li>
<li>精华</li>
</ul>
</div>
<div class="nav-tab">
<ul>
<li><a href="http://www.biyao.com/home/index.html">首页</a></li>
<li><a href="http://www.biyao.com/classify/newProduct.html">每日上新</a></li>
<li class="border-l"></li>
<li class="nav-tab-last">
<div class="hover_text">
了解必要
<div class="hover_code gzh">
<span>关注必要微信公众号<br />了解你想了解的一切<br />小必姐在此发福利哦</span>
</div>
</div>
</li>
<li class="nav-tab-last" id="appDownload">下载必要 APP</li>
<li class="border-l"></li>
<li class="nav-tab-last">
<div class="hover_text">
我的必要
<div class="hover_code app">
<span>
扫码下载必要 app
<br />
手机用户独享海量权益
</span>
</div>
</div>
</li>
</ul>
</div>
</div>
</div>
<!-- 右边栏 -->
<ul class="rightBar" style="display: block">
<li class="toggle"></li>
<li class="rightBar-xcx-code toggle novice">
<div class="coupon_red">
<div class="tis">
迎新福利<br />
微信扫码即得
</div>
<div class="rightBar-title">15 元</div>
<div class="count-down" data-time="7200000" id="count-down"></div>
</div>
<div class="rightBar-ercode"></div>
</li>
<li class="rightBar-top" style="display: none"></li>
</ul>
<!-- 分享弹框 -->
<div class="shareCon">
<div>
<p>分享<b></b></p>
<div class="share-main">
<dl>
<dt><img class="share-code" src="./assets/ewm.jpg" /></dt>
<dd>扫一扫,分享给好友!</dd>
</dl>
</div>
</div>
</div>
<!-- 搜索商品列表 -->
<ul class="category-container">
<li>
<ul class="supplier-recommen category-list clearfix">
<!-- 每件搜索商品 -->
<!-- <li>
<a><i><img
src="./js/CghkFmIuDbOAUFjRAADsxoYlvAQ019_360x360.jpg"></i>
<div class="supplier">祖玛珑同原料制造商</div>
<div class="title">【会呼吸的洗发水】风铃草</div>
<div class="priceBox">
<div class="price" price="88"><span
style="color: #F7A701; font-size: 12px; padding-left: 2px;">¥<span
style="font-size:18px;">88</span></span></div>
<div class="mack"><span
style="color:#FB4C81;background:#FFFFFF; border-color:#FB4C81">一起拼</span><span
style="color:#FFFFFF;background:#AB7FD1; border-color:#AB7FD1">精选</span></div>
</div>
<div class="evaluate">653 条好评</div>
</a>
</li> -->
</ul>
</li>
</ul>
<script type="text/javascript" src="./js/jquery-1.8.3.js"></script>
<script type="text/javascript" src="./js/jquery.cookie.js"></script>
<script type="text/javascript" src="./js/md5.js"></script>
<script type="text/javascript" src="./js/masterCommon.js"></script>
<script type="text/javascript" src="./js/jquery.extention.js"></script>
<script type="text/javascript" src="./js/common.js"></script>
<script type="text/javascript" src="./js/qs.min.js"></script>
<script type="text/javascript" src="./js/vue.min.js"></script>
<script type="text/javascript" src="./js/elementUI.min.js"></script>
<script type="text/javascript" src="./js/utils.js"></script>
<script src="./js/smcp.min.js"></script>
<script src="./js/dialog.js"></script>
<script src="./js/axios.min.js"></script>
<script src="./js/index.js"></script>
</body>
</html>// 获取搜索框
let searchInp = document.querySelector('#searchInp');
// 搜索函数:根据搜索框的内容,发送请求,获取数据,渲染到页面上
let search = () => {
// 获取搜索框的内容
let searchContent = searchInp.value;
console.log(searchContent);
// 发送请求
axios
.get('https://hmajax.itheima.net/api-s/searchGoodsList', {
params: {
searchText: searchContent,
page: 1,
everyNum: 16,
},
})
.then((response) => {
// console.log(response);
console.log(response.data.list.data);
// <ul class="supplier-recommen category-list clearfix">
// <!-- 每件搜索商品 -->
// <!-- <li>
// <a><i><img
// src="./lib/CghkFmIuDbOAUFjRAADsxoYlvAQ019_360x360.jpg"></i>
// <div class="supplier">祖玛珑同原料制造商</div>
// <div class="title">【会呼吸的洗发水】风铃草</div>
// <div class="priceBox">
// <div class="price" price="88"><span
// style="color: #F7A701; font-size: 12px; padding-left: 2px;">¥<span
// style="font-size:18px;">88</span></span></div>
// <div class="mack"><span
// style="color:#FB4C81;background:#FFFFFF; border-color:#FB4C81">一起拼</span><span
// style="color:#FFFFFF;background:#AB7FD1; border-color:#AB7FD1">精选</span></div>
// </div>
// <div class="evaluate">653 条好评</div>
// </a>
// </li> -->
// </ul>
// 获取搜索商品列表
let searchGoodsList = document.querySelector('.supplier-recommen');
// console.log(searchGoodsList);
// 判断搜索商品结果是否为空
if (response.data.list.data.length === 0) {
console.log('搜索商品结果为空!!!');
} else {
// 将数据渲染到页面上
searchGoodsList.innerHTML = response.data.list.data.map((item) => `<li>
<a><i><img
src="${item.imageUrl}"></i>
<div class="supplier">祖玛珑同原料制造商</div>
<div class="title">${item.goodsName}</div>
<div class="priceBox">
<div class="price" price="${item.goodsPrice}"><span
style="color: #F7A701; font-size: 12px; padding-left: 2px;">¥<span
style="font-size:18px;">${item.goodsPrice}</span></span></div>
<div class="mack"><span
style="color:#FB4C81;background:#FFFFFF; border-color:#FB4C81">一起拼</span><span
style="color:#FFFFFF;background:#AB7FD1; border-color:#AB7FD1">精选</span></div>
</div>
<div class="evaluate">${item.evalNum} 条好评</div>
</a>
</li>`).join('');
}
}).catch((error) => {
console.log(error.message);
});
};
// 搜索按钮添加点击事件
document.querySelector('#searchButton').addEventListener('click', search);
// 搜索框添加敲击回车键事件
searchInp.addEventListener('keyup', (e) => {
// 判断是否按下回车键
if (e.keyCode === 13) {
search();
}
});<!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>案例_登录</title>
<!-- 引入 bootstrap.css -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css">
<!-- 公共 -->
<style>
html,
body {
background-color: #EDF0F5;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
}
.container {
width: 520px;
height: 540px;
background-color: #fff;
padding: 60px;
box-sizing: border-box;
}
.container h3 {
font-weight: 900;
}
</style>
<!-- 表单容器和内容 -->
<style>
.form_wrap {
color: #8B929D !important;
}
.form-text {
color: #8B929D !important;
}
</style>
<!-- 提示框样式 -->
<style>
.alert {
transition: .5s;
opacity: 0;
}
.alert.show {
opacity: 1;
}
</style>
</head>
<body>
<div class="container">
<h3>欢迎 - 登录</h3>
<!-- 登录结果 - 提示框 -->
<div class="alert alert-success" role="alert">
提示消息
</div>
<!-- 表单 -->
<div class="form_wrap">
<form>
<div class="mb-3">
<label for="username" class="form-label">账号名</label>
<input type="text" class="form-control username">
</div>
<div class="mb-3">
<label for="password" class="form-label">密码</label>
<input type="password" class="form-control password">
</div>
<button type="button" class="btn btn-primary btn-login"> 登 录 </button>
</form>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
// 目标:建议使用 network+console 调试来找到问题(共有 6 处错误)
// 有的问题不会报错,需要自己寻找关键代码来梳理
// 最后完成登录功能
// 获取提示框
const myAlert = document.querySelector('alert')
function alertFn(msg, isSuccess) {
myAlert.classList.add('show')
myAlert.innerText = msg
const bgStyle = isSuccess ? 'alert-success' : 'alert-danger'
myAlert.classList.add(bgStyle)
setTimeout(() => {
myAlert.classList.remove('show')
myAlert.classList.remove(bgStyle)
}, 2000)
}
document.querySelector('.btn-login').addEventListener('click', () => {
const username = document.querySelector('.password').value
const password = document.querySelector('.password').value
if (username.length < 8) {
alertFn('用户名必须大于等于8位', false)
console.log('用户名必须大于等于8位')
return
}
if (password.length < 6) {
alertFn('密码必须大于等于6位', false)
console.log('密码必须大于等于6位')
return
}
axios({
url: 'http://hmajax.itheima.net/api/lgoin',
methods: 'POST',
params: {
user: username,
password
}
}).then(result => {
alertFn(result.data.message, true)
console.log(result)
console.log(result.data.message)
}).catch(error => {
alertFn(error.response.data.message, false)
console.log(error)
console.log(error.response.data.message)
})
})
</script>
</body>
</html>在使用账号密码登录时,控制台报错。
10.排错题.html:89 Uncaught (in promise) TypeError: Cannot read properties of null (reading 'classList')
at alertFn (10.排错题.html:89:15)
at 10.排错题.html:128:9定位代码片段为
// 获取提示框
const myAlert = document.querySelector('alert')
function alertFn(msg, isSuccess) {
myAlert.classList.add('show')
...
}发现 const myAlert = document.querySelector('alert') 出错, 理应为 const myAlert = document.querySelector('.alert')
登录提示 GET http://hmajax.itheima.net/api/lgoin?user=987654321&password=987654321 404 (Not Found) 发现请求体数据有问题以及 url 资源路径有问题 定位代码片段为
const username = document.querySelector('.password').value;
const password = document.querySelector('.password').value;
...
axios({
url: 'http://hmajax.itheima.net/api/lgoin',
methods: 'POST',
params: {
user: username,
password
}发现 username 和 password 都是获取的 .password 的值,应该为
const username = document.querySelector('.username').value;
const password = document.querySelector('.password').value;发现 url 链接中资源路径为 api/lgoin,理应为 api/login
发现 methods 写错了,应该为 method
发现应该为 data 传递请求体数据,而不是 params 传递查询参数
发现请求体参数名应该为 username 和 password,而不是 user 和 password
axios({
url: 'http://hmajax.itheima.net/api/login',
method: 'POST',
data: {
username,
password
}<!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>案例_登录</title>
<!-- 引入 bootstrap.css -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css">
<!-- 公共 -->
<style>
html,
body {
background-color: #EDF0F5;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
}
.container {
width: 520px;
height: 540px;
background-color: #fff;
padding: 60px;
box-sizing: border-box;
}
.container h3 {
font-weight: 900;
}
</style>
<!-- 表单容器和内容 -->
<style>
.form_wrap {
color: #8B929D !important;
}
.form-text {
color: #8B929D !important;
}
</style>
<!-- 提示框样式 -->
<style>
.alert {
transition: .5s;
opacity: 0;
}
.alert.show {
opacity: 1;
}
</style>
</head>
<body>
<div class="container">
<h3>欢迎 - 登录</h3>
<!-- 登录结果 - 提示框 -->
<div class="alert alert-success" role="alert">
提示消息
</div>
<!-- 表单 -->
<div class="form_wrap">
<form>
<div class="mb-3">
<label for="username" class="form-label">账号名</label>
<input type="text" class="form-control username">
</div>
<div class="mb-3">
<label for="password" class="form-label">密码</label>
<input type="password" class="form-control password">
</div>
<button type="button" class="btn btn-primary btn-login"> 登 录 </button>
</form>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
// 目标:建议使用 network+console 调试来找到问题(共有 6 处错误)
// 有的问题不会报错,需要自己寻找关键代码来梳理
// 最后完成登录功能
// 获取提示框
const myAlert = document.querySelector('.alert')
function alertFn(msg, isSuccess) {
myAlert.classList.add('show')
myAlert.innerText = msg
const bgStyle = isSuccess ? 'alert-success' : 'alert-danger'
myAlert.classList.add(bgStyle)
setTimeout(() => {
myAlert.classList.remove('show')
myAlert.classList.remove(bgStyle)
}, 2000)
}
document.querySelector('.btn-login').addEventListener('click', () => {
const username = document.querySelector('.username').value
const password = document.querySelector('.password').value
if (username.length < 8) {
alertFn('用户名必须大于等于8位', false)
console.log('用户名必须大于等于8位')
return
}
if (password.length < 6) {
alertFn('密码必须大于等于6位', false)
console.log('密码必须大于等于6位')
return
}
axios({
url: 'http://hmajax.itheima.net/api/login',
method: 'POST',
data: {
username,
password
}
}).then(result => {
alertFn(result.data.message, true)
console.log(result)
console.log(result.data.message)
}).catch(error => {
alertFn(error.response.data.message, false)
console.log(error)
console.log(error.response.data.message)
})
})
</script>
</body>
</html>GET 和 POST 请求方法的区别?
GET 和 POST 请求方式无区别,本质都是一次 HTTP 请求 (TCP 链接), 而 HTTP 请求报文中都包含请求行,请求头,请求体,我们可以在相应位置携带值给服务器
图解:

但是GET 或 HEAD 请求方式,浏览器会忽略请求体, 但不代表 GET/HEAD 方式无法发送请求体,使用 apifox 等接口调试工具是可以携带请求体的
非要说区别有如下几点
原生 Ajax 的原理?
axios 库是对原生 Ajax 的 XMLHttpRequest 相关语法的封装
AJAX 原理是 XMLHttpRequest 相关语法
而原生 JS 代码参考 面试官:ajax 原理是什么?如何实现?
箭头函数和 function 函数区别?
箭头函数常用做回调函数使用,它无自己的 this, 无 arguments 对象,不能被 new 调用
一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么
浏览器缓存->系统缓存->路由器缓存->ISPDNS 缓存->根域名服务器)HTTP://example.com 重定向到 HTTP://www.example.com)DOM 事件流与事件委托
事件流
事件流:⼜称为事件传播,是⻚⾯中接收事件的顺序。DOM2 级事件规定的事件流包括了 3 个阶段:
事件捕获(Event Capturing)
click 事件,然后再沿着 DOM 树依次向下,直到 <button>。具体顺序如下:事件冒泡(Event Bubbling)
事件开始由最具体的元素(⽂档中嵌套层次最深的那个节点)接收到后,开始逐级向上传播到较为不具体的节点。
<html>
<head>
<title>Document</title>
</head>
<body>
<button>按钮</button>
</body>
</html>如果点击了上面页面代码中的 <button> 按钮,那么该 click 点击事件会沿着 DOM 树向上逐级传播,在途经的每个节点上都会发生,具体顺序如下:
事件委托
事件委托:利用了事件冒泡的机制,在较上层位置的元素上添加一个事件监听函数,来管理该元素及其所有子孙元素上的某一类的所有事件。
示例
<ul id="list">
<li>111</li>
<li>222</li>
<li>333</li>
<li>444</li>
<li>555</li>
</ul>
<script type="text/javascript">
// ⽗元素
var list = document.getElementById('list');
// 为⽗元素绑定事件,委托管理它的所有⼦元素 li 的点击事件
list.onclick = function (event) {
var currentTarget = event.target;
if (currentTarget.tagName.toLowerCase() === 'li') {
alert(currentTarget.innerText);
}
};
</script>适用场景:在绑定大量事件的时候,可以选择事件委托
优点