1、XMLHTTPRequest对象什么是?
最通用的定义为:XmlHttp是一套可以在Javascript、VbScript、Jscript等脚本语言中通过http协议传送或从接收XML及其他数据的一套API。XmlHttp最大的用处是可以更新网页的部分内容而不需要刷新整个页面。(这个功能正是AJAX的一大特点之一:))
来自MSDN的解释:XmlHttp提供客户端同http服务器通讯的协议。客户端可以通过XmlHttp对象(MSXML2.XMLHTTP.3.0)向http服务器发送请求并使用微软XML文档对象模型Microsoft?XMLDocumentObjectModel(DOM)处理回应。
这里说些题外话,其实这个东西很早就出现了,只是以前浏览器的支持不够,只有IE中才支持,所以大多数的WEB程序员都没有怎么用他,但是现在情况发生了很大地改变,Mozilla和Safari把它采用为事实上的标准,主流的浏览器都开始支持XMLHTTPRequest对象了。但是这里需要重点说明的是XMLHTTPRequest目前还不是一个W3C的标准,所以在不同的浏览器上表现也稍有些区别。
2、创建XMLHTTPRequest对象
对了,说到区别,我们这里来看看怎么来声明(使用)它,在使用XMLHTTPRequest对象发送请求和处理响应之前,我们必须要用javascript创建一个XMLHTTPRequest对象。(IE把XMLHTTPRequest实现为一个ActiveX对象,其他的浏览器[如Firefox/Safari/Opear]则把它实现为一个本地的javascript对象)。下面我们就来看看具体怎么运用javascript来创建它吧:
- <script language="javascript" type="text/javascript">
- <!--
- varxmlhttp;
- //创建XMLHTTPRequest对象
- functioncreateXMLHTTPRequest(){
- if(window.ActiveXObject){//判断是否支持ActiveX控件
- xmlhttp=newActiveObject("Microsoft.XMLHTTP");//通过实例化ActiveXObject的一个新实例来创建XMLHTTPRequest对象
- }
- elseif(window.XMLHTTPRequest){//判断是否把XMLHTTPRequest实现为一个本地javascript对象
- xmlhttp=newXMLHTTPRequest();//创建XMLHTTPRequest的一个实例(本地javascript对象)
- }
- }
- //-->
- </script>
3、属性和方法
由于东西太多现在先用个页面来列举出说有的方法和属性,以后再来详细举例(主要是本人也在学习中)。
- <html>
- <head>
- <title>XMLHTTPRequest对象的说明DEMO</title>
- <scriptlanguage="javascript"type="text/javascript">
- <!--
- varxmlhttp;
- //创建一个XMLHTTPRequest对象
- functioncreateXMLHTTPRequext(){
- if(window.ActiveXObject){
- xmlhttp=newActiveXObject('Microsoft.XMLHTTP');
- }
- elseif(window.XMLHTTPRequest){
- xmlhttp=newXMLHTTPRequest();
- }
- }
- functionPostOrder(xmldoc)
- {
- createXMLHTTPRequext();
- //方法:open
- //创建一个新的http请求,并指定此请求的方法、URL以及验证信息
- //语法:oXMLHttpRequest.open(bstrMethod,bstrUrl,varAsync,bstrUser,bstrPassword);
- //参数
- //bstrMethod
- //http方法,例如:POST、GET、PUT及PROPFIND。大小写不敏感。
- //bstrUrl
- //请求的URL地址,可以为绝对地址也可以为相对地址。
- //varAsync[可选]
- //布尔型,指定此请求是否为异步方式,默认为true。如果为真,当状态改变时会调用onreadystatechange属性指定的回调函数。
- //bstrUser[可选]
- //如果服务器需要验证,此处指定用户名,如果未指定,当服务器需要验证时,会弹出验证窗口。
- //bstrPassword[可选]
- //验证信息中的密码部分,如果用户名为空,则此值将被忽略。
- //备注:调用此方法后,可以调用send方法向服务器发送数据。
- xmlhttp.Open("get","http://localhost/example.htm",false);
- //varbook=xmlhttp.responseXML.selectSingleNode("//book[@id='bk101']");
- //alert(book.xml);
- //属性:onreadystatechange
- //onreadystatechange:指定当readyState属性改变时的事件处理句柄
- //语法:oXMLHttpRequest.onreadystatechange=funcMyHandler;
- //如下的例子演示当XMLHTTPRequest对象的readyState属性改变时调用HandleStateChange函数,
- //当数据接收完毕后(readystate==4)此页面上的一个按钮将被激活
- //备注:此属性只写,为W3C文档对象模型的扩展.
- xmlhttp.onreadystatechange=HandleStateChange;
- //方法:send
- //发送请求到http服务器并接收回应
- //语法:oXMLHttpRequest.send(varBody);
- //参数:varBody(欲通过此请求发送的数据。)
- //备注:此方法的同步或异步方式取决于open方法中的bAsync参数,如果bAsync==False,此方法将会等待请求完成或者超时时才会返回,如果bAsync==True,此方法将立即返回。
- //Thismethodtakesoneoptionalparameter,whichistherequestBodytouse.TheacceptableVARIANTinputtypesareBSTR,SAFEARRAYofUI1(unsignedbytes),IDispatchtoanXMLDocumentObjectModel(DOM)object,andIStream*.Youcanuseonlychunkedencoding(forsending)whensendingIStream*inputtypes.ThecomponentautomaticallysetstheContent-LengthheaderforallbutIStream*inputtypes.
- //如果发送的数据为BSTR,则回应被编码为utf-8,必须在适当位置设置一个包含charset的文档类型头。
- //IftheinputtypeisaSAFEARRAYofUI1,theresponseissentasiswithoutadditionalencoding.ThecallermustsetaContent-Typeheaderwiththeappropriatecontenttype.
- //如果发送的数据为XMLDOMobject,则回应将被编码为在xml文档中声明的编码,如果在xml文档中没有声明编码,则使用默认的UTF-8。
- //IftheinputtypeisanIStream*,theresponseissentasiswithoutadditionalencoding.ThecallermustsetaContent-Typeheaderwiththeappropriatecontenttype.
- xmlhttp.Send(xmldoc);
- //方法:getAllResponseHeaders
- //获取响应的所有http头
- //语法:strValue=oXMLHttpRequest.getAllResponseHeaders();
- //备注:每个http头名称和值用冒号分割,并以\r\n结束。当send方法完成后才可调用该方法。
- alert(xmlhttp.getAllResponseHeaders());
- //方法:getResponseHeader
- //从响应信息中获取指定的http头
- //语法:strValue=oXMLHttpRequest.getResponseHeader(bstrHeader);
- //备注:当send方法成功后才可调用该方法。如果服务器返回的文档类型为"text/xml",则这句话
- //xmlhttp.getResponseHeader("Content-Type");将返回字符串"text/xml"。可以使用getAllResponseHeaders方法获取完整的http头信息。
- alert(xmlhttp.getResponseHeader("Content-Type"));//输出http头中的Content-Type列:当前web服务器的版本及名称。
- document.frmTest.myButton.disabled=true;
- //方法:abort
- //取消当前请求
- //语法:oXMLHttpRequest.abort();
- //备注:调用此方法后,当前请求返回UNINITIALIZED状态。
- //xmlhttp.abort();
- //方法:setRequestHeader
- //单独指定请求的某个http头
- //语法:oXMLHttpRequest.setRequestHeader(bstrHeader,bstrValue);
- //参数:bstrHeader(字符串,头名称。)
- //bstrValue(字符串,值。)
- //备注:如果已经存在已此名称命名的http头,则覆盖之。此方法必须在open方法后调用。
- //xmlhttp.setRequestHeader(bstrHeader,bstrValue);
- }
- functionHandleStateChange()
- {
- //属性:readyState
- //返回XMLHTTP请求的当前状态
- //语法:lValue=oXMLHttpRequest.readyState;
- //备注:变量,此属性只读,状态用长度为4的整型表示.定义如下:
- //0(未初始化)对象已建立,但是尚未初始化(尚未调用open方法)
- //1(初始化)对象已建立,尚未调用send方法
- //2(发送数据)send方法已调用,但是当前的状态及http头未知
- //3(数据传送中)已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误,
- //4(完成)数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据
- if(xmlhttp.readyState==4){
- document.frmTest.myButton.disabled=false;
- //属性:responseBody
- //返回某一格式的服务器响应数据
- //语法:strValue=oXMLHttpRequest.responseBody;
- //备注:变量,此属性只读,以unsignedarray格式表示直接从服务器返回的未经解码的二进制数据。
- alert(xmlhttp.responseBody);
- //属性:responseStream
- //以AdoStream对象的形式返回响应信息
- //语法:strValue=oXMLHttpRequest.responseStream;
- //备注:变量,此属性只读,以AdoStream对象的形式返回响应信息。
- alert(xmlhttp.responseStream);
- //属性:responseText
- //将响应信息作为字符串返回
- //语法:strValue=oXMLHttpRequest.responseText;
- //备注:变量,此属性只读,将响应信息作为字符串返回。XMLHTTP尝试将响应信息解码为Unicode字符串,
- //XMLHTTP默认将响应数据的编码定为UTF-8,如果服务器返回的数据带BOM(byte-ordermark),XMLHTTP可
- //以解码任何UCS-2(bigorlittleendian)或者UCS-4数据。注意,如果服务器返回的是xml文档,此属
- //性并不处理xml文档中的编码声明。你需要使用responseXML来处理。
- alert(xmlhttp.responseText);
- //属性:responseXML
- //将响应信息格式化为XmlDocument对象并返回
- //语法:varobjDispatch=oXMLHttpRequest.responseXML;
- //备注:变量,此属性只读,将响应信息格式化为XmlDocument对象并返回。如果响应数据不是有效的XML文档,
- //此属性本身不返回XMLDOMParseError,可以通过处理过的DOMDocument对象获取错误信息。
- alert("Result="+xmlhttp.responseXML.xml);
- //属性:status
- //返回当前请求的http状态码
- //语法:lValue=oXMLHttpRequest.status;
- //返回值:长整形标准http状态码,定义如下:
- //Number:Description
- //100:Continue
- //101:Switchingprotocols
- //200:OK
- //201:Created
- //202:Accepted
- //203:Non-AuthoritativeInformation
- //204:NoContent
- //205:ResetContent
- //206:PartialContent
- //300:MultipleChoices
- //301:MovedPermanently
- //302:Found
- //303:SeeOther
- //304:NotModified
- //305:UseProxy
- //307:TemporaryRedirect
- //400:BadRequest
- //401:Unauthorized
- //402:PaymentRequired
- //403:Forbidden
- //404:NotFound
- //405:MethodNotAllowed
- //406:NotAcceptable
- //407:ProxyAuthenticationRequired
- //408:RequestTimeout
- //409:Conflict
- //410:Gone
- //411:LengthRequired
- //412:PreconditionFailed
- //413:RequestEntityTooLarge
- //414:Request-URITooLong
- //415:UnsupportedMediaType
- //416:RequestedRangeNotSuitable
- //417:ExpectationFailed
- //500:InternalServerError
- //501:NotImplemented
- //502:BadGateway
- //503:ServiceUnavailable
- //504:GatewayTimeout
- //505:HTTPVersionNotSupported
- //备注:长整形,此属性只读,返回当前请求的http状态码,此属性仅当数据发送并接收完毕后才可获取。
- alert(xmlhttp.status);
- //属性:statusText
- //返回当前请求的响应行状态
- //语法:strValue=oXMLHttpRequest.statusText;
- //备注:字符串,此属性只读,以BSTR返回当前请求的响应行状态,此属性仅当数据发送并接收完毕后才可获取。
- alert(xmlhttp.statusText);
- }
- }
- //-->
- </script>
- </head>
- <body>
- <formname="frmTest">
- <inputname="myButton"type="button"value="ClickMe"onclick="PostOrder('http://localhost/example.htm');">
- </form>
- </body>
- </html>