Ajax学习笔记:XMLHttpRequest
MDN:
XMLHttpRequest
(XHR)对象用于与服务器交互。通过 XMLHttpRequest 可以在不刷新页面的情况下请求特定 URL,获取数据。这允许网页在不影响用户操作的情况下,更新页面的局部内容。XMLHttpRequest 在 AJAX 编程中被大量使用。
本文内容大部分来至:MDN 、你不知道的 XMLHttpRequest
尽管名称叫这个,但是 XMLHttpRequest
可以用于获取任何类型的数据。它甚至支持 HTTP 以外的协议(包括 file:// 和 FTP),尽管可能受到更多出于安全等原因的限制。
但是如果只是需要单纯从服务器端接收事件或消息数据,应该通过 EventSource
接口使用 Server-sent events
,如果是全双工通信应该使用 WebSocket
, 使用方法在这章简述:Html5学习笔记
构造函数
通过 XMLHttpRequest()
方法可以得到一个该对象
1 | const request = new XMLHttpRequest(); |
在调用下列任何其他方法之前,必须先调用该构造函数,或通过其他方式,得到一个实例对象。
属性
此接口继承了 XMLHttpRequestEventTarget
和 EventTarget
的属性。
XMLHttpRequest.readyState
该属性为只读
XMLHttpRequest.readyState 属性返回一个 XMLHttpRequest 代理当前所处的状态。一个 XHR 代理总是处于下列状态中的一个:
值 | 状态 | 描述 |
---|---|---|
0 |
UNSENT |
代理被创建,但尚未调用 open() 方法。 |
1 |
OPENED |
open() 方法已经被调用。 |
2 |
HEADERS_RECEIVED |
send() 方法已经被调用,并且头部和状态已经可获得。 |
3 |
LOADING |
下载中; responseText 属性已经包含部分数据。 |
4 |
DONE |
下载操作已完成。 |
OPENED : 在这个状态中,可以通过 setRequestHeader()
方法来设置请求的头部, 可以调用 send()
方法来发起请求。
LOADING: 响应体部分正在被接收。如果 responseType 属性是“text”或空字符串, responseText 将会在载入的过程中拥有部分响应数据。
DONE: 请求操作已经完成。这意味着数据传输已经彻底完成或失败。
在IE中,状态有着不同的名称,并不是
UNSENT
,OPENED
,HEADERS_RECEIVED
,LOADING
和DONE
, 而是READYSTATE_UNINITIALIZED
(0),READYSTATE_LOADING
(1) ,READYSTATE_LOADED
(2) ,READYSTATE_INTERACTIVE
(3) 和READYSTATE_COMPLETE
(4) 。
实例
1 | var xhr = new XMLHttpRequest(); |
XMLHttpRequest.onreadystatechange
该属性是一个方法,当 readyState 属性改变时会调用它
XMLHttpRequest.status
返回一个无符号短整型(unsigned short)数字,代表请求的响应状态。
XMLHttpRequest.statusText
只读属性 XMLHttpRequest.statusText
返回了 XMLHttpRequest
请求中由服务器返回的一个 DOMString
类型的文本信息,这则信息中也包含了响应的数字状态码。不同于使用一个数字来指示的状态码 XMLHTTPRequest.status
,这个属性包含了返回状态对应的文本信息,例如”OK”或是”Not Found”。如果请求的状态 readyState
的值为”UNSENT”或者”OPENED”,则这个属性的值将会是一个空字符串。
如果服务器未明确指定一个状态文本信息,则statusText
的值将会被自动赋值为”OK”。
XMLHttpRequest.upload
该属性为只读
XMLHttpRequest.upload
属性返回一个 XMLHttpRequestUpload
对象,用来表示上传的进度。这个对象是不透明的,但是作为一个 XMLHttpRequestEventTarget
,可以通过对其绑定事件来追踪它的进度。
可以被绑定在upload对象上的事件监听器如下:
- onloadstart: 获取开始
- onprogress: 数据传输进行中
- onabort: 获取操作终止
- onerror: 获取失败
- onload: 获取成功
- ontimeout: 获取操作在用户规定的时间内未完成
- onloadend: 获取完成(不论成功与否)
XMLHttpRequest.timeout
XMLHttpRequest.timeout
是一个无符号长整型数,代表着一个请求在被自动终止前所消耗的毫秒数。默认值为 0,意味着没有超时。超时并不应该用在一个 document environment 中的同步 XMLHttpRequests 请求中,否则将会抛出一个 InvalidAccessError
类型的错误。当超时发生, timeout
事件将会被触发。
一些response属性
XMLHttpRequest.response
:响应体的类型由 responseType
来指定,可以是 ArrayBuffer、Blob、Document、JSON
,或者是字符串。如果请求未完成或失败,则该值为 null。该属性为只读
XMLHttpRequest.responseText
:返回一个 DOMString
,该 DOMString
包含对请求的响应,如果请求未成功或尚未发送,则返回 null
。该属性为只读
XMLHttpRequest.responseType
:一个用于定义响应类型的枚举值(enumerated value)。responseType支持以下几种值:
""
:responseType
为空字符串时,采用默认类型 DOMString,与设置为 text 相同。arraybuffer
:response
是一个包含二进制数据的 JavaScriptArrayBuffer
。blob
:response
是一个包含二进制数据的 Blob 对象 。document
:response
是一个HTML Document
或XML XMLDocument
,这取决于接收到的数据的MIME
类型。json
:response
是一个 JavaScript 对象。这个对象是通过将接收到的数据类型视为 JSON 解析得到的。text
:response
是一个以DOMString
对象表示的文本。
方法
包括下面方法:
XMLHttpRequest.open()
:初始化一个请求。XMLHttpRequest.send()
:发送请求。如果请求是异步的(默认),那么该方法将在请求发送后立即返回。XMLHttpRequest.abort()
:如果请求已经被发送,则立刻中止请求。XMLHttpRequest.getAllResponseHeaders()
:返回所有响应头信息(响应头名和值),如果响应头还没有接收,则返回 null。注意:使用该方法获取的 response headers 与在开发者工具 Network 面板中看到的响应头不一致XMLHttpRequest.overrideMimeType()
:重写由服务器返回的 MIME 类型。例如,可以用于强制把响应流当做 text/xml 来解析,即使服务器没有指明数据是这个类型。注意:这个方法必须在 send() 之前被调用。XMLHttpRequest.setRequestHeader()
:设置 HTTP 请求头信息。注意:在这之前,你必须确认已经调用了 open() 方法打开了一个 url
open() 方法签名:
1 | void open( |
send() 方法签名:
1 | void send(); |
如果发送的数据是Document对象,需要在发送之前将其序列化。
发送二进制内容的最佳方法(如上传文件)是使用一个与send()方法结合的 ArrayBufferView 或者 Blobs
使用案例
简单的GET
1 | var xhr = new XMLHttpRequest(); |
简单的POST
1 | var xhr = new XMLHttpRequest(); |
传FormData
为了方便表单数据,HTML 5新增了一个 FormData 对象,可以用于模拟表单。
1 | //首先新建一个 FormData 对象 |
FormData 对象也可以用来获取网页表单的值
1 | var form = document.getElementById('myform'); // 获取页面上表单对象 |
上传文件
为了上传文件, 我们得先选中一个文件. 一个 type
为 file
的 input
输入框
1 | <input id="input" type="file"> |
然后用 FormData 对象包裹选中的文件
1 | var input = document.getElementById("input"), |
进度信息
新版本的 XMLHttpRequest 对象,传送数据的时候,有一个 progress 事件,用来返回进度信息。
它分成上传和下载两种情况。下载的 progress 事件属于 XMLHttpRequest 对象,上传的 progress 事件属于XMLHttpRequest.upload 对象。
1 | xhr.onprogress = function(e) { |
其中total是需要传输的总字节,loaded是已经传输的字节。如果event.lengthComputable 不为真,则 event.total 等于0。
XHR定时轮询和长轮询
感觉这部分不怎么需要,到时候需要再写