首頁 > web前端 > js教程 > javascript原生ajax寫法分享_javascript技巧

javascript原生ajax寫法分享_javascript技巧

WBOY
發布: 2016-05-16 15:06:13
原創
1576 人瀏覽過

ajax:一種要求資料的方式,不需要刷新整個頁面;
ajax的技術核心是 XMLHttpRequest 物件;
ajax 請求流程:建立 XMLHttpRequest 物件、連接伺服器、傳送請求、接收回應資料;

/**
 * 得到ajax对象
 */
function getajaxHttp() {
  var xmlHttp;
  try {
    //chrome, Firefox, Opera 8.0+, Safari
    xmlHttp = new XMLHttpRequest();
    } catch (e) {
      // Internet Explorer
      try {
        //IE5,6
        xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
      } catch (e) {
      try {
        //IE7以上
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {
        alert("您的浏览器不支持AJAX!");
        return false;
      }
    }
  }
  return xmlHttp;
}
/**
 * 发送ajax请求
 * url--url
 * methodtype(post/get)
 * con (true(异步)|false(同步))
 * parameter(参数)
 * functionName(回调方法名,不需要引号,这里只有成功的时候才调用)
 * (注意:这方法有二个参数,一个就是xmlhttp,一个就是要处理的对象)
 * obj需要到回调方法中处理的对象
 */
function ajaxrequest(url,methodtype,con,parameter,functionName,obj){
  var xmlhttp=getajaxHttp();
  xmlhttp.onreadystatechange=function(){
     
    // readyState值说明 
    // 0,初始化,XHR对象已经创建,还未执行open 
    // 1,载入,已经调用open方法,但是还没发送请求 
    // 2,载入完成,请求已经发送完成 
    // 3,交互,可以接收到部分数据 
  
    // status值说明 
    // 200:成功 
    // 404:没有发现文件、查询或URl 
    // 500:服务器产生内部错误 
 
    if(xmlhttp.readyState==4&& XHR.status == 200){
      //HTTP响应已经完全接收才调用
      functionName(xmlhttp,obj);
    }
  };
  xmlhttp.open(methodtype,url,con);
  xmlhttp.send(parameter);
}
//这就是参数
function createxml(){
  var xml="<user><userid>asdfasdfasdf<\/userid><\/user>";//"\/"这不是大写V而是转义是左斜杠和右斜杠
  return xml;
}
//这就是参数
function createjson(){
  var json={id:0,username:"好人"};
  return json;
}
function c(){
  alert("");
}
登入後複製

//測試

ajaxrequest("http://www.baidu.com","post",true,createxml(),c,document);
登入後複製

我們再來看一個範例

ajax({
    url: "./TestXHR.aspx",       //请求地址
    type: "POST",            //请求方式
    data: { name: "super", age: 20 },    //请求参数
    dataType: "json",
    success: function (response, xml) {
      // 此处放成功后执行的代码
    },
    fail: function (status) {
      // 此处放失败后执行的代码
    }
  });

  function ajax(options) {
    options = options || {};
    options.type = (options.type || "GET").toUpperCase();
    options.dataType = options.dataType || "json";
    var params = formatParams(options.data);

    //创建 - 非IE6 - 第一步
    if (window.XMLHttpRequest) {
      var xhr = new XMLHttpRequest();
    } else { //IE6及其以下版本浏览器
      var xhr = new ActiveXObject('Microsoft.XMLHTTP');
    }

    //接收 - 第三步
    xhr.onreadystatechange = function () {
      if (xhr.readyState == 4) {
        var status = xhr.status;
        if (status >= 200 && status < 300) {
          options.success && options.success(xhr.responseText, xhr.responseXML);
        } else {
          options.fail && options.fail(status);
        }
      }
    }

    //连接 和 发送 - 第二步
    if (options.type == "GET") {
      xhr.open("GET", options.url + "&#63;" + params, true);
      xhr.send(null);
    } else if (options.type == "POST") {
      xhr.open("POST", options.url, true);
      //设置表单提交时的内容类型
      xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      xhr.send(params);
    }
  }
  //格式化参数
  function formatParams(data) {
    var arr = [];
    for (var name in data) {
      arr.push(encodeURIComponent(name) + "=" + encodeURIComponent(data[name]));
    }
    arr.push(("v=" + Math.random()).replace(".",""));
    return arr.join("&");
  }
登入後複製

我們來看看原理

1、建立

1.1、IE7及其上述版本中支援原生的 XHR 對象,因此可以直接使用: var oAjax = new XMLHttpRequest();

1.2、IE6及其先前的版本中,XHR物件是透過MSXML庫中的一個ActiveX物件實現的。有的書中細化了IE中此類物件的三種不同版本,即MSXML2.XMLHttp.6.0;個人感覺太麻煩,可以直接使用下面的語句創建: var oAjax =new ActiveXObject('Microsoft.XMLHTTP');

2、連線與傳送

2.1、open()函數的三個參數:請求方式、請求位址、是否非同步請求(同步請求的情況極少,至今還沒有用到過);

2.2、GET 請求方式是透過URL參數將資料提交到伺服器的,POST則是透過將資料作為 send 的參數提交到伺服器;

2.3、POST 請求中,在傳送資料之前,要設定表單提交的內容類型;

2.4、提交到伺服器的參數必須經過 encodeURIComponent() 方法進行編碼,實際上在參數清單」key=value」的形式中,key 和 value 都需要編碼,因為會包含特殊字元。每次請求的時候都會在參數清單中拼入一個 “v=xx” 的字串,這樣是為了拒絕緩存,每次都直接請求到伺服器上。

encodeURI() :用於整個 URI 的編碼,不會對本身屬於 URI 的特殊字元進行編碼,如冒號、正斜線、問號和井號;其對應的解碼函數 decodeURI();
encodeURIComponent() :用於對 URI 中的某一部分進行編碼,會對它發現的任何非標準字元進行編碼;其對應的解碼函數 decodeURIComponent();

3、接收

3.1、接收到回應後,回應的資料會自動填入XHR對象,相關屬性如下
responseText:回應傳回的主體內容,為字串類型;
responseXML:如果回應的內容類型是 "text/xml" 或 "application/xml",這個屬性中將保存相應的xml 數據,是 XML 對應的 document 類型;
status:回應的HTTP狀態碼;
statusText:HTTP狀態的說明;

3.2、XHR物件的readyState屬性表示請求/回應過程的目前活動階段,這個屬性的值如下
0-未初始化,尚未呼叫open()方法;
1-啟動,呼叫了open()方法,未呼叫send()方法;
2-發送,已經呼叫了send()方法,未接收到回應;
3-接收,已接收到部分回應資料;
4-完成,已經接收到全部回應資料;

只要readyState 的值變化,就會呼叫readystatechange 事件,(其實為了邏輯上通順,可以把readystatechange放到send之後,因為send時請求伺服器,會進行網路通信,需要時間,在send之後指定readystatechange事件處理程序也是可以的,我通常都是這樣用,但為了規範和跨瀏覽器相容性,還是在open之前進行指定吧)。

3.3、在readystatechange事件中,先判斷回應是否接收完成,然後判斷伺服器是否成功處理請求,xhr.status 是狀態碼,狀態碼以2開頭的都是成功,304表示從快取中獲取,上面的程式碼在每次請求的時候都加入了隨機數,所以不會從快取中取值,故該狀態不需判斷。

4、ajax請求是不能跨域的!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板