我们上次给大家分别介绍了在form表单中和用在jQuery中使用ajax函数提交数据,今天我们给大家介绍在原生js中如何用ajax提交和返回数据。
使用xhr
发起GET请求
步骤
- 创建
xhr
对象 - 调用
xhr.open()
函数 - 调用
xhr.send()
函数 - 监听
xhr.onreadystatechange
事件
// 1. 创建 XHR 对象
var xhr = new XMLHttpRequest()
// 2. 调用 open 函数
xhr.open('GET', 'http://www.liulongbin.top:3006/api/getbooks')
// 3. 调用 send 函数
xhr.send()
// 4. 监听 onreadystatechange 事件
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
// 获取服务器响应的数据
console.log(xhr.responseText)
}
}
了解xhr
对象的readyState
属性
XMLHttpRequest
对象的 readyState
属性,用来表示当前 Ajax
请求所处的状态。每个 Ajax
请求必然处于以
下状态中的一个:
使用xhr
发起带参数的GET请求
使用 xhr
对象发起带参数的 GET
请求时,只需在调用 xhr.open
期间,为 URL
地址指定参数即可:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZEOD2Q4I-1646571767999)(images/get请求携带参数.png)]
这种在 URL 地址后面拼接的参数,叫做查询字符串。
var xhr = new XMLHttpRequest()
xhr.open('GET', 'http://www.liulongbin.top:3006/api/getbooks?id=1')
xhr.send()
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText)
}
}
查询字符串
什么是查询字符串
**定义:**查询字符串(URL 参数)是指在 URL 的末尾加上用于向服务器发送信息的字符串(变量)。
**格式:**将英文的 ? 放在URL
的末尾,然后再加上 参数=值 ,想加上多个参数的话,使用 & 符号进行分隔。以
这个形式,可以将想要发送给服务器的数据添加到 URL
中。
URL编码与解码
什么是URL编码
URL
地址中,只允许出现英文相关的字母、标点符号、数字,因此,在 URL
地址中不允许出现中文字符。
如果 URL 中需要包含中文这样的字符,则必须对中文字符进行编码(转义)。
URL编码的原则:使用安全的字符(没有特殊用途或者特殊意义的可打印字符)去表示那些不安全的字符。
URL编码原则的通俗理解:使用英文字符去表示非英文字符
如何对URL进行编码与解码
浏览器提供了 URL
编码与解码的 API
,分别是:
encodeURI()
编码的函数decodeURI()
解码的函数
使用xhr
发起POST
请求
步骤
- 创建
xhr
对象 - 调用
xhr.open()
函数 - 设置 Content-Type 属性(固定写法)
- 调用
xhr.send()
函数,同时指定要发送的数据 - 监听
xhr.onreadystatechange
事件
// 1. 创建 xhr 对象
var xhr = new XMLHttpRequest()
// 2. 调用 open 函数
xhr.open('POST', 'http://www.liulongbin.top:3006/api/addbook')
// 3. 设置 Content-Type 属性(固定写法)
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
// 4. 调用 send 函数
xhr.send('bookname=水浒传&author=施耐庵&publisher=上海图书出版社')
// 5. 监听事件
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText)
}
}
什么是JSON
概念:JSON
的英文全称是 JavaScript Object Notation
,即“JavaScript 对象表示法”。简单来讲,
JSON
就是 Javascript
对象和数组的字符串表示法,它使用文本表示一个 JS
对象或数组的信息,因此,
JSON
的本质是字符串。
作用:JSON
是一种轻量级的文本数据交换格式,在作用上类似于 XML
,专门用于存储和传输数据,但
是 JSON
比 XML
更小、更快、更易解析。
JSON`语法注意事项
① 属性名必须使用双引号包裹
② 字符串类型的值必须使用双引号包裹
③ JSON
中不允许使用单引号表示字符串
④ JSON
中不能写注释
⑤ JSON
的最外层必须是对象或数组格式
⑥ 不能使用 undefined
或函数作为 JSON
的值
**JSON
的作用:**在计算机与网络之间存储和传输数据。
**JSON
的本质:**用字符串来表示 Javascript
对象数据或数组数据
JSON
和JS
对象的互转
要实现从 JSON
字符串转换为 JS
对象,使用 JSON.parse()
方法:
要实现从 JS
对象转换为 JSON
字符串,使用 JSON.stringify()
方法:
序列化和反序列化
把数据对象 转换为 字符串的过程,叫做序列化,例如:调用 JSON.stringify()
函数的操作,叫做 JSON
序列化。
把字符串 转换为 数据对象的过程,叫做反序列化,例如:调用 JSON.parse()
函数的操作,叫做 JSON
反序列化。
XMLHttpRequest Level2`的新特性
设置HTTP
请求时限## FormData`对象管理表单数据
Ajax 操作往往用来提交表单数据。为了方便表单处理,HTML5
新增了一个 FormData
对象,可以模拟表单操
有时,Ajax
操作很耗时,而且无法预知要花多少时间。如果网速很慢,用户可能要等很久。新版本的 XMLHttpRequest
对象,增加了 timeout
属性,可以设置 HTTP
请求的时限:
上传文件
新版 XMLHttpRequest
对象,不仅可以发送文本信息,还可以上传文件。
实现步骤:
① 定义 UI
结构
② 验证是否选择了文件
③ 向 FormData
中追加文件
④ 使用 xhr
发起上传文件的请求
⑤ 监听 onreadystatechange
事件### 显示文件上传进度
计算文件上传进度
新版本的 XMLHttpRequest
对象中,可以通过监听 xhr.upload.onprogress
事件,来获取到文件的上传进度。语法格式如下:
// 创建 XHR 对象
var xhr = new XMLHttpRequest()
// 监听 xhr.upload 的 onprogress 事件
xhr.upload.onprogress = function(e) {
// e.lengthComputable 是一个布尔值,表示当前上传的资源是否具有可计算的长度
if (e.lengthComputable) {
// e.loaded 已传输的字节
// e.total 需传输的总字节
var percentComplete = Math.ceil((e.loaded / e.total) * 100)
}
}
导入需要的库
<link rel="stylesheet" href="./lib/bootstrap.css" />
<script src="./lib/jquery.js"></script>
基于Bootstrap
渲染进度条
<!-- 进度条 -->
<div class="progress" style="width: 500px; margin: 10px 0;">
<div class="progress-bar progress-bar-info progress-barstriped active" id="percent" style="width: 0%">
0%
</div>
</div>
最后我们就可以得到一个显示文件上传进度的条了。大家可以换个接口自行尝试。