全面剖析XMLHttpRequest对象

全面剖析XMLHttpRequest

  XMLHttpRequest象是当今所有AJAXWeb 2.0用程序的技。尽管经销商和开源社团现在都在提供各种AJAX框架以一步XMLHttpRequest象的使用;但是,我仍然很有必要理解象的详细工作机制

 一、 引言

  异步JavaScriptXML(AJAX)是一个术语,用于实现在客端脚本与服器之的数据交互程。一技点在于,它向开者提供了一种从Web索数据而不必把用当前正在察的面回馈给器。与浏览器的通存取浏览DOM构的程代(JavaScript)动态地改示内容的支持相配合,AJAX者在浏览器端更新被示的HTML内容而不必刷新面。话说AJAX可以使基于浏览器的用程序更具交互性而且更传统型桌面用程序

  AJAX利用一个构建到所有浏览器内部的-XMLHttpRequest-实现发送和接收HTTP求与响信息。一个XMLHttpRequest送的HTTP求并不要求面中有或回寄一个<form>元素。AJAX中的"A"代表了"异步"意味着XMLHttpRequest象的send()方法可以立即返回,从而Web面上的其它HTML/JavaScript继续浏览器端理而由服HTTP求并送响。尽管缺省情况下求是异步行的,但是,你可以选择发送同步求,将会停其它Web面的理,直到该页面接收到服器的响应为

本文将XMLHttpRequestAPI详细讨论,并将解其所有的属性和方法。

  二、 XMLHttpRequest象的属性和事件

  XMLHttpRequest象暴露各种属性、方法和事件以便于脚本理和控制HTTP求与响。下面,我此展开详细讨论


readyState
属性

  当XMLHttpRequest象把一个HTTP送到服经历若干种状:一直等待直到求被理;然后,它才接收一个响这样以来,脚本才正确响各种状-XMLHttpRequest象暴露一个描述象的当前状readyState属性,如表格1所示。

  表格1.XMLHttpRequest象的ReadyState属性列表。

ReadyState

描述

0

描述一种"未初始化";此,已经创建一个XMLHttpRequest象,但是没有初始化

1

描述一种"";此,代经调用了XMLHttpRequest open()方法并且XMLHttpRequest好把一个送到服

2

描述一种"";此,已send()方法把一个送到服器端,但是没有收到一个响

3

描述一种"正在接收";此,已接收到HTTP应头部信息,但是消息体部分没有完全接收

4

描述一种"已加";此,响被完全接收


  onreadystatechange事件

  无readyState时发生改XMLHttpRequest象都会激一个readystatechange事件。其中,onreadystatechange属性接收一个EventListener-方法指示无readyState时发生改该对象都将激活。

  responseText属性(readonly string)

  responseText属性包含客端接收到的HTTP的文本内容。当readyState值为012responseText包含一个空字符串。当readyState值为3(正在接收),响中包含客未完成的响信息。当readyState4(已加)responseText包含完整的响信息。

  responseXML属性(readonly Document)

  此responseXML属性用于当接收到完整的HTTP应时(readyState4)描述XML;此Content-Type部指定MIME(媒体)text/xmlapplication/xml或以+xml尾。如果Content-Type部并不包含些媒体型之一,那么responseXML值为null。无,只要readyState4,那么responseXMLnull

  其responseXML属性是一个文档接口型的象,用来描述被分析的文档。如果文档不能被分析(例如,如果文档不是良构的或不支持文档相的字符编码),那么responseXMLnull

  status属性(readonly short)

  status属性描述了HTTP,而且其short。而且,readyState值为3(正在接收中)4(已加)status属性才可用。当readyState小于3时试图存取status将引一个异常。

  statusText属性(readonly string)

  statusText属性描述了HTTP文本;并且readyState值为34才可用。当readyState其它值时试图存取statusText属性将引一个异常也就是说,当状态为200的时候它是“OK”,当状态为404的时候它是“Not Found”。

