XMLHttpRequest对象简介

1.XMLHttpRequest对象

      web2.0、Ajax的核心,它是一种支持异步请求的技术。简而言之,XmlHttpRequest使您可以使用JavaScript向服务器提出请求并处理响应,而不阻塞用户。因为它能够:

  • 在不重新加载页面的情况下更新网页
  • 在页面已加载后从服务器请求数据
  • 在页面已加载后从服务器接收数据
  • 在后台向服务器发送数据

浏览器支持

       所有的现代浏览器(IE7+、Firefox、Chrome、Safari 以及 Opera)都支持XMLHttpRequest对象。该对象在Internet Explorer 5中首次引入,在 IE 5 和 IE 6 中,必须使用特定于 IE 的 ActiveXObject() 构造函数。

W3C标准化

       XMLHttpRequest 对象还没有标准化,但是 W3C 已经开始了标准化的工作。

浏览器Ajax交互方式图解

2.属性和方法

属性1:readyState

返回值:返回XMLHttp请求的当前状态

语法:lValue = oXMLHttpRequest.readyState;

实例:

<script language="javascript" type="text/javascript">
      var xmlhttp;
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.4.0");
      function send() { 
                   xmlhttp.onreadystatechange = doHttpReadyStateChange;  
                   xmlhttp.open("GET", "http://localhost/sample.xml", true);
                   xmlhttp.send();
      }
     function doHttpReadyStateChange() {
                 if (xmlhttp.readyState == 4)  
                        alert("Done!"); 
     }
</script>
备注: HTTP 请求的状态.当一个 XMLHttpRequest 初次创建时,这个属性的值从 0 开始,直到接收到完整的 HTTP 响应,这个值增加到 4。

5 个状态中每一个都有一个相关联的非正式的名称,下表列出了状态、名称和含义:

状态 名称 描述
0 Uninitialized 初始化状态。XMLHttpRequest 对象已创建或已被 abort() 方法重置,但是尚未调用open方法,尚未初始化。
1 Open open() 方法已调用,但是 send() 方法未调用。请求还没有被发送。
2 Sent Send() 方法已调用,HTTP 请求已发送到 Web 服务器。未接收到响应。
3 Receiving 数据传输中,所有响应头部都已经接收到。响应体开始接收但未完成。这时通过responseBody和responseText获取部分数据会出现错误。
4 Loaded HTTP 响应已经完全接收,此时可以通过通过responseBody和responseText获取完整的回应数据 。

属性2:responseText

返回值:返回目前为止服务器接收到的响应体。

语法:strValue = oXMLHttpRequest.responseText;

实例:使XMLHttpRequest对象、其responseText属性和HTML元素的innerHTML属性实现的一个搜索功能。

//innerHTML.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>Using responseText with innerHTML</title>
 <script type="text/javascript">
      var xmlHttp;
      function createXMLHttpRequest(){
              if(window.ActiveXObject){
                        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
              }else if(window.XMLHttpRequest){
                        xmlHttp = new XMLHttpRequest();
               }
      }
      function startRequest(){
               createXMLHttpRequest();
               xmlHttp.onreadystatechange = handleStateChange;
               xmlHttp.open("GET","innerHTML.xml",true);
               xmlHttp.send(null);
      }
      function handleStateChange(){
               if(xmlHttp.readyState == 4){
                        if(xmlHttp.status == 200){
                                 document.getElementById("results").innerHTML=xmlHttp.responseText;
                        }
               }
      }
 </script>
 </head>
 <body action="#" >
 <form>
      <input type="button" value="Search for Today's Activities" οnclick="startRequest();"/>
 </form>
 <div id="results"></div>
 </body>
</html>

//innerHTML.xml

<?xml version="1.0" encoding="utf-8"?>
<table border="1">
 <tbody>
 <tr><th>Activity Name</th><th>Location</th><th>Time</th></tr>
 <tr><td>Waterskiing</td><td>Dock #1</td><td>9:00 AM</td></tr>
 <tr><td>Volleyball</td><td>East Court</td><td>2:00 PM</td></tr>
 <tr><td>Hiking</td><td>Trail 3</td><td>3:30 PM</td></tr>
 </tbody>
