会员中心
用户名:    密码:    验证码:      免费注册会员

jquery手册   CSS2手册       请关注健康

CSSer > 客户端开发 > web标准与前台开发 > 从readyState状态看AJAX

来源:博客园 作者: 发布时间:2007-11-23
雅虎收藏夹 百度收藏 Google书签 Yahoo书签 新浪ViVi 搜狐网摘 365Key网摘 天极网摘 diglog 和讯网摘 POCO网摘 YouNote网摘 博拉网 天下图摘 Del.icio.us digg reddit spurl BlinkList blogmarks
  从readyState状态看AJAX。在《Pragmatic AJAX A Web 2.0Primer》中偶然看到对readyStae状态的介绍,感觉这个介绍很实在,摘译如下:

 


  0: Uninitialized the send method has not yet been invoked.


  1: Loading the send method has been invoked, requestinprogress.


  2: Loaded the send method has completed, entireresponsereceived.


  3: Interactive the response is being parsed.


  4: Completed the response has been parsed, is readyforharvesting.


  0 - 未初始化还没有调用send方法


  1 - 载入已调用send方法,正在发送请求


  2 - 载入完成send方法执行完成,已经接收到全部响应内容


  3 - 交互正在解析响应内容


  4 - 完成响应内容解析完成,可以在客户端调用了


  对于readyState的这五种状态,其他书中大都语焉不详。像《FoundationsofAJAX》中,只在书中的表2-2简单地列举了状态的“名称”--The state of the request. Thefivepossible values are 0 = uninitialized, 1 = loading, 2 = loaded,3 =interactive, and 4 = complete。而《AJAXinAction》中好像根本就没有提到这5种状态的细节。


  《Professional Ajax》中虽不尽人意,但还是有可取之处:


  There are five possible values for readyState:


  0 Uninitialized: The t has been created but the open methodhasn’tbeen called.


  1 Loading: The open method has been called but the requesthasn’tbeen 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 hasbeenclosed.


  readyState


  有五种可能的值:


  0 未初始化: XMLHttpRequest对象已经创建,但还没有调用open方法。


  1 载入:已经调用open 方法,但尚未发送请求。


  2 载入完成: 请求已经发送完成。


  3 交互:可以接收到部分响应数据。


  4 完成:已经接收到了全部数据,并且连接已经关闭。


  在《Understanding AJAX: Using t to Create RichInternetApplications》中,则用下表进行了说明:


  readyState


  Status Code


  Status of the XMLHttpRequest t


  0 UNINITIALIZED 未初始化


  The t has been created but not initialized. The open methodhasnot been called.


  XMLHttpRequest对象已经创建,但尚未初始化还没有调用open方法。


  1 LOADING 载入


  The t has been created, but the send method has notbeencalled.


  XMLHttpRequest对象已经创建,但尚未调用send方法。


  2 LOADED 载入完成


  The send method has been called, but the status and headersarenot yet available.


  已经调用send方法,HTTP响应状态及头部还不可用。


  3 INTERACTIVE 交互


  Some data has been received. Calling the responseBodyandresponseText properties at this state to obtain partialresultswill return an error, because status and response headersare notfully available.


  已经接收部分数据。但若在此时调用responseBody和responseText属性获取部分结果将会产生错误,因为状态和响应头部还不完全可用。


  4 COMPLETED 完成


  All the data has been received, and the complete data isavailablein the responseBody and responseText properties.


  已经接收到了全部数据,并且在responseBody和responseText属性中可以提取到完整的数据。


  根据以上几本书中的关于readyState五种状态的介绍,我认为还是《Pragmatic AJAX A Web2.0Primer》比较到位,因为它提到了对接收到的数据的解析问题,其他书中都没有提到这一点,而这一点正是“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核心的神秘感语焉不详的背后要么是故弄玄虚,制造神秘感;要么就是“以其昏昏,使人昭昭”,迅速把握其实质,对减少学习中的挫折感和增强自信心都极其有益。


  比如,通过如下示例:


  以下是引用片段:


  //声明数组


  varstates=正在初始化……,


  正在初始化请求……成功!


  正在发送请求……,


  成功!


  正在接收数据……,


  完成!


  正在解析数据……,


  完成!


  ;


  //回调函数内部代码片段


  ifxmlHttp.readyState4


  span.innerHTML=statesxmlHttp.readyState;


  ifxmlHttp.status200


  varxmldoc=xmlHttp.responseXML;


  //其他代码


  //别忘记销毁,防止内存泄漏


  xmlHttp=null;


  else


  span.innerHTML=statesxmlHttp.readyState;


  结果如下:


  以下是引用片段:


  正在初始化请求……成功!


  正在发送请求……成功!


  正在接收数据……完成!


  正在解析数据……完成!


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


  附:


  Example 1


  readyState


  返回XMLHTTP请求的当前状态


  语法 lValue = oXMLHttpRequest.readyState;


  以下是引用片段:


  varXmlHttp;


  XmlHttp=newActiveXtMsxml2.XMLHTTP.3.0;


  nsend


  XmlHttp.onreadyStatechange=doHttpreadyStateChange;


  XmlHttp.send;


  ndoHttpreadyStateChange


  ifXmlHttp.readyState4


  alertDone;


  备注 变量,此属性只读,状态用长度为4的整型表示.定义如下:


  0 未初始化 对象已建立,但是尚未初始化尚未调用open方法


  1 初始化 对象已建立,尚未调用send方法


  2 发送数据 send方法已调用,但是当前的状态及http头未知


  3数据传送中已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误


  4 完成 数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据


  Example 2


  下面这个范例说明如何在运行时以 VBt 代码读取 RDS.DataControl 对象的readyState属性。readyState 为只读属性。


  要测试该范例,请剪切该代码并粘贴到标准HTML文档的<Body></Body>标记之间,然后将其命名为“ADCapi9.asp”,ASP脚本将标识服务器。


  以下是引用片段:


  <Center>


  <H2>RDSAPICodeExamples</H2>


  <HR>


  <H3>RDS.DataControlreadyStateproperty</H3>


  </Center>


  <!--在运行时设置参数的RDS.DataControl-->


  <Tclassid=clsid:BD96C556-65A3-11D0-983A-00C04FC29E33


  ID=ADC>


  <MNAME=SQLVALUE=Select*fromEmployeeforbrowse>


  <MNAME=SERVERVALUE=http://<%=Request.ServerVariablesSERVER_NAME%>>


  <MNAME=CONNECTVALUE=dsn=ADCDemo;UID=ADCDemo;PWD=ADCDemo;>


  <MNAME=ExecuteOptionsVALUE=adcExecAsync>


  <MNAME=FetchOptionsVALUE=adcFetchAsync>


  </T>


  <tLanguage=VBt>


  SubWindow_OnLoad


  SelectCaseADC1.readyState


  case2:MsgBoxExecutingQuery


  case3:MsgBoxFetchingrecordsinbackground


  case4:MsgBoxAllrecordsfetched


  EndSelect


  EndSub


  </t>


