JavaScript Ajax基础:XMLHttpRequest对象与HTTP状态码详解

作者:半夏

时间:2026-10-28

浏览:118

本文详解JavaScript中Ajax技术的核心原理,重点讲解XMLHttpRequest对象的创建、跨域限制及open方法的使用。深入剖析同步与异步请求的区别,以及readyState各状态值(0-4)的含义。同时系统梳理HTTP状态码分类(1xx至5xx)及statusText属性,结合代码示例说明GET与POST请求的选择策略,帮助开发者掌握前端数据交互的基础实现。

文章目录

Ajax概述与工作原理

Ajax及其工作原理

AJAX(Asynchronous Javascript And XML)是一种无需刷新整个网页即可与服务器交换数据的技术,该技术最早由Google在谷歌地图中应用并迅速普及。

AJAX默认不支持跨域请求。若需实现跨域,可尝试设置document.domain为相同的主域名(如'a.com'),或通过服务器端代理来转发XMLHttpRequest请求。

AJAX技术基于现有的Internet标准构建,主要联合使用了以下技术:

XMLHttpRequest 对象:用于异步与服务器交换数据; JavaScript/DOM:负责信息的显示与交互; CSS:用于定义数据的样式; XML:作为数据传输的格式。

Ajax概述与工作原理

XMLHttpRequest对象的创建与连接

创建 XMLHttpRequest 对象

现代浏览器(包括IE7及以上版本、Firefox、Chrome、Safari以及Opera)均原生支持 XMLHttpRequest 对象。

创建Ajax对象:

//IE6以上版本 var oAjax = new XMLHttpRequest();

//IE6版本 var oAjax = new ActiveXObject("Microsoft.XMLHTTP"); 连接服务器

oAjax.open(方法, url, 是否异步) Ajax全称为“Asynchronous Javascript And XML”(异步JavaScript和XML),旨在创建交互式网页应用。因此,Ajax默认工作在异步模式下(即第三个参数为true,若为false则为同步模式)。

同步与异步请求机制

同步和异步

同步是指:发送方发出数据后,必须等待接收方发回响应,才能发送下一个数据包。 异步是指:发送方发出数据后,无需等待接收方响应,即可继续发送下一个数据包。 简单来说:同步操作是串行执行的,而异步操作允许并发进行。

发送请求send()

代码如下:

<script type="text/javascript">
function getDoc(){
var xmlhttp;
if(window.xmlhttpRequest){
xmlhttp=new XMLHttpRequest();
    }
else{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");//for IE6
    }
xmlhttp.onreadystatechange = function(){
if(xmlhttp.readyState==4&&xmlhttp.status==200){
document.getElementById("myId").innerHTML=xmlhttp.responseText;
        }
    }
xmlhttp.open("GET", index.php,true);
xmlhttp.send();
}
</script>
</head>
<body>
<button type="button" onclick="getDoc()">请求数据</button>
</body>

GET与POST请求的选择

GET 还是 POST?

与 POST 相比,GET 请求更简单且速度更快,在大多数场景下均可使用。

然而,在以下情况中,建议使用 POST 请求:

无法使用缓存文件(例如需要更新服务器上的文件或数据库); 向服务器发送大量数据(POST 请求没有数据量限制); 发送包含未知字符的用户输入时,POST 比 GET 更稳定且可靠。

请求状态监听与XHR对象详解

oAjax.onreadystatechange = function(){ //当请求状态改变时要调用的事件处理器

alert(oAjax.readystate);

} 只要readyState属性的值发生变化,便会触发一次readyStatechange事件。利用该事件可以检测每次状态变化后的readyState值。通常,我们只关注readyState值为4的阶段,因为此时所有数据已就绪。注意,必须在调用open()之前指定onreadystatechange事件处理程序,以确保跨浏览器兼容性。示例如下:

代码如下:

var xhr = createXHR();
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
alert(xhr.statusText);
} else {
alert("Request was unsuccessful: " + xhr.status);
        }
    }
};
xhr.open("get", "example.txt", true);
xhr.send(null);

HTTP状态码与响应文本解析

XHR对象

当XHR对象将HTTP请求发送到服务器时,会经历几个状态,直到请求被处理并接收回应。readyState是XHR请求的状态属性,包含5个状态值:

0(未初始化):尚未调用open()方法; 1(载入):已调用send()方法,正在发送请求; 2(载入完成):send()方法执行完毕,已收到全部响应内容; 3(解析):正在解析响应内容; 4(完成):响应内容解析完成,客户端可使用。

status属性表示从服务器返回的响应状态码。例如:200表示成功,404表示未找到资源。

1字头:消息。表示请求已被接受,需要继续处理。 2字头:成功。表示请求已成功被服务器接收、理解并接受。 3字头:重定向。表示需要客户端采取进一步操作才能完成请求。 4字头:客户端错误。表示客户端可能出错,妨碍了服务器处理。 5字头:服务器错误。表示服务器在处理请求过程中发生错误或异常。

另附:http状态码详解

statusText

statusText是响应返回的文本信息,仅在readyState值为3或4时可用。当readyState为其他值时,访问statusText属性将引发异常。

XHR的方法

方法 描述
abort() 导致当前正在执行的请求被取消
getAllResponseHeaders() 返回包含所有响应头的名称和值的单个字符|串
getResponseHeader(name) 返回响应头中指定的名称和值
open(method,url,async,username,pwd) 设置HTTP方法(get或post)等
send(content) 发出带有指定主体内容的请求
setRequestHeader(name,value) 使用指定的名称和值设置请求头

代码如下:

<script type="text/javascript">
var oAjax =oAjax();
alert(oAjax.readyState);//弹出"0"
oAjax.open("get","index.html",true);
alert(oAjax.readyState);//弹出"1"
oAjax.send(null);
alert(oAjax.readyState);//IE下弹出4,而firefox是2
//可以通过readystatechange事件监听
oAjax = XHR();
oAjax.onreadystatechange = function () {
alert(oAjax.readyState);//Firefox下依次是1,2,3,4但最后还会再来个1
//IE下则是1,1,3,4
        };
oAjax.open("get","index.txt",true);
oAjax.send(null);
</script>

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章