三、 XMLHttpRequest象的方法

  XMLHttpRequest象提供了各种方法用于初始化和HTTP求,下列将逐个展开详细讨论

  abort()方法

  你可以使用abort()方法来停与一个XMLHttpRequest象相系的HTTP求,从而把该对象复位到未初始化状

  open()方法

  你需要open(DOMString methodDOMString uriboolean asyncDOMString usernameDOMString password)方法初始化一个XMLHttpRequest象。其中,method参数是必提供的-用于指定你想用来求的HTTP方法(GETPOSTPUTDELETEHEAD)了把数据送到服器,应该使用POST方法;了从服器端索数据,应该使用GET方法。另外,uri参数用于指定XMLHttpRequest象把送到的服器相URI。借助于window.document.baseURI属性,uri被解析一个绝对URI-话说,你可以使用相URI-它将使用与浏览器解析相URI的方式被解析。async参数指定是否求是异步的-缺省值为true送一个同步求,需要把个参数false于要求认证的服器,你可以提供可的用名和口令参数。在open()方法后,XMLHttpRequest象把它的readyState属性1(打开)并且把responseTextresponseXMLstatusstatusText属性复位到它的初始。另外,它复位部。注意,如果你open()方法并且此readyState4XMLHttpRequest象将复位

  send()方法

  在通过调open()方法准好一个求之后,你需要把该请送到服器。readyState值为1,你才可以send()方法;否XMLHttpRequest象将引一个异常。该请求被使用提供open()方法的参数送到服器。当async参数truesend()方法立即返回,从而允其它客端脚本继续。在send()方法后,XMLHttpRequest象把readyState值设2()。当服器响应时,在接收消息体之前,如果存在任何消息体的XMLHttpRequest象将把readyState3(正在接收中)。当求完成加载时,它把readyState4(已加)于一个HEAD型的求,它将在把readyState值设3后再立即把它4

  send()方法使用一个可的参数-参数可以包含可变类型的数据。典型地,你使用它并通POST方法把数据送到服器。另外,你可以式地使用null参数send()方法,与不用参数用它一于大多数其它的数据型,在send()方法之前,应该使用setRequestHeader()方法(后面的解)Content-Type部。如果在send(data)方法中的data参数的DOMString,那么,数据将被编码为UTF-8。如果数据是Document型,那么将使用由data.xmlEncoding指定的编码串行化数据。

  setRequestHeader()方法

  setRequestHeader(DOMString headerDOMString value)方法用来求的部信息。当readyState值为1,你可以在open()方法后个方法;否,你将得到一个异常。

  getResponseHeader()方法

  getResponseHeader(DOMString headervalue)方法用于索响readyState34(话说,在响应头部可用以后),才可以个方法;否方法返回一个空字符串。

  getAllResponseHeaders()方法

  getAllResponseHeaders()方法以一个字符串形式返回所有的响应头部(每一个部占独的一行)。如果readyState不是34则该方法返回null

  四、

  在AJAX中,多使用XMLHttpRequest求都是从一个HTML事件(例如一个JavaScript函数的按(onclick)或一个按(onkeypress))中被初始化的。AJAX支持包括表在内的各种用程序。有,在填充表的其它内容之前要求校一个唯一的表域。例如要求使用一个唯一的UserID来注册表。如果不是使用AJAX来校验这UserID域,那么整个表都必被填充和提交。如果UserID不是有效的,个表被重新提交。例如,一个相于一个要求必在服器端行校Catalog ID的表域可能按下列形式指定:

form name="validationForm" action="validateForm" method="post"
table
 <tr><tdCatalog Id:/td
  <td
   <input type="text" size="20" id="catalogId" name="catalogId" autocomplete="off" onkeyup="sendRequest()"
  </td
  <td><div id="validationMessage"></div></td
 </tr
/table></form


  前面的HTML使用validationMessage div示相入域Catalog Id的一个校消息。onkeyup事件用一个JavaScript sendRequest()函数。sendRequest()函数建一个XMLHttpRequest象。建一个XMLHttpRequest象的程因浏览实现的不同而有所区。如果浏览器支持XMLHttpRequest象作一个窗口属性(所有普通的浏览器都是这样的,除了IE 5IE 6之外),那么,代可以XMLHttpRequest的构造器。如果浏览器把XMLHttpRequest实现为一个ActiveXObject(就象在IE 5IE 6中一),那么,代可以使用ActiveXObject的构造器。下面的函数将用一个init()函数,它负责检查并决定要使用的适当的建方法-建和返回象之前。

