AJAX 学习笔记(Day3)

「写在前面」

本文为黑马程序员 AJAX 教程的学习笔记。本着自己学习、分享他人的态度,分享学习笔记,希望能对大家有所帮助。推荐先按顺序阅读往期内容:
1. AJAX 学习笔记(Day1)


目录

  • 3 AJAX 原理
    • 3.1 XMLHttpRequest
    • 3.2 Promise
    • 3.3 封装简易版 axios
    • 3.4 案例 - 天气预报

3 AJAX 原理

3.1 XMLHttpRequest

P33:https://www.bilibili.com/video/BV1MN411y7pw?p=33

什么是 XMLHttpRequest:

alt

关系:axios 内部采用 XMLHttpRequest 与服务器交互

alt

使用 XMLHttpRequest 步骤:

  1. 创建 XMLHttpRequest 对象
  2. 配置请求方法和请求 url 地址
  3. 监听 loadend 事件,接收响应结果
  4. 发起请求
alt

XMLHttpRequest - 查询参数

P34:https://www.bilibili.com/video/BV1MN411y7pw?p=34

定义:浏览器提供给服务器的额外信息,让服务器返回浏览器想要的数据

语法:http://xxxx.com/xxx/xxx?参数名1=值1&参数名2=值2

案例:使用XHR携带查询参数,展示某个省下属的城市列表

const xhr = new XMLHttpRequest()
xhr.open('GET', 'http://hmajax.itheima.net/api/city?pname=辽宁省')
xhr.addEventListener('loadend', () => {
console.log(xhr.response)
const data = JSON.parse(xhr.response)
console.log(data)
document.querySelector('.city-p').innerHTML = data.list.join('<br>')
})
xhr.send()

案例:地区查询

P35:https://www.bilibili.com/video/BV1MN411y7pw?p=35

alt

XMLHttpRequest - 数据提交

P36:https://www.bilibili.com/video/BV1MN411y7pw?p=36

步骤和语法:

  1. 没有 axios 了,我们需要自己设置请求头 Content-Type:application/json,来告诉服务器端,我们发过去的内容类型是 JSON 字符串,让他转成对应数据结构取值使用
  2. 没有 axios 了,我们前端要传递的请求体数据,也没人帮我把 JS 对象转成 JSON 字符串了,需要我们自己转换
  3. 原生 XHR 需要在 send 方法调用时,传入请求体携带
const xhr = new XMLHttpRequest()
xhr.open('请求方法', '请求url网址')
xhr.addEventListener('loadend', () => {
console.log(xhr.response)
})

// 1. 告诉服务器,我传递的内容类型,是 JSON 字符串
xhr.setRequestHeader('Content-Type', 'application/json')
// 2. 准备数据并转成 JSON 字符串
const user = { username: 'itheima007', password: '7654321' }
const userStr = JSON.stringify(user)
// 3. 发送请求体数据
xhr.send(userStr)

3.2 Promise

P37:https://www.bilibili.com/video/BV1MN411y7pw?p=37

什么是 Promise ?

Promise 对象用于表示一个异步操作的最终完成(或失败)及其结构值

Promise 的好处?

  • 逻辑更清晰(成功或失败会关联后续的处理函数)
  • 了解 axios 函数内部运作的机制
  • 能解决回调函数地狱问题
alt

语法:

// 1. 创建 Promise 对象
const p = new Promise((resolve, reject) => {
// 2. 执行异步任务-并传递结果
// 成功调用: resolve(值) 触发 then() 执行
// 失败调用: reject(值) 触发 catch() 执行
})
// 3. 接收结果
p.then(result => {
// 成功
}).catch(error => {
// 失败
})

Promise - 三种状态

P38:https://www.bilibili.com/video/BV1MN411y7pw?p=38

一个Promise对象,必然处于以下几种状态之一:

  1. 待定(pending):初始状态,既没有被兑现,也没有被拒绝
  2. 已兑现(fulfilled):操作成功完成
  3. 已拒绝(rejected):操作失败

注意:Promise对象一旦被兑现/拒绝就是已敲定了,状态无法再被改变

alt

