`

XMLHttpRequest().readyState的五种状态详解

阅读更多

在《Pragmatic Ajax A Web 2.0 Primer 》中偶然看到对readyStae状态的介绍,感觉这个介绍很实在,摘译如下:

0: (Uninitialized) the send( ) method has not yet been invoked.
1: (Loading) the send( ) method has been invoked, request in progress.
2: (Loaded) the send( ) method has completed, entire response received.
3: (Interactive) the response is being parsed.
4: (Completed) the response has been parsed, is ready for harvesting.

0 - (未初始化)还没有调用send()方法
1 - (载入)已调用send()方法,正在发送请求
2 - (载入完成)send()方法执行完成,已经接收到全部响应内容
3 - (交互)正在解析响应内容
4 - (完成)响应内容解析完成,可以在客户端调用了

对于readyState的这五种状态,其他书中大都语焉不详。像《Foundations of Ajax》中,只在书中的表2-2简单地列举了状态的“名称”--The state of the request. The five possible values are 0 = uninitialized, 1 = loading, 2 = loaded, 3 = interactive, and 4 = complete。而《Ajax in Action》中好像根本就没有提到这5种状态的细节。《Professional Ajax》中虽不尽人意,但还是有可取之处:

There are five possible values for readyState:
0 (Uninitialized): The object has been created but the open() method hasn’t been called.
1 (Loading): The open() method has been called but the request hasn’t been sent.
2 (Loaded): The request has been sent.
3 (Interactive). A partial response has been received.
4 (Complete): All data has been received and the connection has been closed.

readyState有五种可能的值:
0 (未初始化): (XMLHttpRequest)对象已经创建,但还没有调用open()方法。
1 (载入):已经调用open() 方法,但尚未发送请求。
2 (载入完成): 请求已经发送完成。
3 (交互):可以接收到部分响应数据。
4 (完成):已经接收到了全部数据,并且连接已经关闭。

在《Understanding AJAX: Using JavaScript to Create Rich Internet Applications》中,则用下表进行了说明:

readyState Status Code
Status of the XMLHttpRequest Object
(0) UNINITIALIZED
未初始化 The object has been created but not initialized. (The open method has not been called.)
(XMLHttpRequest)对象已经创建,但尚未初始化(还没有调用open方法)。
(1) LOADING
载入 The object has been created, but the send method has not been called.
(XMLHttpRequest)对象已经创建,但尚未调用send方法。
(2) LOADED
载入完成 The send method has been called, but the status and headers are not yet available.
已经调用send方法,(HTTP响应)状态及头部还不可用。
(3) INTERACTIVE
交互 Some data has been received. Calling the responseBody and responseText properties at this state to obtain partial results will return an error, because status and response headers are not fully available.
已经接收部分数据。但若在此时调用responseBody和responseText属性获取部分结果将会产生错误,因为状态和响应头部还不完全可用。
(4) COMPLETED
完成 All the data has been received, and the complete data is available in the responseBody and responseText properties.
已经接收到了全部数据,并且在responseBody和responseText属性中可以提取到完整的数据。

根据以上几本书中的关于readyState五种状态的介绍,我认为还是《Pragmatic Ajax A Web 2.0 Primer 》比较到位,因为它提到了对接收到的数据的解析问题,其他书中都没有提到这一点,而这一点正是“(3)交互”阶段作为一个必要的转换过程存在于“(2)载入完成”到“(4)完成”之间的理由,也就是其任务是什么。归结起来,我觉得比较理想的解释方法应该以“状态:任务(目标)+过程+表现(或特征)”表达模式来对这几个状态进行定义比较准确,而且让人容易理解。现试总结如下:

readyState 状态
状态说明

(0)未初始化
此阶段确认XMLHttpRequest对象是否创建,并为调用open()方法进行未初始化作好准备。值为0表示对象已经存在,否则浏览器会报错--对象不存在。

(1)载入
此阶段对XMLHttpRequest对象进行初始化,即调用open()方法,根据参数(method,url,true)完成对象状态的设置。并调用send()方法开始向服务端发送请求。值为1表示正在向服务端发送请求。

(2)载入完成
此阶段接收服务器端的响应数据。但获得的还只是服务端响应的原始数据,并不能直接在客户端使用。值为2表示已经接收完全部响应数据。并为下一阶段对数据解析作好准备。

(3)交互
此阶段解析接收到的服务器端响应数据。即根据服务器端响应头部返回的MIME类型把数据转换成能通过responseBody、responseText或responseXML属性存取的格式,为在客户端调用作好准备。状态3表示正在解析数据。

(4)完成
此阶段确认全部数据都已经解析为客户端可用的格式,解析已经完成。值为4表示数据解析完毕,可以通过XMLHttpRequest对象的相应属性取得数据。


概而括之,整个XMLHttpRequest对象的生命周期应该包含如下阶段:
创建-初始化请求-发送请求-接收数据-解析数据-完成

在具体应用中,明确了readyState的五个状态(XMLHttpRequest对象的生命周期各个阶段)的含义,就可以消除对Ajax核心的神秘感(语焉不详的背后要么是故弄玄虚,制造神秘感;要么就是“以其昏昏,使人昭昭”),迅速把握其实质,对减少学习中的挫折感和增强自信心都极其有益。

比如,通过如下示例:


//声明数组
var states = [“正在初始化……”,
“正在初始化请求……成功!
正在发送请求……”,
“成功!
正在接收数据……”,
“完成!
正在解析数据……”,
“完成!
”];

//回调函数内部代码片段
if (xmlHttp.readyState==4)
{
var span = document.createElement(“span”);
span.innerHTML = states[xmlHttp.readyState];
document.body.appendChild(span);

if (xmlHttp.status == 200)
{
var xmldoc = xmlHttp.responseXML;
//其他代码
}

//别忘记销毁,防止内存泄漏
xmlHttp = null;
}else{
var span = document.createElement(“span”);
span.innerHTML = states[xmlHttp.readyState];
document.body.appendChild(span);
}结果如下:

正在初始化请求……成功!
正在发送请求……成功!
正在接收数据……完成!
正在解析数据……完成!

我们很容易明白XMLHttpRequest对象在各个阶段都在做什么。因此,也就很容易对Ajax的核心部分有一个真正简单明了的理解。

原文连接:

http://javathinker.blog.ccidnet.com/blog-htm-itemid-1262479-do-showone-type-blog-uid-36384.html

分享到:
评论

相关推荐

    window.XMLHttpRequest详解(AJAX工作原理)1

    - **状态管理**:`XMLHttpRequest`对象的状态是通过`readyState`属性进行跟踪的,该属性有五个可能的值: - `0`:未初始化状态。对象已经创建,但尚未调用`open()`方法。 - `1`:打开状态。已经调用了`open()`方法...

    window.XMLHttpRequest详解

    状态可以通过`readyState`属性获取,共五个状态: 1. 0 (UNSENT):对象已创建,但未初始化 2. 1 (OPENED):`open()`方法已被调用 3. 2 (HEADERS_RECEIVED):请求已发送,头部信息已接收 4. 3 (LOADING):正在接收...

    Ajax之XMLHttpRequest详解

    ### Ajax之XMLHttpRequest详解 #### 一、引言 随着互联网技术的发展,用户对Web应用的体验要求越来越高。传统的Web应用程序通常采用请求/响应模型,这意味着每次用户与页面交互(例如点击按钮)都会触发一个新的...

    ajax readyState的五种状态详解

    以下是关于AJAX `readyState`五种状态的详细解释: 1. **未初始化 (0)**: 这是`XMLHttpRequest`对象创建后的初始状态。在这个状态下,`open()`方法尚未被调用,请求还未开始。此时,开发者通常会设置请求的URL、...

    window.XMLHttpRequest详解(AJAX工作原理)2

    ### window.XMLHttpRequest详解(AJAX工作原理) #### 一、简介 `window.XMLHttpRequest` 是一个内置对象,用于在浏览器端发起异步 HTTP 请求。它主要用于实现 AJAX (Asynchronous JavaScript and XML) 功能,允许...

    XmlHttpRequest对象直接访问与通过Soap协议访问WebSevice详解示例

    创建一个XMLHttpRequest实例,然后设置其onreadystatechange事件处理器,当请求状态改变时,该处理器会被调用。状态代码400到599表示错误,200表示成功。接着,调用open()方法指定请求类型(GET或POST),URL以及...

    XMLHttpRequest对象手册.pdf

    ### XMLHttpRequest对象详解 #### 一、引言 随着互联网技术的发展与演进,网页应用从简单的静态页面逐渐向动态交互式应用转变。其中,Ajax(Asynchronous JavaScript and XML)技术的出现极大地推动了这一进程。**...

    XMLHttpRequest

    ### XMLHttpRequest与DWR AJAX异步请求详解 #### 一、XMLHttpRequest简介 `XMLHttpRequest`是一种在浏览器端执行异步请求的技术,它允许网页在不重新加载整个页面的情况下与服务器交换数据并更新部分页面内容。这...

    Ajax状态值详解

    Ajax的状态值是XMLHttpRequest对象的属性`readyState`,它表示请求/响应的当前状态。状态值分为五个阶段,每个阶段都有其特定的数值: 1. `readyState = 0`: 请求未初始化。XMLHttpRequest对象已经创建,但尚未调用...

    XMLHttpRequest对象详解

    XMLHttpRequest对象的工作原理分为五个阶段: 1. **创建对象**:首先,我们需要在JavaScript中创建一个新的XMLHttpRequest实例,通常通过`new XMLHttpRequest()`来完成。 2. **初始化请求**:然后,调用`open()`...

    XmlHttpRequest详解

    4. **监听状态变化**:使用`onreadystatechange`事件处理程序跟踪请求的状态。当`readyState`属性从4(表示请求完成)时,可以检查`status`属性(如200表示成功,404表示未找到等)。 5. **接收响应**:通过`...

    ajax 的状态原理详解!

    #### AJAX的四种状态详解 1. **未初始化 (0)** 当`XMLHttpRequest`对象被创建后,但还没有调用`open()`方法时,其`readyState`属性的值为0。这表示请求尚未开始。此时,对象处于初始状态,没有执行任何操作或设置...

    XMLHttpRequest对象

    ### XMLHTTPRequest对象详解 在现代Web开发中,Ajax(Asynchronous JavaScript and XML)技术的应用非常广泛,它使得网页能够实现局部刷新,提升了用户体验。而这一切的基础便是`XMLHttpRequest`对象,一个用于在...

    XMLHTTPREQUEST

    ### XMLHTTPRequest对象详解 在现代Web开发中,客户端与服务器之间的数据交换是非常常见的需求之一。为了实现这种异步数据通信,JavaScript提供了一种强大的工具——`XMLHTTPRequest`对象。通过这个对象,开发者...

    XMLHTTPRequest对象详解

    `readyState`表示请求的当前状态,从0(未初始化)到4(完成)。通常,我们关注`readyState`为4的情况,此时请求已完成,可以获取响应数据。 5. **获取响应**: 一旦请求完成,可以通过`responseText`或`...

    全面剖析XMLHttpRequest对象

    该属性共有五种状态,分别对应不同的数值: - `0`:未初始化,即尚未调用`open()`方法。 - `1`:打开,已调用`open()`但尚未调用`send()`。 - `2`:发送,已调用`send()`但尚未接收到响应。 - `3`:接收,开始接收...

    Ajax中XmlHttpRequest实例笔记

    **Ajax中的XmlHttpRequest详解** Ajax(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。核心在于使用JavaScript与服务器进行异步数据交换,并且利用浏览器内置...

Global site tag (gtag.js) - Google Analytics