黑马程序员前端AJAX入门到实战全套教程,包含学前端框架必会的(ajax+node.js+webpack+git),一套全覆盖
文章目录
-
- 框架前置导学
- AJAX-Day01-01.AJAX入门与axios使用
- AJAX-Day01-02.认识URL
- AJAX-Day01-03.查询参数
- AJAX-Day01-04.案例_地区查询
- AJAX-Day01-05.常用请求方法和数据提交
- AJAX-Day01-06.axios错误处理
- AJAX-Day01-07.HTTP协议_请求报文
- AJAX-Day01-08.请求报文-错误排查
- AJAX-Day01-09.HTTP协议_响应报文
- AJAX-Day01-10.接口文档
- AJAX-Day01-11.案例_登录
- AJAX-Day01-12.案例_登录_提示消息
- AJAX-Day01-13.form-serialize使用
- AJAX-Day01-14.案例_登录_整合form-serialize插件
- AJAX-Day02-01.案例_图书管理_介绍_V1.2
- AJAX-Day02-02.Bootstrap弹框使用_属性控制显示和隐藏_V1.6(弹框modal)
- AJAX-Day02-03.Bootstrap弹框使用_JS控制显示和隐藏_V1.4
- AJAX-Day02-04.案例_图书管理_渲染列表_V1.4
- AJAX-Day02-05.案例_图书管理_新增图书_V1.4
- AJAX-Day02-06.案例_图书管理_删除图书_V1.1
- AJAX-Day02-07.案例_图书管理_编辑图书_弹框准备_V1.2
- AJAX-Day02-08.案例_图书管理_编辑图书_数据回显_V1.1
- AJAX-Day02-09.案例_图书管理_编辑图书_保存修改_V1.1
- AJAX-Day02-10.案例_图书管理_总结_V1.0
- AJAX-Day02-11.图片上传_V1.1
- AJAX-Day02-12.案例_网站-更换背景_V1.1
- AJAX-Day02-13.案例_个人信息设置_介绍
- AJAX-Day02-14.案例_个人信息设置_信息渲染
- AJAX-Day02-15.案例_个人信息设置_头像修改
- AJAX-Day02-16.案例_个人信息设置_信息修改
- AJAX-Day02-17.案例_个人信息设置_提示框
- AJAX-Day03-01.XMLHttpRequest_基本使用
- AJAX-Day03-02.XMLHttpRequest_查询参数
- AJAX-Day03-03.案例_地区查询
- AJAX-Day03-04.XMLHttpRequest_数据提交
- AJAX-Day03-05.认识_Promise
- AJAX-Day03-06.认识_Promise的三种状态
- AJAX-Day03-07.使用Promise和XHR获取省份列表
- AJAX-Day03-08.封装_简易axios_获取省份列表(用xhs模拟实现axios)
- AJAX-Day03-09.封装_简易axios_获取地区列表(支持查询参数传递)
- AJAX-Day03-10.封装_简易axios_携带请求体数据(data)
- AJAX-Day03-11.案例_天气预报_获取默认数据
- AJAX-Day03-12.案例_天气预报_展示默认数据
- AJAX-Day03-13.案例_天气预报_搜索城市列表
- AJAX-Day03-14.案例_天气预报_展示城市天气
- AJAX-Day04-01.同步代码和异步代码
- AJAX-Day04-02.回调函数地狱
- AJAX-Day04-03.Promise_链式调用
- AJAX-Day04-04.Promise_链式调用_解决回调地狱
- AJAX-Day04-05.async函数和await_解决回调函数地狱
- AJAX-Day04-06.async函数和await_错误捕获
- AJAX-Day04-07.事件循环EventLoop
- AJAX-Day04-08.事件循环_练习
- AJAX-Day04-09.微任务与宏任务
- AJAX-Day04-10.事件循环经典面试题
- AJAX-Day04-11.Promise.all静态方法
- AJAX-Day04-12.案例_商品分类
- AJAX-Day04-13.案例_学习反馈_省份菜单
- AJAX-Day04-14.案例_学习反馈_城市菜单
- AJAX-Day04-15.案例_学习反馈_地区菜单
- AJAX-Day04-16.案例_学习反馈_提交数据
- 项目-01.项目介绍
- 项目-02.项目准备
- 项目-03.验证码登录
- 项目-04.验证码登录流程
- 项目-05.token的介绍和权限访问控制
- 项目-06.个人信息设置和axios请求拦截器(发起请求之前,触发的配置函数,对请求参数进行额外配置)
- 项目-07.axios响应拦截器和身份验证失败
- 项目-08.优化axios响应结果(封装时嵌套了多层data,有点重复,解析时去掉一层data)
- 项目-09.发布文章-富文本编辑器
- 项目-10.发布文章-频道列表
- 项目-11.发布文章-封面设置
- 项目-12.发布文章-收集并保存
- 项目-13.内容管理-文章列表展示
- 项目-14.内容管理-筛选功能
- 项目-15.内容管理-分页功能
- 项目-16.内容管理-删除功能
- 项目-17.内容管理-删除最后一条
- 项目-18.内容管理-编辑文章-回显
- 项目-19.内容管理-编辑文章-保存
- 项目-20.退出登录
框架前置导学
AJAX-Day01-01.AJAX入门与axios使用
什么是AJAX
如何使用AJAX
使用axios获取数据案例
axios语法
尝试获取数据
http://hmajax.itheima.net/api/province
代码示例
<!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>01.AJAX概念和axios使用</title>
</head>
<body>
<p class="my-p"></p>
<!-- axios库地址 -->
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<!-- 省份数据地址 -->
<!-- 目标: 使用axios库获取省份列表数据,展示到页面上 -->
<script>
axios({
url: 'http://hmajax.itheima.net/api/province'
}).then(response => {
console.log(response)
console.log(response.data.list)
console.log(response.data.list.join('<br>'))
// 在这里处理数据并展示到页面上
document.querySelector('.my-p').innerHTML = response.data.list.join('<br>')
})
.catch(error => {
console.error('获取省份列表失败:', error);
});
</script>
</body>
</html>
AJAX-Day01-02.认识URL
什么是url?(Uniform Resource Locator 统一资源定位符)
url组成
协议
域名
资源路径
代码示例
<!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>01.AJAX概念和axios使用</title>
</head>
<body>
<p class="my-p"></p>
<!-- axios库地址 -->
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<!-- 省份数据地址 -->
<!-- 目标: 使用axios库获取省份列表数据,展示到页面上 -->
<script>
axios({
url: 'http://hmajax.itheima.net/api/news'
}).then(response => {
console.log(response)
console.log(response.data.data)
})
.catch(error => {
console.error('获取新闻数据失败:', error);
});
</script>
</body>
</html>
AJAX-Day01-03.查询参数
url查询参数
代码示例
<!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>01.AJAX概念和axios使用</title>
</head>
<body>
<p class="my-p"></p>
<!-- axios库地址 -->
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<!-- 省份数据地址 -->
<!-- 目标: 使用axios库获取省份列表数据,展示到页面上 -->
<script>
axios({
url: 'http://hmajax.itheima.net/api/city',
params: {
pname: '河北省'
}
}).then(response => {
console.log(response)
document.querySelector('.my-p').innerHTML = response.data.list.join('<br>')
})
.catch(error => {
console.error('获取城市数据失败:', error);
});
</script>
</body>
</html>
AJAX-Day01-04.案例_地区查询
查询某个省某个城市所有地区
查询某个省内某个城市的所有地区:
http://hmajax.itheima.net/api/area
http://hmajax.itheima.net/api/area?pname=%E7%A6%8F%E5%BB%BA%E7%9C%81&cname=%E5%8E%A6%E9%97%A8%E5%B8%82
代码示例
查询某个省内某个城市的所有地区:http://hmajax.itheima.net/api/area
查询参数名:
- pname: 省份名
- cname: 城市名
帮我改造代码,用户可输入查询省份和城市,点击查询按钮,然后将返回的地区列表展示出来。
参考文章:黑马node.js教程(nodejs教程)——AJAX-Day01-04.案例_地区查询——查询某个省某个城市所有地区(代码示例)
AJAX-Day01-05.常用请求方法和数据提交
常用请求方法
数据提交场景
get请求方法示例(axios配置)
场景示例:注册账号——数据提交
示例代码
<!DOCTYPE html> <!-- 文档类型声明,告诉浏览器这是一个HTML5文档 -->
<html lang="en"> <!-- HTML根元素,设置文档语言为英语 -->
<head> <!-- 头部区域,包含文档的元数据 -->
<meta charset="UTF-8"> <!-- 设置文档字符编码为UTF-8,支持多种语言字符 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <!-- 兼容模式设置,使用最新的IE浏览器渲染模式 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- 视口设置,使网页在移动设备上正确显示 -->
<title>提交信息</title> <!-- 网页标题,显示在浏览器标签页上 -->
</head>
<body> <!-- 文档主体,包含页面的可见内容 -->
<button class="btn">注册用户</button>
<!-- axios库地址,引入axios HTTP请求库 -->
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script> <!-- JavaScript代码开始 -->
document.querySelector('.btn').addEventListener('click', () => {
axios({
url: 'http://hmajax.itheima.net/api/register',
method: 'post',
data: {
username: 'itheimaa78944rtert',
password: '123456',
}
}).then(response => {
console.log(response.data)
})
})
</script> <!-- JavaScript代码结束 -->
</body>
</html> <!-- HTML文档结束 -->
AJAX-Day01-06.axios错误处理
浏览器产生的错误信息&接口返回的错误信息
示例代码
<!DOCTYPE html> <!-- 文档类型声明,告诉浏览器这是一个HTML5文档 -->
<html lang="en"> <!-- HTML根元素,设置文档语言为英语 -->
<head> <!-- 头部区域,包含文档的元数据 -->
<meta charset="UTF-8"> <!-- 设置文档字符编码为UTF-8,支持多种语言字符 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <!-- 兼容模式设置,使用最新的IE浏览器渲染模式 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- 视口设置,使网页在移动设备上正确显示 -->
<title>提交信息</title> <!-- 网页标题,显示在浏览器标签页上 -->
</head>
<body> <!-- 文档主体,包含页面的可见内容 -->
<button class="btn">注册用户</button>
<!-- axios库地址,引入axios HTTP请求库 -->
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script> <!-- JavaScript代码开始 -->
document.querySelector('.btn').addEventListener('click', () => {
axios({
url: 'http://hmajax.itheima.net/api/register',
method: 'post',
data: {
username: 'itheimaa78944rtert',
password: '123456',
}
}).then(response => {
console.log(response.data)
}).catch(error => {
console.log(error)
console.log('错误信息:', error.response.data.message)
alert('注册失败:' + error.response.data.message)
console.error('注册失败:', error);
})
})
</script> <!-- JavaScript代码结束 -->
</body>
</html> <!-- HTML文档结束 -->
AJAX-Day01-07.HTTP协议_请求报文
请求报文
请求报文组成
AJAX-Day01-08.请求报文-错误排查
错误排查
这还能直接改属性把密码显示为明文的,厉害!
利用浏览器元素选择来快速确定querySelector目标
AJAX-Day01-09.HTTP协议_响应报文
响应报文
HTTP响应状态码
AJAX-Day01-10.接口文档
定义
https://apifox.cn/apidoc/project-1937884/api-49760219
AJAX-Day01-11.案例_登录
定义文档
小技巧:浏览器直接复制属性路径可粘贴到代码中
AJAX-Day01-12.案例_登录_提示消息
提示框显示由“show”类名控制
提示框需求(成功或失败需显示不同文字和样式,需要自动隐藏(通过添加定时器))
通过给控件class列表增加或删除“show”类名,控制控件的隐藏和显示
通过封装提示框函数提高可复用性
AJAX-Day01-13.form-serialize使用
form-serialize插件(快速搜集表单元素的值)
form-serialize插件提取键名与表达元素name相同
hash参数(true解析为js对象,false解析为查询字符串)
empty参数(为true是允许空值,false不获取空值(键都没了))
true:
false:
代码示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Form Serialize Example</title>
</head>
<body>
<form id="myForm">
<label for="name">Name:</label>
<input type="text" id="name" name="name">
<br>
<label for="email">Email:</label>
<input type="email" id="email" name="email">
<br>
<button type="submit">Submit</button>
</form>
<script src="https://cdn.jsdelivr.net/npm/form-serialize@0.7.2/index.js"></script>
<!-- <script src="https://unpkg.com/form-serialize@0.7.2/dist/form-serialize.min.js"></script> -->
<script>
document.getElementById('myForm').addEventListener('submit', function (event) {
event.preventDefault(); // 阻止表单的默认提交行为
var form = document.getElementById('myForm');
var serializedData = serialize(form, { hash: true, empty: true });
console.log(serializedData); // 在控制台打印出序列化的表单数据
});
</script>
</body>
</html>
AJAX-Day01-14.案例_登录_整合form-serialize插件
AJAX-Day02-01.案例_图书管理_介绍_V1.2
AJAX-Day02-02.Bootstrap弹框使用_属性控制显示和隐藏_V1.6(弹框modal)
Bootstrap弹框
bootstrap的modal弹框:添加modal类名(默认隐藏)
代码示例
<!DOCTYPE html>
<html lang="en">
<head>
<!-- 设置文档的字符编码为UTF-8 -->
<meta charset="UTF-8">
<!-- 设置视口,以确保页面在移动设备上显示良好 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- 页面标题 -->
<title>Bootstrap Modal Demo</title>
<!-- 引入Bootstrap的CSS文件 -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-5">
<!-- 按钮,用于打开弹框 -->
<!-- class="btn btn-primary":使用Bootstrap的按钮样式类 -->
<!-- btn:提供基本按钮样式 -->
<!-- btn-primary:提供主要颜色样式,通常为蓝色 -->
<!-- data-bs-toggle="modal":指定点击按钮时触发的行为是打开模态框 -->
<!-- data-bs-target="#myModal":指定要打开的模态框的ID -->
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#myModal">
显示弹框
</button>
<!-- 模态框 -->
<!-- class="modal fade":定义模态框,并使用fade类实现淡入淡出效果 -->
<!-- id="myModal":模态框的唯一标识符,用于与按钮的data-bs-target属性匹配 -->
<div class="modal fade" id="myModal">
<div class="modal-dialog">
<div class="modal-content">
<!-- 模态框头部 -->
<div class="modal-header">
<!-- 模态框标题 -->
<h4 class="modal-title">弹框标题</h4>
<!-- 关闭按钮 -->
<!-- data-bs-dismiss="modal":点击按钮时关闭模态框 -->
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<!-- 模态框主体 -->
<div class="modal-body">
<!-- 显示在模态框中的信息 -->
这是弹框中的信息展示。
</div>
<!-- 模态框底部 -->
<div class="modal-footer">
<!-- 关闭按钮 -->
<!-- data-bs-dismiss="modal":点击按钮时关闭模态框 -->
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">关闭</button>
<!-- 保存按钮 -->
<!-- 目前没有绑定具体功能,可以根据需要添加事件处理 -->
<button type="button" class="btn btn-primary">保存</button>
</div>
</div>
</div>
</div>
</div>
<!-- 引入Bootstrap的JavaScript文件 -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
AJAX-Day02-03.Bootstrap弹框使用_JS控制显示和隐藏_V1.4
bootstrap弹框(如果不需要在显示隐藏弹框时做操作,比如获取表达属性值,可以通过属性控制弹框显示或隐藏;否则可以通过JS控制弹框显示或隐藏)
AJAX-Day02-04.案例_图书管理_渲染列表_V1.4
AJAX-Day02-05.案例_图书管理_新增图书_V1.4
AJAX-Day02-06.案例_图书管理_删除图书_V1.1
AJAX-Day02-07.案例_图书管理_编辑图书_弹框准备_V1.2
AJAX-Day02-08.案例_图书管理_编辑图书_数据回显_V1.1
AJAX-Day02-09.案例_图书管理_编辑图书_保存修改_V1.1
AJAX-Day02-10.案例_图书管理_总结_V1.0
AJAX-Day02-11.图片上传_V1.1
图片上传
change事件
参考文章:JavaScript图片上传并展示(change事件)
AJAX-Day02-12.案例_网站-更换背景_V1.1
AJAX-Day02-13.案例_个人信息设置_介绍
AJAX-Day02-14.案例_个人信息设置_信息渲染
AJAX-Day02-15.案例_个人信息设置_头像修改
AJAX-Day02-16.案例_个人信息设置_信息修改
AJAX-Day02-17.案例_个人信息设置_提示框
AJAX-Day03-01.XMLHttpRequest_基本使用
XMLHttpRequest原理(axios 内部采用 XMLHttpRequest与服务器交互)
使用XMLHttpRequest
XMLHttpRequest请求示例
总结
AJAX-Day03-02.XMLHttpRequest_查询参数
定义
示例
参考文章:HTTP查询参数示例(XMLHttpRequest查询参数)(带查询参数的HTTP接口示例——以python flask接口为例)flask查询接口
AJAX-Day03-03.案例_地区查询
AJAX-Day03-04.XMLHttpRequest_数据提交
请求头Content-Type设置为application/json
参考文章:XHR数据提交(XMLHttpRequest数据提交demo)HTTP数据提交、Content-Type:application/json(账号注册示例)json提交、json数据提交
AJAX-Day03-05.认识_Promise
定义与语法
语法
resolve和reject为连个回调函数。
参考文章:JavaScript promise介绍(表示一个异步操作的最终完成或失败及其结果值)(待定pending、已兑现fulfilled、已拒绝rejected)async、await
总结
AJAX-Day03-06.认识_Promise的三种状态
三种状态
promise对象刚创建是pending状态(待定)
成功执行将变成fulfilled状态(已兑现)
执行失败将变成rejected状态(已拒绝)
AJAX-Day03-07.使用Promise和XHR获取省份列表
需求
实现细节
参考文章:JavaScript promise实例——通过XHR获取省份列表
AJAX-Day03-08.封装_简易axios_获取省份列表(用xhs模拟实现axios)
需求
实现
代码略。
AJAX-Day03-09.封装_简易axios_获取地区列表(支持查询参数传递)
思路(使用URLSearchParams对象将config.json中的param转换成url查询字符串)
代码示例
AJAX-Day03-10.封装_简易axios_携带请求体数据(data)
原理
代码(注意JSON.stringify和setRequestHeader)
AJAX-Day03-11.案例_天气预报_获取默认数据
AJAX-Day03-12.案例_天气预报_展示默认数据
AJAX-Day03-13.案例_天气预报_搜索城市列表
AJAX-Day03-14.案例_天气预报_展示城市天气
AJAX-Day04-01.同步代码和异步代码
定义
AJAX-Day04-02.回调函数地狱
定义
演示
发现错误并没有被catch捕获到。
总结
AJAX-Day04-03.Promise_链式调用
概念
示例
AJAX-Day04-04.Promise_链式调用_解决回调地狱
参考文章:JS Promise链式调用介绍(处理多个异步操作)(Promise对象).then()、.catch()、Promise.all并行处理、Promise.race竞态模式
AJAX-Day04-05.async函数和await_解决回调函数地狱
定义
AJAX-Day04-06.async函数和await_错误捕获
try…catch
AJAX-Day04-07.事件循环EventLoop
认识-事件循环(EventLoop)
结果都是132
定义
总结
AJAX-Day04-08.事件循环_练习
练习
AJAX-Day04-09.微任务与宏任务
概念
执行顺序
总结
AJAX-Day04-10.事件循环经典面试题
测试题
结果:1756234
注意对于定时器,更快到达延迟时间的会先被推入宏任务队列执行。
确实有点复杂,需要明确哪些会被推到宏任务队列,那些会被推到微任务队列,然后根据“先清空微任务队列,再执行宏任务队列”的原则执行
具体看视频吧:https://www.bilibili.com/video/BV1MN411y7pw/?p=56
AJAX-Day04-11.Promise.all静态方法
定义:合并多个 Promise 对象,等待所有同时成功完成(或某一个失败),做后续逻辑
语法
代码案例
AJAX-Day04-12.案例_商品分类
AJAX-Day04-13.案例_学习反馈_省份菜单
AJAX-Day04-14.案例_学习反馈_城市菜单
AJAX-Day04-15.案例_学习反馈_地区菜单
AJAX-Day04-16.案例_学习反馈_提交数据
项目-01.项目介绍
链接
项目-02.项目准备
使用技术
1. 基于 Bootstrap 搭建网站标签和样式
2. 集成 wangEditor 插件实现富文本编辑器
3. 使用原生 JS 完成增删改查等业务
4. 基于 axios 与黑马头条线上接口交互
5. 使用 axios 拦截器进行权限判断
项目准备
项目目录管理
项目-03.验证码登录
目标以及基地址的设置(方便维护)
项目-04.验证码登录流程
代码介绍
bootstrap警告框插件的使用
验证码登录流程
项目-05.token的介绍和权限访问控制
token介绍
token的使用
总结
项目-06.个人信息设置和axios请求拦截器(发起请求之前,触发的配置函数,对请求参数进行额外配置)
在请求拦截器统一设置公共headers选项(统一设置请求头)
图片里好像写错了,不是location.getItem(),而是localStorage.getItem()。
代码示例
总结
项目-07.axios响应拦截器和身份验证失败
定义
示例:拦截器中判断状态码token失效然后清空本地存储并跳转到登录页面