相关文章

  • 网站成功的26条定律

    1.250定律 拉德认为:每一位顾客身后,大体有250名亲朋好友。如果您赢得了一位顾客的好感,就意味着赢得了250个人的好感;

  • 慎用XHTML标签的自关闭写法

    XHTML 里面的img标记应该这样写:img alt= src= /,这种写法也就是所谓的自关闭,在XML中是完全合法的写法。如果你熟悉XML

  • SWFObject: 基于Javascript的Flash媒体版本检测与嵌

    SWFObject: 基于Javascript的Flash媒体版本检测与嵌入模块 原文: SWFObject: Javascript Flash Player detection and emb

  • JavaScript的9个陷阱及评点

    以下是JavaScript容易犯错的九个陷阱。虽然不是什么很高深的技术问题,但注意一下,会使您的编程轻松些,即所谓make life

  • 用户体验(UE)的3个关键

    先不说什么是好的用户体验――最差的用户体验是引发了用户不知道该做什么的挫折感。可以从两个方面证明上述判断:第一,从

  • HTML用INS和DEL标记文档改变

    ins和del 是在HTML4.0时引入的,可以帮助创作者开发文档时相互合作,并且也保持了一些编辑(比如可以反应创作者是一段时间

  • 可用性 usability

    技术发展会使技术产品的使用变得日益复杂,有时还背离其初衷,走入为技术而技术的误区。因此,如何使产品符合用户需求、方

  • 易用性就这三条原则

    第一次走到新的办公室,透过落地的巨大玻璃门,可以看到里面的会议室。习惯的去推门,同时脚步并没有停下来。 结果。。。