一、AJAX原理-XMLHttpRequest
(1)定义及原理
定义:XmlHttp是一套可以在Javascript、VbScript、Jscript等脚本语言中通过http协议传送或从接收XML及其他数据的一套API。XmlHttp最大的用处是可以更新网页的部分内容而不需要刷新整个页面。
AJAX的原理也就是XMLHttpRequest对象(下文简称XHR)
注意:axios不等于XMLHttpRequest
关系:axios内部采用XMLHttpRequest与服务器交互
(2)使用XHR的原因
有更多与服务器数据通信方式
了解axios内部原理
(3)使用XHR
步骤:
创建XMLHttpRequest对象
配置请求方法和请求URL地址
监听Loadend事件,接收响应结果
发起请求
代码示例如下:
<!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>XMLHttpRequest_基础使用</title>
</head>
<body>
<p class="my-p"></p>
<script>
// <p class="my-p"></p>
/**
* 目标:使用XMLHttpRequest对象与服务器通信
* 1. 创建 XMLHttpRequest 对象
* 2. 配置请求方法和请求 url 地址
* 3. 监听 loadend 事件,接收响应结果
* 4. 发起请求
*/
//1. 创建 XMLHttpRequest 对象
const xhr = new XMLHttpRequest()
//2. 配置请求方法和请求 url 地址
xhr.open('GET', 'https://hmajax.itheima.net/api/province')
//3. 监听 loadend 事件,接收响应结果
xhr.addEventListener('loadend', () => {
console.log(xhr.response)
const data = JSON.parse(xhr.response)
console.log(data)
console.log(data.list.join('<br>'))
document.querySelector('.my-p').innerHTML = data.list.join('<br>')
})
xhr.send()
</script>
</body>
</html>
二、XMLHttpRequest-查询参数
(1)定义及语法
定义:浏览器提供给服务器的额外信息,让服务器返回浏览器想要的数据
语法:http://xxxx.com/xxx/xxx?参数名1=值1&参数名2=值2(UR+?+参数名=值)
注意:参数名1=值1&参数名2=值2 参数之间需要&连接
代码示例如下
<!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>XMLHttpRequest_查询参数</title>
</head>
<body>
<script>
/**
* 目标:使用XHR携带查询参数,展示某个省下属的城市列表
*/
//创建XMLHttpRequest对象
const xhr = new XMLHttpRequest()
//配置请求方法和请求URL地址
xhr.open('GET', 'https://hmajax.itheima.net/api/city?pname=辽宁省')
//监听Loadend事件,接收响应结果
xhr.addEventListener('loadend', () => {
console.log(xhr.response)
})
//发起请求
xhr.send()
</script>
</body>
</html>
(2)URLSearchParams对象的使用
在参数名较多的情况下,使用http://xxxx.com/xxx/xxx?参数名1=值1&参数名2=值2比较麻烦并且容易出错,这时候就需要URLSearchParams对象帮忙了
使用方法如下
const paramsObj = new URLSearchParams({
参数名1:值1,
参数名2:值2
})
//2生成指定格式查询参数 字符串
const querString = paramsObj.toString()
//结果 参数名1=值1&参数名2=值2
示例代码如下
<!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>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css">
<style>
:root {
font-size: 15px;
}
body {
padding-top: 15px;
}
</style>
</head>
<body>
<div class="container">
<form id="editForm" class="row">
<!-- 输入省份名字 -->
<div class="mb-3 col">
<label class="form-label">省份名字</label>
<input type="text" value="北京" name="province" class="form-control province" placeholder="请输入省份名称" />
</div>
<!-- 输入城市名字 -->
<div class="mb-3 col">
<label class="form-label">城市名字</label>
<input type="text" value="北京市" name="city" class="form-control city" placeholder="请输入城市名称" />
</div>
</form>
<button type="button" class="btn btn-primary sel-btn">查询</button>
<br><br>
<p>地区列表: </p>
<ul class="list-group">
<!-- 示例地区 -->
<li class="list-group-item">东城区</li>
</ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
/**
* 目标: 根据省份和城市名字, 查询对应的地区列表
*/
//1创建 URLSearchParams对象
// const paramsObj = new URLSearchParams({
// 参数名1:值1,
// 参数名2:值2
// })
// //2生成指定格式查询参数 字符串
// const querString = paramsObj.toString()
// //结果 参数名1=值1&参数名2=值2
document.querySelector('.sel-btn').addEventListener('click', () => {
const pname = document.querySelector('.province').value
const cname = document.querySelector('.city').value
const qObj = {
pname,
cname
}
const paramsObj = new URLSearchParams(qObj)
const querString = paramsObj.toString()
console.log(querString)
})
</script>
</body>
</html>
打印结果说明我们是成功的了,然后就可以使用XHR对象来进行操作了
三、XMLHttpRequest-数据提交
我们用一张图来概括XMLHttpRequest数据提交的使用方法
请求行:请求方法,URL,协议
请求头:以键值对的格式携带的附加信息,比如:Content-Type
空行:分隔请求头,空行之后的是发送给服务器的资源
请求体:发送的资源
示例代码如下
<!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>XMLHttpRequest_数据提交</title>
</head>
<body>
<button class="reg-btn">注册用户</button>
<script>
/**
* 目标:使用xhr进行数据提交-完成注册功能
*/
document.querySelector('.reg-btn').addEventListener('click', () => {
//1创建 URLSearchParams对象
const xhr = new XMLHttpRequest()
//2. 配置请求方法和请求 url 地址
xhr.open('POST','https://hmajax.itheima.net/api/register')
//3. 监听 loadend 事件,接收响应结果
xhr.addEventListener('loadend',()=>{
console.log(xhr.response)
})
//设置请求头,告诉服务器内容类型(JSON字符串)
xhr.setRequestHeader('Content-Type','application/json')
//准备提交数据
const userObj = {
username:'Orange',
password:'1234567'
}
const userStr = JSON.stringify(userObj)
//设置请求体,发起请求
xhr.send(userStr)
})
</script>
</body>
</html>