AJAX 总结
简介
AJAX 即 “Asynchronous JavaScript and XML”(异步的JavaScript与XML技术),指的是通过 JavaScript 的异步通信,从服务器获取 XML 文档从中提取数据,再更新当前网页的对应部分,而不用刷新整个网页。后来,AJAX 这个词就成为 JavaScript 脚本发起 HTTP 通信的代名词,也就是说,只要用脚本发起通信,就可以叫做 AJAX 通信。
具体来说,AJAX 包括以下几个步骤。
- 创建 XMLHttpRequest 实例
- 发出 HTTP 请求
- 接收服务器传回的数据
- 更新网页数据
概括起来,就是一句话,AJAX 通过原生的XMLHttpRequest对象发出 HTTP 请求,得到服务器返回的数据后,再进行处理。现在,服务器返回的都是 JSON 格式的数据,XML 格式已经过时了,但是 AJAX 这个名字已经成了一个通用名词,字面含义已经消失了。
注意,AJAX 只能向同源网址(协议、域名、端口都相同)发出 HTTP 请求,如果发出跨域请求,就会报错。
XMLHttpRequest
XMLHttpRequest对象是 AJAX 的主要接口,用于浏览器与服务器之间的通信。尽管名字里面有XML和Http,它实际上可以使用多种协议(比如file或ftp),发送任何格式的数据(包括字符串和二进制)。
XMLHttpRequest 的实例属性
XMLHttpRequest.readyState
XMLHttpRequest.readyState返回一个整数,表示实例对象的当前状态。该属性只读。它可能返回以下值。
- 0 未初始化 – 表示 XMLHttpRequest 实例已经生成,尚未调用.open()方法
- 1 表示open()方法已经调用,但是实例的send()方法还没有调用,仍然可以使用实例的setRequestHeader()方法,设定 HTTP 请求的头信息。
- 2 发送 – 已经调用.send()方法,并且服务器返回的头信息和状态码已经收到,但尚未接收到响应;。
- 3 接收 – 表示正在接收服务器传来的数据体(body 部分)。这时,如果实例的responseType属性等于text或者空字符串,responseText属性就会包含已经收到的部分信息。
- 4 完成 – 表示服务器返回的数据已经完全接收,或者本次接收已经失败。
通信过程中,每当实例对象发生状态变化,它的readyState属性的值就会改变。这个值每一次变化,都会触发 readyStateChange 事件。
1 | var xhr = new XMLHttpRequest(); |
XMLHttpRequest.onreadystatechange
XMLHttpRequest.onreadystatechange 属性指向一个监听函数。 readystatechange 事件发生时(实例的 readyState 属性变化),就会执行这个属性。
XMLHttpRequest.response
XMLHttpRequest.response 属性表示服务器返回的数据体(即 HTTP 回应的 body 部分)。它可能是任何数据类型,比如字符串、对象、二进制对象等等,具体的类型由 XMLHttpRequest.responseType 属性决定。该属性只读。
如果本次请求没有成功或者数据不完整,该属性等于 null 。但是,如果 responseType 属性等于text或空字符串,在请求没有结束之前( readyState 等于3的阶段), response 属性包含服务器已经返回的部分数据。
XMLHttpRequest.responseType
XMLHttpRequest.responseType 属性是一个字符串,表示服务器返回数据的类型。这个属性是可写的,可以在调用 open() 方法之后、调用 send() 方法之前,设置这个属性的值,告诉服务器返回指定类型的数据。如果responseType设为空字符串,就等同于默认值text。
XMLHttpRequest.responseType 属性可以等于以下值。
- “”(空字符串):等同于text,表示服务器返回文本数据。
- “arraybuffer”:ArrayBuffer 对象,表示服务器返回二进制数组。
- “blob”:Blob 对象,表示服务器返回二进制对象。
- “document”:Document 对象,表示服务器返回一个文档对象。
- “json”:JSON 对象。
- “text”:字符串。
如果将这个属性设为json,浏览器就会自动对返回数据调用 JSON.parse() 方法。也就是说,从 xhr.response 属性(注意,不是 xhr.responseText 属性)得到的不是文本,而是一个 JSON 对象。
XMLHttpRequest.responseText
XMLHttpRequest.responseText 属性返回从服务器接收到的字符串,该属性为只读。只有 HTTP 请求完成接收以后,该属性才会包含完整的数据。
XMLHttpRequest.responseURL
XMLHttpRequest.responseURL 属性是字符串,表示发送数据的服务器的网址。
注意,这个属性的值与 open() 方法指定的请求网址不一定相同。如果服务器端发生跳转,这个属性返回最后实际返回数据的网址。另外,如果原始 URL 包括锚点(fragment),该属性会把锚点剥离。
XMLHttpRequest.status
XMLHttpRequest.status 属性返回一个整数,表示服务器回应的 HTTP 状态码。一般来说,如果通信成功的话,这个状态码是200;如果服务器没有返回状态码,那么这个属性默认是200。请求发出之前,该属性为0。该属性只读
- 200, OK,访问正常
- 301, Moved Permanently,永久移动
- 302, Moved temporarily,暂时移动
- 304, Not Modified,未修改
- 307, Temporary Redirect,暂时重定向
- 401, Unauthorized,未授权
- 403, Forbidden,禁止访问
- 404, Not Found,未发现指定网址
- 500, Internal Server Error,服务器发生错误
XMLHttpRequest.statusText
XMLHttpRequest.statusText 属性返回一个字符串,表示服务器发送的状态提示。不同于status属性,该属性包含整个状态信息,比如“OK”和“Not Found”。在请求发送之前(即调用open()方法之前),该属性的值是空字符串;如果服务器没有返回状态提示,该属性的值默认为“OK”。该属性为只读属性。
XMLHttpRequest 的实例方法
XMLHttpRequest.open()
XMLHttpRequest.open()方法用于指定 HTTP 请求的参数,或者说初始化 XMLHttpRequest 实例对象。它一共可以接受五个参数。
1 | void open( |
method:表示 HTTP 动词方法,比如GET、POST、PUT、DELETE、HEAD等。url: 表示请求发送目标 URL。async: 布尔值,表示请求是否为异步,默认为true。如果设为false,则send()方法只有等到收到服务器返回了结果,才会进行下一步操作。该参数可选。由于同步 AJAX 请求会造成浏览器失去响应,许多浏览器已经禁止在主线程使用,只允许 Worker 里面使用。所以,这个参数轻易不应该设为false。user:表示用于认证的用户名,默认为空字符串。该参数可选。password:表示用于认证的密码,默认为空字符串。该参数可选。
XMLHttpRequest.send()
XMLHttpRequest.send() 方法用于实际发出 HTTP 请求。它的参数是可选的,如果不带参数,就表示 HTTP 请求只有一个 URL,没有数据体,典型例子就是 GET 请求;如果带有参数,就表示除了头信息,还带有包含具体数据的信息体,典型例子就是 POST 请求。
GET 请求的例子:
1 | var xhr = new XMLHttpRequest(); |
GET请求的参数,作为查询字符串附加在 URL 后面。
下面是发送 POST 请求的例子
1 | var xhr = new XMLHttpRequest(); |
注意,所有 XMLHttpRequest 的监听事件,都必须在send()方法调用之前设定。
XMLHttpRequest.setRequestHeader()
XMLHttpRequest.setRequestHeader() 方法用于设置浏览器发送的 HTTP 请求的头信息。该方法必须在open()之后、send()之前调用。如果该方法多次调用,设定同一个字段,则每一次调用的值会被合并成一个单一的值发送。
该方法接受两个参数。第一个参数是字符串,表示头信息的字段名,第二个参数是字段值。
1 | xhr.setRequestHeader('Content-Type', 'application/json'); |
XMLHttpRequest.abort()
XMLHttpRequest.abort() 方法用来终止已经发出的 HTTP 请求。调用这个方法以后, readyState 属性变为4,status 属性变为0。
使用示例
简单用法
1 | var xhr = new XMLHttpRequest(); |
POST
1 | var xhr = new XMLHttpRequest(); |
注意:post请求一定要设置请求头的格式内容
GET和POST请求数据区别
- 使用Get请求时,参数在URL中显示,而使用Post方式,则放在send里面
- 使用Get请求发送数据量小,Post请求发送数据量大
- 使用Get请求安全性低,会被缓存,而Post请求反之
参考
XMLHttpRequest - Web API 接口参考 | MDN
AJAX - 维基百科
Ajax原理一篇就够了
XMLHttpRequest 对象
Ajax请求后台数据