案例:使用Promise + XHR 获取省份列表

P39:https://www.bilibili.com/video/BV1MN411y7pw?p=39

alt

3.3 封装简易版 axios

封装_简易axios_获取省份列表

P40:https://www.bilibili.com/video/BV1MN411y7pw?p=40

需求:基于 Promise + XHR 封装 myAxios 函数,获取省份列表展示

/**
* 目标:封装_简易axios函数_获取省份列表
* 1. 定义myAxios函数,接收配置对象,返回Promise对象
* 2. 发起XHR请求,默认请求方法为GET
* 3. 调用成功/失败的处理程序
* 4. 使用myAxios函数,获取省份列表展示
*/

// 1. 定义myAxios函数,接收配置对象,返回Promise对象
function myAxios(config) {
return new Promise((resolve, reject) => {
// 2. 发起XHR请求,默认请求方法为GET
const xhr = new XMLHttpRequest()
xhr.open(config.method || 'GET', config.url)
xhr.addEventListener('loadend', () => {
// 3. 调用成功/失败的处理程序
if (xhr.status >= 200 && xhr.status < 300) {
resolve(JSON.parse(xhr.response))
} else {
reject(new Error(xhr.response))
}
})
xhr.send()
})
}

// 4. 使用myAxios函数,获取省份列表展示
myAxios({
url: 'http://hmajax.itheima.net/api/province'
}).then(result => {
console.log(result)
document.querySelector('.my-p').innerHTML = result.list.join('<br>')
}).catch(error => {
console.log(error)
document.querySelector('.my-p').innerHTML = error.message
})

封装_简易axios_获取地区列表

P41:https://www.bilibili.com/video/BV1MN411y7pw?p=41

需求:修改 myAxios 函数支持传递查询参数,获取"辽宁省","大连市"对应地区列表展示

function myAxios(config) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest()
// 1. 判断有params选项,携带查询参数
if (config.params) {
// 2. 使用URLSearchParams转换,并携带到url上
const paramsObj = new URLSearchParams(config.params)
const queryString = paramsObj.toString()
// 把查询参数字符串,拼接在url?后面
config.url += `?${queryString}`
}

xhr.open(config.method || 'GET', config.url)
xhr.addEventListener('loadend', () => {
if (xhr.status >= 200 && xhr.status < 300) {
resolve(JSON.parse(xhr.response))
} else {
reject(new Error(xhr.response))
}
})
xhr.send()
})
}

// 3. 使用myAxios函数,获取地区列表
myAxios({
url: 'http://hmajax.itheima.net/api/area',
params: {
pname: '辽宁省',
cname: '大连市'
}
}).then(result => {
console.log(result)
document.querySelector('.my-p').innerHTML = result.list.join('<br>')
})

封装_简易axios_注册用户

P42:https://www.bilibili.com/video/BV1MN411y7pw?p=42

需求:修改 myAxios 函数支持传递请求体数据,完成注册用户功能

function myAxios(config) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest()

if (config.params) {
const paramsObj = new URLSearchParams(config.params)
const queryString = paramsObj.toString()
config.url += `?${queryString}`
}
xhr.open(config.method || 'GET', config.url)

xhr.addEventListener('loadend', () => {
if (xhr.status >= 200 && xhr.status < 300) {
resolve(JSON.parse(xhr.response))
} else {
reject(new Error(xhr.response))
}
})
// 1. 判断有data选项,携带请求体
if (config.data) {
// 2. 转换数据类型,在send中发送
const jsonStr = JSON.stringify(config.data)
xhr.setRequestHeader('Content-Type', 'application/json')
xhr.send(jsonStr)
} else {
// 如果没有请求体数据,正常的发起请求
xhr.send()
}
})
}

document.querySelector('.reg-btn').addEventListener('click', () => {
// 3. 使用myAxios函数,完成注册用户
myAxios({
url: 'http://hmajax.itheima.net/api/register',
method: 'POST',
data: {
username: 'itheima999',
password: '666666'
}
}).then(result => {
console.log(result)
}).catch(error => {
console.dir(error)
})
})

3.4 案例 - 天气预报

alt