script type="text/javascript"
function sendRequest(){
 var xmlHttpReq=init();
 function init(){
  if (window.XMLHttpRequest) {
   return new XMLHttpRequest();
  }
 else if (window.ActiveXObject) {
  return new ActiveXObject("Microsoft.XMLHTTP");
 }
}
/script


  接下来,你需要使用Open()方法初始化XMLHttpRequest-指定HTTP方法和要使用的服URL

var catalogId=encodeURIComponent(document.getElementById("catalogId").value);
xmlHttpReq.open("GET"
"validateForm?catalogId=" + catalogId true);


  默情况下,使用XMLHttpRequest送的HTTP求是异步行的,但是你可以式地把async参数true,如上面所展示的。
种情况下,URL validateForm用将激活服器端的一个servlet,但是你应该注意到服器端技不是根本性的;实际上,URL可能是一个ASPASP.NETPHP面或一个Web-无关要,只要该页面能返回一个响-指示CatalogID是否是有效的-即可。因你在作一个异步用,所以你需要注册一个XMLHttpRequest象将用的回事件理器-当它的readyState变时调用。住,readyState的改将会激一个readystatechange事件。你可以使用onreadystatechange属性来注册事件理器。

xmlHttpReq.onreadystatechange=processRequest;


  然后,我需要使用send()方法该请求。因为这求使用的是HTTP GET方法,所以,你可以在不指定参数或使用null参数的情况下send()方法。

xmlHttpReq.send(null);

 五、

  在个示例中,因HTTP方法是GET,所以在服器端的接收servlet用一个doGet()方法,方法将索在URL中指定的catalogId参数,并且从一个数据检查它的有效性。

  本文示例中的servlet需要构造一个送到客端的响;而且,个示例返回的是XML型,因此,它把响HTTP内容text/xml并且把Cache-Controlno-cacheCache-Control部可以阻止浏览简单地从存中重载页面。

public void doGet(HttpServletRequest request
HttpServletResponse response)
throws ServletException
IOException {
 ...
 ...
 response.setContentType("text/xml");
 response.setHeader("Cache-Control" "no-cache");
}


  来自于服器端的响是一个XML DOM象,此象将建一个XML字符串-其中包含要在客理的指令。另外,XML字符串必有一个根元素。

out.println("catalogIdvalid/catalogId");


  【注意】XMLHttpRequest象的设计目的是理由普通文本或XML成的响;但是,一个响也可能是另外一种型,如果用代理(UA)支持种内容型的

  当求状变时XMLHttpRequest用使用onreadystatechange注册的事件理器。因此,在之前,你的事件理器应该首先检查readyStateHTTP。当求完成加readyState值为4)并且响完成(HTTP态为"OK",你就可以用一个JavaScript函数来内容。下列脚本负责在响完成时检查用一个processResponse()方法。

function processRequest(){
 if(xmlHttpReq.readyState==4){
  if(xmlHttpReq.status==200){
   processResponse();
  }
 }
}


  processResponse()方法使用XMLHttpRequest象的responseXMLresponseText属性来HTTP。如上面所解的,当在响的媒体型是text/xmlapplication/xml或以+xmlresponseXML才可用。responseText属性将以普通文本形式返回响于一个XML,你将按如下方式索内容:

var msg=xmlHttpReq.responseXML;


  借助于存msg量中的XML,你可以使用DOM方法getElementsByTagName()元素的

var catalogId=msg.getElementsByTagName("catalogId")[0].firstChild.nodeValue;


  最后,通更新Web面的validationMessage div中的HTML内容并借助于innerHTML属性,你可以测试该元素建一个要示的消息:

if(catalogId=="valid"){
 var validationMessage = document.getElementById("validationMessage");
 validationMessage.innerHTML = "Catalog Id is Valid";
}
else
{
 var validationMessage = document.getElementById("validationMessage");
 validationMessage.innerHTML = "Catalog Id is not Valid";
}


  六、

  上面就是XMLHttpRequest象使用的所有细节实现。通不必把Web面寄送到服器而实现数据送,XMLHttpRequest端与服器之提供了一种动态的交互能力。你可以使用JavaScript一个求并理相的返回,然后使用浏览器的DOM方法更新面中的数据

你可能感兴趣的:(XMLhttpREquest)