百良西瓜

导航

Ajax

Ajax - Asynchronous JavaScript and XML

示例:  

  // 发起 AJAX 请求

  function getCardByAjax() {
    var httpRequest = new XMLHttpRequest();
    httpRequest.oonreadystatechange = handleResponse;
    httpRequest.open("GET", "http://www.xxx.com/Card.html");
    httpRequest.send();
  }


  // 处理 AJAX 的响应
  function handleResponse(e) {
    if(e.target.readystate == XMLHttpRequest.DONE && e.target.status == 200){
      var text = e.target.responseText;
      // ... process
    }
  }

XMLHttpRequest readyState 属性的值

UNSENT 0   已创建 XMLHttpRequest 对象
OPEND    1 已调用 open 方法
HEADERS_RECEIVED   2 已收到服务器响应的标头
LOADING 3 已收到服务器响应
DONE 4 响应完成或者失败

 

 

 

 

 

  DONE 并不代表请求成功,它只表示请求已完成。需要通过  status 属性获取 HTTP 的响应状态码进一步判断。

AJAX 事件    

abort     在请求被中止时触发  ProgressEvent
error   在请求失败时触发  ProgressEvent
load   在请求成功完成时触发   ProgressEvent
loadend   在请求已完成时触发,无论成功还是发生错误     ProgressEvent
loadstart   在请求开始时触发   ProgressEvent
progress   多次触发,以提示请求的进度  ProgressEvent
readstatechange     多次触发,在请求生命周期的不同阶段触发  Event
timeout   如果请求超时则触发  ProgressEvent

 

 

 

 

 

 

 

 

  以上事件并不是所有浏览器都支持,除了 readstatechange 之外,其他事件都是 XMLHttpRequest 规范的第二版本定义的。

 处理错误

  第一类错误,从 XMLHttpRequest 对象的角度看到的问题,某些因素阻止了请求发送到服务器,

    例如:主机名不能被 DNS 解析,导致浏览器无法生成服务器连接,会产生 onerror 事件;

         URL 和 生成请求的脚本具有不同来源,默认是不允许跨域访问的,会产生 onerror 事件;       

       连接请求被拒绝,URL 无效(格式不正确)等 。

  第二类错误,从应用程序的角度看到的问题,而非 XMLHttpRequest 对象。它们发生于请求已成功发送到

    服务器,服务器也接收了请求,并进行了响应。但该响应并不指向你期望的内容时。

    例如:你请求 URL 资源在服务器上不存在,会产生 onerror 事件

覆盖AJAX 的请求标头

  通常使用 AJAX 时,使用 GET 或者 POST 方法就够了,但有时候你使用其他方法,怎么办?

  由于大部分浏览器只支持 GET、POST 方法,那么,就需要先用 GET、POST 方法建立连接,然后使用 "X-HTTP-Method-Override" 覆盖,再发送一次请求。

function deleteCard() {
    var httpRequest = new XMLHttpRequest();
     httpRequest.onreadystatechange = handleResponse;
     httpRequest.open("GET", "Card.html");
   //
setRequestHeader 方法必须位于 open 方法之后
   httpRequest.setRequestHeader("X-HTTP-Method-Override", "DELETE");
   httpRequest.send();
}

  一些浏览器会缓存 AJAX 请求的数据,导致发起第二次请求,不能获取到最新数据,那么可以禁用缓存来达到目的,这在调试时比较方便。

  httpRequest.setRequestHeader("Cache-Control", "no-cache");

 

posted on 2015-12-22 12:43  百良西瓜  阅读(141)  评论(0编辑  收藏  举报