</table>

备注:此属性只读,将响应信息作为字符串返回(不包括头部),或者如果还没有接收到数据的话,就是空字符串,数据源为任何文本数据。XMLHttp尝试将响应信息解码为Unicode字符串,XMLHttp默认将响应数据的编码定为UTF-8,如果服务器返回的数据带BOM(byte-order mark),XMLHttp可以解码任何UCS-2 (big or little endian)或者UCS-4 数据。注意,如果服务器返回的是xml文档,此属性并不处理xml文档中的编码声明,你需要使用responseXML来处理。          

属性3:responseBody

返回值:返回的是二进制数据,可以通过Adodb.Stream进行加工控制,数据源可以为任何数据

语法:strValue = oXMLHttpRequest.responseBody;

实例:暂无

备注:此属性只读,以unsigned array格式直接从服务器返回的未经解析的二进制数据

属性4:responseXML

返回值:对请求的响应,解析为 XML 并作为 Document 对象返回,可以用JS通过DOM进行加工控制的,单源数据必须是XML
语法:var objDispatch = oXMLHttpRequest.responseXML;
实例:暂无
备注: 此属性只读,将响应信息格式化为Xml Document对象并返回。如果响应数据不是有效的XML文档, 此属性本身不返回XMLDOMParseError,可以通过处理过的DOMDocument对象获取错误信息。

属性5:status

返回值:返回当前http状态码。

语法:IValue = oXMLHttpRequest.status;

备注:长整形标准http状态码,定义如下: 

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

属性6:statusText

返回值:返回http状态码对应的文字,如404对应Not Found。

语法:strValue = oXMLHttpRequest.statusText;

备注:这个属性用名称而不是数字指定了请求的 HTTP 的状态代码。也就是说,当状态为 200 的时候它是 "OK",当状态为 404 的时候它是 "Not Found"。和 status 属性一样,当 readyState 小于 3 的时候读取这一属性会导致一个异常。

属性7:responseStream

返回值: Adodb Stream 形式返回响应信息。

语法:strValue = oXMLHttpRequest.responseStream;

=============================================华丽丽的分割线============================================================

事件句柄:onreadystatechange

每当 readyState 改变时,就会触发 onreadystatechange 事件。

实例:在onreadystatechange事件中,当readystate等于4且状态是200时,表示响应已就绪:

xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
    }
  }

=============================================华丽丽的分割线============================================================

方法1:open()

功能:初始化 HTTP 请求参数,例如 URL 和 HTTP 方法,但是并不发送请求。

语法:oXMLHttpRequest. open(method,url,async);
参数:method是http方法,如GET、POST、PUT等,大小写不敏感。
            url是请求的url地址,可为绝对地址和相对地址。
            async是asynchronous(异步)的缩写,bool型,当为true时,服务器请求是异步的,也就是执行send()方法后不等待服务器的执行结果,而是继续执行脚本代码;当为false时,服务器请求是同步的,即脚本执行send()方法后等待服务器执行结果的返回,若在等待过程中超时,则不再等待,继续执行后面的脚本代码。
备注:GET 还是 POST?与 POST 相比,GET 更简单也更快,并且在大部分情况下都能用。然而,在以下情况中,请使用 POST 请求:
  • 无法使用缓存文件(更新服务器上的文件或数据库)
  • 向服务器发送大量数据(POST 没有数据量限制)
  • 发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠

方法2:send()

功能:将请求发送到服务器。
语法:oXMLHttprequest.send(string);
参数:仅用于POST请求
实例:
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
    }
  }
xmlhttp.open("GET","test1.txt",true);
xmlhttp.send();

方法3:setRequestHeader()

功能:向一个打开未发送的请求设置或添加一个http请求。
语法:oXMLHttpRequest.setRequestHeader(bstrHeader,bstrValue);
参数:bsetrHeader,字符串,头名称;
            bstrValue,字符串,值。
备注:如果存在以此名称命名的http头,则覆盖之。此方法必须在调用open之后调用。