P43:https://www.bilibili.com/video/BV1MN411y7pw?p=43

P44:https://www.bilibili.com/video/BV1MN411y7pw?p=44

P45:https://www.bilibili.com/video/BV1MN411y7pw?p=45

P46:https://www.bilibili.com/video/BV1MN411y7pw?p=46


「结束」
alt

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/427701.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

遭遇CC攻击如何做防护策略

CC&#xff08;Challenge Collapsar&#xff09;攻击是一种常见而具有破坏力的拒绝服务攻击&#xff08;DDoS&#xff09;&#xff0c;对网络安全造成威胁。为了保护网络免受这类恶意攻击&#xff0c;采取有效的防护策略至关重要。本文将介绍一些可以帮助保护您的网络免受CC攻击…

appium环境搭建

一.appium环境搭建 1.python3 python3的下载安装这里就不多做介绍了&#xff0c;当然你也可以选择自己喜欢的语音&#xff0c;比如java… 2.jdk 1&#xff09;下载地址 官网(需登录账号)&#xff1a; https://www.oracle.com/java/technologies/downloads/ 百度网盘&…

windows server 2019 安装NET Framework 3.5失败,提示:“安装一个或多个角色、角色服务或功能失败” 解决方案

错误描述&#xff1a; windows server 2019 安装NET Framework 3.5失败&#xff0c;提示&#xff1a;“安装一个或多个角色、角色服务或功能失败”&#xff1a;“安装一个或多个角色、角色服务或功能失败错误: 0x800f0950” 。 错误原因&#xff1a; windows 2019 server系统…

【C语言】指针详细解读2

1.const 修饰指针 1.1 const修饰变量 变量是可以修改的&#xff0c;如果把变量的地址交给⼀个指针变量&#xff0c;通过指针变量的也可以修改这个变量。 但是如果我们希望⼀个变量加上⼀些限制&#xff0c;不能被修改&#xff0c;怎么做呢&#xff1f;这就是const的作⽤。 …

力扣hot100:1.两数之和

输入中可能存在重复值 。 分析&#xff1a; 本题需要返回的是数组下标&#xff0c;因此如果需要使用排序然后双指针的话&#xff0c;需要用到哈希表&#xff0c;但是由于输入中可能存在重复值&#xff0c;因此哈希表的value值必须是vector<int>。 使用双指针求目标值targ…

Deep Learning相关概念介绍

工具&#xff1a; Anaconda: anaconda.com/products/individual。我理解是一个基于Python的AI程序开发环境&#xff0c;其作用类似于google notebook。区别是google notebook是在网页上&#xff0c;而Anaconda一般是安装在自己的服务器上。Jupyter Notebooks Anaconda激活深度…

vscode使用git

更改的文件 点击号 &#xff0c; 相当于git add 添加到暂存区 -号 取消暂存区内容 可以查看更改的前后对比 编辑器左下角点击分支&#xff0c;可以创建新分支 提交到暂存区后&#xff0c;点击 提交 &#xff0c; 编辑备注内容 &#xff0c;相当于git commit -m 提交备注内容 同…

Leaflet 初始化地图

前言 &#x1f914;&#x1f914; Leaflet系列搁置了好久&#xff0c;趁着deadline来临之际&#xff0c;我会在两周内将这个专栏的内容基本更新完毕&#xff0c;并随着项目的精进将更多优质的文章内容提供给本专栏的订阅者&#xff1b;说正事&#xff0c;在本文中&#xff0c;我…

《精益DevOps》:填补IT服务交付的认知差距,实现高效可靠的客户期望满足

写在前面 在当今的商业环境中&#xff0c;IT服务交付已经成为企业成功的关键因素之一。然而&#xff0c;实现高效、可靠、安全且符合客户期望的IT服务交付却是一项艰巨的任务。这要求服务提供商不仅具备先进的技术能力&#xff0c;还需要拥有出色的组织协作、流程管理和态势感…

IMAP和SMTP的区别与联系是什么?如何区分?

