1、介绍
(1)AJAX(Asynchronous JavaScript and XML)
AJAX 原来是指通过异步 JavaScript 从服务器 XML 文档获取数据,然后更新网页的对应部分,避免刷新整个网页
后来,这个词语慢慢成为在浏览器通过脚本与服务器进行通信的代名词,它在原来的含义上有了更多的拓展
也就是说,只要通过脚本向服务器发送请求获取数据,这个请求都被称为 AJAX 请求
(2)XMLHttpRequest
XMLHttpRequest 是浏览器的内置对象,通过这个对象,我们能向服务器发送请求和接收响应,实现数据交换
很多 AJAX 底层都是通过 XMLHttpRequest 对象实现
2、使用
可以通过构造函数 XMLHttpRequest()
创建一个 XMLHttpRequest 对象
XMLHttpRequest 对象常用的属性如下:
-
readyState
:只读属性,表示请求的当前状态若为
0
,表示已经生成请求实例,但未调用open()
方法若为
1
,表示已经调用open()
方法,但未调用send()
方法若为
2
,表示已经调用send()
方法,且已收到服务器返回的头信息若为
3
,表示正在接收服务器返回的数据体若为
4
,表示服务器返回的数据已全部接收完毕,或者发生错误 -
response
:只读属性,表示服务器返回的数据,其类型由responseType
的值决定 -
responseType
:定义返回数据的类型,它的值是一个字符串若为
'text'
或''
,表示服务器返回文本数据若为
'json'
,表示服务器返回 Json 对象若为
'blob'
,表示服务器返回 Blob 对象若为
'arraybuffer'
,表示服务器返回 ArrayBuffer 对象若为
'document'
,表示服务器返回 Document 对象 -
responseText
:只读属性,表示服务器返回的文本数据,如果请求失败则为 null -
responseXML
:只读属性,表示服务器返回的 Document 对象,如果请求失败则为 null -
responseURL
:只读属性,表示返回数据的服务器的网址 -
status
:只读属性,表示 HTTP 状态代码 -
statusText
:只读属性,表示 HTTP 状态信息 -
timeout
:定义请求的超时时间,若请求超过该时间,则自动结束此请求 -
withCredentials
:一个布尔类型的值,表示在跨域请求时是否带有授权信息
XMLHttpRequest 对象常用的方法如下:
-
open()
:初始化请求,它接收以下五个参数参数
method
是一个字符串,表示将要使用的请求方法参数
url
是一个字符串,表示发送请求的目标地址参数
async
是一个布尔值,表示请求是否需要异步进行,默认为 true参数
user
是一个字符串,表示用于认证的用户,默认为空字符串参数
password
是一个字符串,表示用于认证的密码,默认为空字符串 -
setRequestHeader()
:设置请求头,必须在open()
之后send()
之前调用 -
overrideMimeType()
:将服务器返回的数据解析成指定类型,必须在open()
之后send()
之前调用 -
send()
:发送请求,可以在参数中带上请求体请求体的类型可以是
null
、String
、Blob
、ArrayBuffer
、Document
、FormData
-
abort()
:中止请求 -
getAllResponseHeaders()
:获取所有响应头 -
getResponseHeader()
:获取指定响应头
XMLHttpRequest 对象常用的事件如下:
-
readystatechange
:readyState
发生变化时触发 -
loadstart
:当请求开始时触发(发出 HTTP 请求) -
loadend
:当请求结束时触发(请求成功或者失败) -
load
:当请求成功时触发 -
error
:当请求错误时触发 -
abort
:当请求中止时触发 -
timeout
:当请求超时时触发 -
progress
:监听上传和下载进度,该事件对应的事件处理函数带有一个事件对象,该事件对象有三个属性属性
loaded
表示已经传输的数据量,属性total
表示总数据量属性
lengthComputable
表示加载进度是否可以计算,是一个布尔类型的值
这里需要注意,下载触发的是 xhr
对象的 progress
事件,上传触发的是 xhr.upload
对象的 progress
事件
3、实例
(1)发送 GET 请求
var xhr = new XMLHttpRequest()
xhr.responseType = 'text'
xhr.open('GET', 'http://www.httpbin.org/get')
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
console.log(xhr.responseText)
} else {
console.error(xhr.statusText)
}
}
}
xhr.onerror = function() {
console.log('error')
}
xhr.send()
(2)发送 POST 请求
var xhr = new XMLHttpRequest()
xhr.open('POST', 'http://www.httpbin.org/post')
xhr.onload = function() {
console.log(xhr.response)
}
xhr.onerror = function() {
console.log('error')
}
var data = new FormData()
data.append('username', 'admin')
data.append('password', '12345')
xhr.send(data)
(3)接收图片
var xhr = new XMLHttpRequest()
xhr.open('GET', '/path/to/image.png')
xhr.onloadstart = function() {
xhr.responseType = 'blob'
}
xhr.onload = function() {
if (this.status === 200) {
var blob = xhr.response
var img = document.createElement('img')
img.onload = function() { window.URL.revokeObjectURL(img.src) }
img.src = window.URL.createObjectURL(blob)
document.getElementById('container').appendChild(img)
}
}
xhr.send()
(4)监听进度
var xhr = new XMLHttpRequest()
xhr.open('GET', '/download/or/upload')
// 用于监听下载进度
xhr.onprogress = progressHandler
// 用于监听上传进度
xhr.upload.onprogress = progressHandler
function progressHandler(e) {
if (e.lengthComputable) {
console.log(e.loaded / e.total)
} else {
console.log('无法获取进度')
}
}
xhr.send()
【 阅读更多 JavaScript 系列文章,请看 JavaScript学习笔记 】