实例:如果需要像 HTML 表单那样 POST 数据,请使用 setRequestHeader() 来添加 HTTP 头。然后在 send() 方法中规定您希望发送的数据:

xmlhttp.open("POST","ajax_test.asp",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("fname=Bill&lname=Gates");

方法4:abort()

功能:取消当前响应,关闭连接并且结束任何未决的网络活动。这个方法把 XMLHttpRequest 对象重置为 readyState 为 0 的状态,并且取消所有未决的网络活动。例如,如果请求用了太长时间,而且响应不再必要的时候,可以调用这个方法。
语法:oXMLHttpRequest.abort();

方法5:getAllResponseHeaders()

功能:把 HTTP 响应头部作为未解析的字符串返回。

备注:如果 readyState 小于 3,这个方法返回 null。否则,它返回服务器发送的所有 HTTP 响应的头部。头部作为单个的字符串返回,一行一个头部。每行用换行符 "\r\n" 隔开。

方法6:getResonseHeader()

功能:返回指定的 HTTP 响应头部的值。其参数是要返回的 HTTP 响应头部的名称。可以使用任何大小写来制定这个头部名字,和响应头部的比较是不区分大小写的。

备注:该方法的返回值是指定的 HTTP 响应头部的值,如果没有接收到这个头部或者 readyState 小于 3 则为空字符串。如果接收到多个有指定名称的头部,这个头部的值被连接起来并返回,使用逗号和空格分隔开各个头部的值。

=============================================华丽丽的分割线============================================================

3. 创建XMLHttpRequest对象

      所有现代浏览器(IE7+、Firefox、Chrome、Safari 以及 Opera)都内建了XMLHttpRequest对象,值得说明的是,IE把XMLHTTPRequest实现为一个ActiveX对象,其他的浏览器(如Firefox、Safari、Opera)则把它实现为一个本地的javascript对象。下面我们看看怎样创建一个XMLHttpRequeset对象:

#code 1:创建简单的 XMLHttpRequest 对象

xmlhttp = new XMLHttpRequest();

#code 2:创建适合于不同浏览器的XMLHttpRequest对象:

<script language="javascript" type="text/javascript">
    var xmlhttp;
    function createXMLHttpRequest(){
            // 判断是否支持ActiveX控件,for IE5/IE6
            if(window.ActiveXObject){ 
                // 通过实例化ActiveXObject的一个新实例来创建XMLHTTPRequest对象
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
            }
            // 判断是否把XMLHTTPRequest实现为一个本地javascript对象, for firefox/Safari/Opera
            else if(window.XMLHTTPRequest){
                 // 创建XMLHTTPRequest的一个实例(本地javascript对象)
                 xmlhttp = new XMLHTTPRequest(); 
            }
    }
</script>

异常处理

实际上,各种异常都可能出现,以上代码都没有提供异常处理方法。较好的方法是,当错误发生时,能够及时退出并确保用户知道错误出在哪里。以下代码说明如何创建该对象,以便在出现问题的时候发出 JavaScript 警告。

#code 3:创建有异常处理的XMLHttpRequest对象,目前的主流浏览器中,跑这段代码,总有1种方法能创建该对象成功。

<script language="javascript" type="text/javascript">
      var xmlhttp = false;   //创建变量xmlhttp赋值false,用于之后判断是否创建XMLHttpRequest对象
      try { //尝试创建适用于IE7+、Firefox、Chrome、Safari等主流浏览器的XMLHttpRequest对象
           xmlhttp = new XMLHttpRequest();
      } catch (trymicrosoft) { 
            try {//尝试创建适用于较新版本IE的XMLHttpRequest对象
                 xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (othermicrosoft) {
                  try{//尝试创建合适老版本IE的XMLDHttpRequest对象
                      xmlhttp = new ActiveXObject("Microsoft.XMLHttp");
                  }catch(failed){
                       xmlhttp = false;
                   }
              }                                                                                                                     
         }
      if(!xmlhttp && typeof XMLHttpRequest != 'undefined')
         alert("Error initializing XMLHttpRequest!");
</script>


静态与动态

http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro2/#code6



=============================================华丽丽的分割线============================================================

4.用XMLHttprequest发送请求 







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值