IMAP和SMTP的区别有哪些&#xff1f;IMAP和SMTP选择哪个更好&#xff1f; 在电子邮件通信的过程中&#xff0c;两个关键协议扮演着不可或缺的角色&#xff0c;它们就是IMAP和SMTP。这两个协议各有特色&#xff0c;但又紧密相连&#xff0c;共同维护着电子邮件系统的稳定运行。…

Neo4j从入门到放弃

前言 本文记录前公司在开发社交应用时&#xff0c;探索Neo4j数据库记录的一些关键信息和常见问题。希望这篇文章的一些信息能对你有所帮助。少走一些弯路。Neo4j的学习最好在搭建完后&#xff0c;它的web管理界面有一个引导教程&#xff0c;跟着它的指导手册走下教程&#xff…

内网穿透的应用-如何修改Nginx服务location代理转发规则结合cpolar实现无公网ip环境访问内网站点

文章目录 1. 下载windows版Nginx2. 配置Nginx3. 测试局域网访问4. cpolar内网穿透5. 测试公网访问6. 配置固定二级子域名7. 测试访问公网固定二级子域名 1. 下载windows版Nginx 进入官方网站(http://nginx.org/en/download.html)下载windows版的nginx 下载好后解压进入nginx目…

【FastChat】用于训练、服务和评估大型语言模型的开放平台

FastChat 用于训练、服务和评估大型语言模型的开放平台。发布 Vicuna 和 Chatbot Arena 的存储库。 隆重推出 Vicuna&#xff0c;一款令人印象深刻的开源聊天机器人 GPT-4&#xff01; &#x1f680; 根据 GPT-4 的评估&#xff0c;Vicuna 达到了 ChatGPT/Bard 90%* 的质量&…

HQL,SQL刷题,尚硅谷

目录 相关表数据&#xff1a; ​编辑 题目及思路解析&#xff1a; 复杂查询&#xff0c;子查询 1、查询所有课程成绩均小于60分的学生的学号、姓名 2、查询没有学全所有课的学生的学号、姓名 3、查询出只选修了三门课程的全部学生的学号和姓名 总结归纳&#xff1a; 知识补充&a…

端口号被占用时的解决办法

1、查看端口占用的进程号 netstat -ano |findstr 8080 2、 找到占用端口的程序 tasklist |findstr 2264 3、kill端口 taskkill /pid 2264 /f

如何在飞书接入ChatGPT并结合内网穿透实现公网远程访问智能AI助手

文章目录 前言环境列表1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 前言 在飞书中创建chatGPT机器人并且对话&#xff0c;在下面操作步骤中…

XV4001KC数字输出 车载用(piezoman)

EPSON的XV4001KC角速度传感器是为满足汽车行业对高精度和高可靠性需求而设计的。它不仅提供了高级的运动监测特性&#xff0c;高精度的角速度测量和温度监测功能&#xff0c;而且其紧凑的设计6.04.83.3mm尺寸对于空间受限的车载环境来说&#xff0c;是一大优势&#xff0c;使得…

网络安全-appcms-master

一、环境 gethub上面自己找appcms-master 二、开始闯关 原理&#xff1a;在评论的时候提交可以提交到管理员列表去&#xff0c;管理员一看cookie和地址就被盗走了 点进去软件后会发现提交按钮 随便提交一下看看 放到div标签里面是不是有可能可以做&#xff0c;看看后台吧 那…

网络安全是什么

网络安全是一种保护计算机、服务器、移动设备、电子系统、网络和数据免受恶意攻击的技术&#xff0c;这种技术也称为信息技术安全或电子信息安全。该术语适用于从业务到移动计算的各种环境&#xff0c;可以分为几个常见类别: 网络安全是一种保护计算机网络免受入侵者&#xff0…

D4890可应用在对讲机上,采用 SOP8/MSOP8两种封装形式

D4890 目前客户主要使用在对讲机上&#xff0c;电压范围2.2V &#xff5e; 5.5V之间&#xff0c;输出功率&#xff08;THDN1%&#xff09;1.0W/8Ω 5.0V。采用 SOP8/MSOP8两种封装形式。 2、推荐的应用线路图如下&#xff1a; 3、实际测试输出波形如下&#xff08;VCC4.5V&…