1. 程式人生 > >ajax非同步請求的常見方式

ajax非同步請求的常見方式

首先先介紹下ajax,ajax(ASynchronous JavaScript And XML)為非同步的javascript和xml。所謂的非同步和同步是指:

同步:客戶端必須等待伺服器的響應,在等待期間客戶端不能做其他操作。

非同步:客戶端無須等待伺服器的響應,在伺服器處理請求的過程中,客戶端可以進行其他的操作。

Ajax能夠在無需載入整個頁面的情況下,能夠更新部分網頁內容,可以減小伺服器的資源浪費。通過在後臺與伺服器進行少量資料交換,Ajax 可以使網頁實現非同步更新。這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新。而傳統的網頁如果需要更新內容,必須重新載入整個網頁頁面。

ajax大體上有四種實現方式,由於基於JS的實現方式太過於複雜,基本上用不到,所以就暫不貼出其實現程式碼了。

1.使用$.ajax()傳送非同步請求

jQuery 底層 AJAX 實現。簡單易用的高層實現見 $.get, $.post 等。$.ajax() 返回其建立的 XMLHttpRequest 物件。大多數情況下你無需直接操作該函式,除非你需要操作不常用的選項,以獲得更多的靈活性。 最簡單的情況下,$.ajax()可以不帶任何引數直接使用。 

$.ajax的引數列表如下:

url:預設: 當前頁地址) 傳送請求的地址。

async:(預設: true) 預設設定下,所有請求均為非同步請求。如果需要傳送同步請求,請將此選項設定為 false。注意,同步請求將鎖住瀏覽器,使用者其它操作必須等待請求完成才可以執行。

type:請求方式,常見引數為POST,GET等等, 預設為 "GET"。注意:其它 HTTP 請求方法,如 PUT 和 DELETE 也可以使用,但僅部分瀏覽器支援。

data:請求引數。必須為 Key/Value 格式。如果為陣列,jQuery 將自動為不同值對應同一個名稱。如 {name:["zhangsan", "lisi"]} 轉換為 '&name=zhangsan&name=lisi'。

dataTpye:預期伺服器返回的資料型別。如果不指定,jQuery 將自動根據 HTTP 包 MIME 資訊來智慧判斷,比如XML MIME型別就被識別為XML。在1.4中,JSON就會生成一個JavaScript物件,而script則會執行這個指令碼。隨後伺服器端返回的資料會根據這個值解析後,傳遞給回撥函式。可用值如下:

    "xml": 返回 XML 文件,可用 jQuery 處理。

    "html": 返回純文字 HTML 資訊;包含的script標籤會在插入dom時執行。

    "script": 返回純文字 JavaScript 程式碼。不會自動快取結果。除非設定了"cache"引數。'''注意:'''在遠端請求時(不在同一個域下),所有POST請求都將轉為GET請求。(因為將使用DOM的script標籤來載入)

    "json": 返回 JSON 資料 。

    "jsonp": JSONP 格式。使用 JSONP 形式呼叫函式時,如 "myurl?callback=?" jQuery 將自動替換 ? 為正確的函式名,以執行回撥函式。

    "text": 返回純文字字串

contentType: 請求資料的型別,(預設: "application/x-www-form-urlencoded") 傳送資訊至伺服器時內容編碼型別。預設值適合大多數情況。如果你明確地傳遞了一個content-type給 $.ajax() 那麼他必定會發送給伺服器(即使沒有資料要傳送)。如果請求資料是json格式的,則需要填寫'application/json; charset=UTF-8',否則後臺無法獲取到資料。

如果要處理$.ajax()得到的資料,則需要使用回撥函式。beforeSend、error、dataFilter、success、complete。

  • beforeSend 在傳送請求之前呼叫,並且傳入一個XMLHttpRequest作為引數。
  • error 在請求出錯時呼叫。傳入XMLHttpRequest物件,描述錯誤型別的字串以及一個異常物件(如果有的話)
  • dataFilter 在請求成功之後呼叫。傳入返回的資料以及"dataType"引數的值。並且必須返回新的資料(可能是處理過的)傳遞給success回撥函式。
  • success 當請求之後呼叫。傳入返回後的資料,以及包含成功程式碼的字串。
  • complete 當請求完成之後呼叫這個函式,無論成功或失敗。傳入XMLHttpRequest物件,以及一個包含成功或錯誤程式碼的字串。

注意,必須確保網頁伺服器報告的MIME型別與我們選擇的dataType所匹配。比如說,JSON的話,伺服器端就必須宣告application/json來獲得一致的結果。

示例:

//傳送登陸請求
$.ajax({
  url:"/login.do" , 
  type:"POST" , 
    dataType:"text",
    data:{"name":"zhangbo"},
    success:function (data) {
        alert(data);
    },
    error:function () {
           alert("請求響應錯誤");
    }
});        

//載入並執行一個 JS 檔案。
$.ajax({
  type: "GET",
  url: "test.js",
  dataType: "script"
});

//裝入一個 HTML 網頁最新版本。
$.ajax({
  url: "test.html",
  cache: false,
  success: function(html){
    $("#results").append(html);
  }
});

//同步載入資料。傳送請求時鎖住瀏覽器。需要鎖定使用者互動操作時使用同步方式。
var html = $.ajax({
  url: "some.php",
  async: false
 }).responseText;

//傳送 XML 資料至伺服器。設定 processData 選項為 false,防止自動轉換資料格式。
var xmlDocument = [create xml document];
 $.ajax({
   url: "page.php",
   processData: false,
   data: xmlDocument,
   success: handleResponse
 });

2.使用$.get()傳送get請求

一個簡單的 GET 請求功能 。請求成功時可呼叫回撥函式。如果需要在出錯時執行函式,請使用 $.ajax。

$.get(url, [data], [callback], [type])的引數列表如下:

url:待載入頁面的URL地址

data(可選):待發送 Key/value 引數。

callback(可選):回撥函式。

type(可選):響應結果的型別。xml, html, script, json, text, _default。

$.get("/login.do",{username:"zhangbo"},function (data) {
                alert(data);
      },"text");

3.使用$.post()傳送post請求

一個簡單的 POST請求功能 。請求成功時可呼叫回撥函式。如果需要在出錯時執行函式,請使用 $.ajax。

$.post(url, [data], [callback], [type])的引數列表如下:

url:待載入頁面的URL地址

data(可選):待發送 Key/value 引數。

callback(可選):回撥函式。

type(可選):響應結果的型別。xml, html, script, json, text, _default。

$.post("/login.do",{username:"zhangbo"},function (data) {
              alert(data);
            },"text");

除了這些還有put,delete等等請求,和$.get()、$.post()差不多,就不一一敘述了。

上述三種非同步實現的方式都大同小異,使用ajax的關鍵就在於json格式資料的獲取與響應,其他的並不難。