JavaScript学习笔记(十六) XMLHttpRequest

简介: JavaScript学习笔记(十六) XMLHttpRequest

正文


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()

目录
相关文章
|
2月前
|
前端开发 JavaScript API
JavaScript学习笔记(一)promise与async
JavaScript学习笔记(一)promise与async
|
3月前
|
存储 JavaScript
【ES6系列第二篇】适用JS初学者的Set对象和Map对象学习笔记
【ES6系列第二篇】适用JS初学者的Set对象和Map对象学习笔记
24 0
|
5月前
|
前端开发 JavaScript Python
javascript入门学习笔记打卡(2)
javascript入门学习笔记打卡(2)
22 0
|
7月前
|
JavaScript
JS 学习笔记一 (基础)
JS 学习笔记一 (基础)
39 0
|
7月前
|
JavaScript 前端开发
JS 学习笔记四(DOM) 悬停事件 获取节点
JS 学习笔记四(DOM) 悬停事件 获取节点
34 0
|
7月前
|
JavaScript
JS 学习笔记四(DOM)(节点)
JS 学习笔记四(DOM)(节点)
27 0
|
7月前
|
JavaScript 前端开发 Java
js学习笔记
js学习笔记
36 0
|
8月前
|
前端开发
前端学习笔记202305学习笔记第三十三天-js-使用const声明变量特点
前端学习笔记202305学习笔记第三十三天-js-使用const声明变量特点2
43 0
|
8月前
|
前端开发
前端学习笔记202305学习笔记第三十四天-js-引出闭包3
前端学习笔记202305学习笔记第三十四天-js-引出闭包3
58 0
|
8月前
|
前端开发
前端学习笔记202305学习笔记第三十四天-js-this绑定的优先级2
前端学习笔记202305学习笔记第三十四天-js-this绑定的优先级2
32 0