信息交流、传播、提炼

nice to meet you

博客园 首页 新随笔 联系 订阅 管理

对于readyState的五种状态的描述或者说定义,很多Ajax书(英文原版)中大都语焉不详

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

比较理想的解释方法应该以“状态:任务(目标)+过程+表现(或特征)”的表达模式来对这几个状态进行定义

【全文】

在《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》中,则用下表进行了说明:

表1. readyState Levels

 

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)完成”之间的理由,也就是其任务是什么。归结起来,我觉得比较理想的解释方法应该以“状态:任务(目标)+过程+表现(或特征)”表达 模式来对这几个状态进行定义比较准确,而且让人容易理解。现试总结如下:

表2. readyState 状态详解

 

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的核心部分有一个真正简单明了的

 

 

Ajax中,XMLHttpRequest对象的status属性一般用来返回服务器的HTTP状态码。status为200表示“成功”,status为404代表“页面未找到”。很多书上都是这样写的,一点也不错。

  但是,有时候,特别是刚开始学Ajax的时候,可能会将代码直接在本地运行。这样就出现问题了。如果在本地运行(如:C:\ajax\helloworld.htm),那么status属性不管是在“成功”还是“页面未找到”的情况下,都返回的是0,而不是200和404。这个时候如果还用if(xmlHttp.status==200)来判断运行,则会毫无结果。如果要在本地测试,最好写成if(xmlHttp.status==200 || xmlHttp.status==0)的形式来判断。

  就像我前面所说的,这并不是说很多书或文章里写错了。因为这些文章里都写的是从服务器返回状态,而并没有说从本地返回的情况,应该算是漏掉了吧。

下面把STATUS各个值所代表的状态列出来:

XMLHTTP中

xmlHttp.status=0
xmlHttp.status=200
xmlHttp.status=500
等等;
对应的HTTP的状态,见下表:

status状态值
长整形标准http状态码,定义如下: Number Description
100 Continue
101 Switching protocols
200 OK
201 Created
202 Accepted
203 Non-Authoritative Information
204 No Content
205 Reset Content
206 Partial Content
300 Multiple Choices
301 Moved Permanently
302 Found
303 See Other
304 Not Modified
305 Use Proxy
307 Temporary Redirect
400 Bad Request
401 Unauthorized
402 Payment Required
403 Forbidden
404 Not Found
405 Method Not Allowed
406 Not Acceptable
407 Proxy Authentication Required
408 Request Timeout
409 Conflict
410 Gone
411 Length Required
412 Precondition Failed
413 Request Entity Too Large
414 Request-URI Too Long
415 Unsupported Media Type
416 Requested Range Not Suitable
417 Expectation Failed
500 Internal Server Error
501 Not Implemented
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
505 HTTP Version Not Supported

 

一共两局部:

XMLHTTP(readyState,status)对应的事态值 XmlHttp的属性措施列表

 

正文:

 

 

XMLHTTP(readyState,status)对应的事态值 status事态值
长美容规范http事态码,定义如下:NumberDescription
100Continue
101Switchingprotocols
200OK
201Created
202Accepted
203Non-AuthoritativeInformation
204NoContent
205ResetContent
206PartialContent
300MultipleChoices
301MovedPermanently
302Found
303SeeOther
304NotModified
305UseProxy
307TemporaryRedirect
400BadRequest
401Unauthorized
402PaymentRequired
403Forbidden
404NotFound
405MethodNotAllowed
406NotAcceptable
407ProxyAuthenticationRequired
408RequestTimeout
409Conflict
410Gone
411LengthRequired
412PreconditionFailed
413RequestEntityTooLarge
414Request-URITooLong
415UnsupportedMediaType
416RequestedRangeNotSuitable
417ExpectationFailed
500InternalServerError
501NotImplemented
502BadGateway
503ServiceUnavailable
504GatewayTimeout
505HTTPVersionNotSupported


readyState的GXG事态值
0(未初始化)对象已发生,然而尚未初始化(尚未调用open措施)
1(初始化)对象已发生,尚未调用send措施
2(发送数据)send措施已调用,然而目前的事态及http头未知
3(数据递交中)已接收局部数据,因为响应及http头不全,这时穿越responseBody和responseText获得局部数据会揭示讹谬,
4(告终)数据接收告终,此刻能够穿越穿越responseBody和responseText获得全面的响应数据
XmlHttp的属性措施列表

注suk.ieltsuk.org:里面的链接都曾经失效,就不关键了。

属性:

onreadystatechange* 指定当readyState属性改换时的事件处理句柄。只写 readyState 归来目前请求的事态,只读. responseBody 将响应消息正文以unsigned byte数组形式归来.只读 responseStream 以Ado Stream对象的形式归来声应消息。只读 responseText 将响应消息作为字符串归来.只读 responseXML 将响应消息款式化为Xml Document对象并归来,只读 status 归来目前请求的http事态码.只读 statusText 归来目前请求的响应行事态,只读

* 表示此属性是W3C文档对象模型的伸展. 措施:

abort 废止目前请求 getAllResponseHeaders 获得响应的所有http头 getResponseHeader 从响应消息中获得指定的http头 open 创立一个新的http请求,并指定此请求的措施、URL以及检讨消息(用户名/密码) send 发送请求到http服务器并接收响应 setRequestHeader 独自指定请求www.okclick1.info的某个http头

 

posted on 2011-11-29 17:34  seeyou  阅读(430)  评论(0)    收藏  举报