解释 AJAX 中请求的不同就绪状态

1. AJAX 简介

AJAX(Asynchronous JavaScript and XML)是一种Web前端技术,可以在不刷新整个页面的情况下向Web服务器请求数据,更新部分页面。利用AJAX的技术可以实现无刷新登录、增量更新等效果。

2. AJAX 请求状态

AJAX请求的过程可以分为多个不同的状态,每个状态由readyState和status两个属性表示。

2.1 readyState

readyState属性表示请求的状态,取值从0到4。

0表示请求未初始化,即还没有调用XMLHttpRequest的open()方法。

1表示服务器连接已建立,即XMLHttpRequest的open()方法已经调用,但是send()方法未调用。

2表示请求已接收,即XMLHttpRequest的send()方法已经调用,并且已经接收到响应头。

3表示请求处理中,即正在接收响应体。

4表示请求已完成,即已经接收到响应体,并且已经可以使用responseText或responseXML属性获取响应数据。

2.2 status

status属性表示请求的结果,取值从100到599。常见的状态码有200表示OK,404表示Not Found,500表示Internal Server Error等。

3. AJAX 请求过程

在使用AJAX发送请求时,需要创建XMLHttpRequest对象,设置回调函数并发送请求。

3.1 创建XMLHttpRequest对象

在JavaScript中可以使用XMLHttpRequest对象创建AJAX请求。在创建XMLHttpRequest对象之前,需要检测浏览器是否支持该对象。在现代浏览器中,几乎所有浏览器都支持XMLHttpRequest对象。

function createXHR() {

if (typeof XMLHttpRequest != "undefined") {

return new XMLHttpRequest();

} else if (typeof ActiveXObject != "undefined") {

if (typeof arguments.callee.activeXString != "string") {

var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp"],

i, len;

for (i = 0, len = versions.length; i < len; i++) {

try {

new ActiveXObject(versions[i]);

arguments.callee.activeXString = versions[i];

break;

} catch (ex) {

// skip

}

}

}

return new ActiveXObject(arguments.callee.activeXString);

} else {

throw new Error("No XHR object available.");

}

}

上面的代码中,首先判断是否支持XMLHttpRequest对象,如果支持则直接返回XMLHttpRequest对象。如果不支持,则判断是否支持ActiveXObject对象(IE浏览器专用)。如果支持,则使用ActiveXObject对象创建XMLHttpRequest对象。

3.2 设置回调函数

在发送AJAX请求之前,需要设置回调函数。回调函数在状态发生变化的时候被执行。

var xhr = createXHR();

xhr.onreadystatechange = function() {

if (xhr.readyState == 4) {

if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {

alert(xhr.responseText);

} else {

alert("Request was unsuccessful: " + xhr.status);

}

}

};

上面的代码中,设置回调函数为匿名函数。在状态变化的时候,如果状态为4(即请求已完成),则根据status的值来判断请求的结果。

如果状态码为200到299或304,则表示请求成功,通过xhr.responseText属性获取响应数据。

如果状态码不在200到299之间,或者等于404等错误码,则表示请求失败,通过xhr.status获取错误信息。

3.3 发送请求

在设置回调函数之后,就可以调用XMLHttpRequest对象的open()和send()方法来发送请求。

xhr.open("get", "example.php", true);

xhr.send(null);

上面的代码中,调用open()方法设置请求方法(get或post)、请求URL和同步或异步请求模式。调用send()方法发送请求,如果是get请求,则send()方法的参数为null。

4. 总结

本文介绍了AJAX中请求的不同就绪状态,包括readyState和status两个属性的含义。同时,也介绍了AJAX请求的过程,包括创建XMLHttpRequest对象、设置回调函数和发送请求。

在使用AJAX时,需要注意回调函数的设置和请求体的数据格式(如JSON、XML等)。同时也需要注意AJAX的跨域问题和安全性问题。