jQuery入門筆記之(五)jQuery中的Ajax

jopen 8年前發布 | 31K 次閱讀 Ajax jQuery Ajax框架

關于Ajax的概述就不說了,有興趣自己去找一下吧,并且建議去我博客看關于原生js實現Ajax函數的實現,希望有所幫助。服務器的配置,那篇文章也給出了地址。

Ajax入門(一)從0開始到一次成功的GET請求

Ajax入門(二)Ajax函數封裝

jQuery中的Ajax

jQuery 對 Ajax 做了大量的封裝,我們使用起來也較為方便,不需要去考慮瀏覽器兼容性。對于封裝的方式,jQuery采用了三層封裝:最底層的封裝方法為:$.ajax(),而通過這層封裝了第二層有三種方法:.load()、$.get()和$.post(),最高層是$.getScript()和$.getJSON()方法。

Ajax中的 load() 方法

/**
 * Ajax中的load方法(局部方法,可以直接綁定在需要獲取的元素上)
 * @param {String}        url  必須,獲取文件地址
 * @param {JSON or String}          可選,鍵值對方式的請求參數或者(使用鍵值對形式,請求將轉化成post)
 * @param {Function}      可選,請求成功的回調函數
 *   @config   {String}   responseText         獲得字符串形式的響應數據
 *   @config   {String}   textStatus            文本方式返回HTTP狀態碼
 *   @config   {Object}   XMLHttpRequest        xhr對象,有多種屬性
 */
.load(url, data, complete(responseText, textStatus, XMLHttpRequest));

例如下面這段代碼

$('button').click(function () {
    $('#box').load('test.php', {url : 'guowen'});
});

在控制臺可以看到請求為POST,(注意:這里第二個參數若是字符串的情況,例如”url=guowen”,請求仍然為GET。)

所以服務器端php文件應該如此設置:

<?php
if ($_POST["url"] == "guowen") {//get請求把POST更改一下就好了
    echo "<a ;
} else {
    echo "其他網站";
}
?>

關于XHR對象上的屬性,和HTTP狀態碼,參考我原來的博客。

$.get()和$.post()

.load()方法是局部方法,因為他需要一個包含元素的 jQuery 對象作為前綴。而$.get()和$.post()是全局方法,無須指定某個元素。對于用途而言,.load()適合做靜態文件的異步獲取,而對于需要傳遞參數到服務器頁面的,$.get()和$.post()更加合適。

$.get()方法有四個參數,前面三個參數和.load()一樣,多了一個第四參數type,即服務器返回的內容格式:包括xml、html、script、json、jsonp和text。第一個參數為必選參數,后面三個為可選參數

GET方式請求會直接在html后以 ?Key=value 跟隨,所以,有三種形式請求數據,

  1. 直接跟在url后
  2. 字符串形式的 "url=guowen"
  3. 鍵值對形式的 {url:"guowen"}

POST請求方式除去不能直接跟在url后之外,剩余兩個,使用方法一樣

注意:與 .load() 方法不同的是: .load() 方法根據第二個參數的不同類型,請求方式會改變,但這里已經是兩個獨立的方法了,所以請求類型不會進行轉換。

第四個參數一般都不進行設置,jQuery會自動轉換其類型。強制設置時,有可能會連標簽一起返回。

至于POST與GET方式請求的差別,在我原來的博客中也有寫到,這里就不贅述了。

$.getScript() 和 $.getJSON()

jQuery提供了一組用于特定異步加載的方法: $.getScript() ,用于加載特定的JS文件; $.getJSON() ,用于專門加載JSON文件。

$.getJSON() 方法與之前的使用方法類似,就是把第四個參數,類型強制設置成了JSON。

有時我們希望能夠特定的情況再加載JS文件,而不是一開始把所有JS文件都加載了,這時就可以使用 $.getScript() 方法。

//點擊按鈕后再加載 JS 文件
$('input').click(function () {
    $.getScript('test.js');
});

$.ajax()

$.ajax()是所有 ajax 方法中最底層的方法,所有其他方法都是基于$.ajax()方法的封裝。這個方法只有一個參數,傳遞一個各個功能鍵值對的對象。

參數很多有興趣的自己去看 jQuery.ajax() ,本來準備寫幾個常用的。強迫癥犯了,去網上找資料做成了表格。。如下:

參數 類型 說明
url String 發送請求的地址
type String 請求方式:POST 或 GET,默認 GET
timeout Number 設置請求超時的時間(毫秒)
data Object 或String 發送到服務器的數據,鍵值對字符串或對象
dataType String 返回的數據類型,比如 html、xml、json 等
beforeSend Function 發送請求前可修改 XMLHttpRequest 對象的函數
complete Function 請求完成后調用的回調函數
success Function 請求成功后調用的回調函數
error Function 請求失敗時調用的回調函數
global Boolean 默認為 true,表示是否觸發全局 Ajax
cache Boolean 設置瀏覽器緩存響應,默認為 true。如果 dataType類型為 script 或 jsonp 則為 false。
content DOM 指定某個元素為與這個請求相關的所有回調函數的上下文。
contentType String 指 定 請 求 內 容 的 類 型 。 默 認 為application/x-www-form-urlencoded。
async Boolean 是否異步處理。默認為 true,false 為同步處理
processData Boolean 默認為 true,數據被處理為 URL 編碼格式。如果為 false,則阻止將傳入的數據處理為 URL 編碼的格式。
dataFilter Function 用來篩選響應數據的回調函數。
ifModified Boolean 默認為 false,不進行頭檢測。如果為true,進行頭檢測,當相應內容與上次請求改變時,請求被認為是成功的。
jsonp String 指定一個查詢參數名稱來覆蓋默認的 jsonp 回調參數名 callback。
username String 在 HTTP 認證請求中使用的用戶名
password String 在 HTTP 認證請求中使用的密碼
scriptCharset String 當遠程和本地內容使用不同的字符集時,用來設置 script 和 jsonp 請求所使用的字符集。
xhr Function 用來提供 XHR 實例自定義實現的回調函數
traditional Boolean 默認為 false,不使用傳統風格的參數序列化。如為 true,則使用

最常用的如下:

$('button').click(function () {
    $.ajax({
        type : 'POST', //這里可以換成 GET
        url : 'test.php',
        data : {
            url : 'guowen'
        },
        success : function (response, stutas, xhr) {
            $('#box').html(response);
        }
    });
});

注意:對于data屬性,如果是GET、模式,可以使用三種之前說所的三種形式。如果是POST模式可以使用之前所說的兩種形式。(這里不需要考慮之前的data類型的問題了,因為指定了請求類型,不會轉化)

表單序列化

使用表單序列化方法 .serialize() ,會智能的獲取指定表單內的所有元素。這樣,在面對大量表單元素時,會把表單元素內容序列化為字符串,然后再使用Ajax請求。

序列化表單內的元素: data : $('form').serialize() ,其余部分相同。

除此之外還可以直接獲取單選框、復選框和下拉列表框等內容

除了 .serialize() 方法,還有一個可以返回 JSON 數據的方法: .serializeArray() 。這個方法可以直接把數據整合成鍵值對的 JSON 對象。

使用方法相同 $('form').serializeArray() .

有時,我們可能會在同一個程序中多次調用$.ajax()方法。而它們很多參數都相同,這

個時候我們課時使用 jQuery 提供的 $.ajaxSetup() 請求默認值來初始化參數。

$('form input[type=button]').click(function () {
    $.ajaxSetup({//初始化多個ajax方法相同部分參數,后面再寫ajax的時候,就不用在寫了。
        type : 'POST',
        url : 'test.php',
        data : $('form').serialize()//表單序列化
    });
    $.ajax({
        success : function (response, status, xhr) {
                    alert(response);
                }
    });
});

在使用 data 屬性傳遞的時候,如果是以對象形式傳遞鍵值對,可以使用 $.param() 方法將對象轉換為字符串鍵值對格式。

主要是針對無法直接使用表單序列化方法 .serialize() 的情況,且傳遞參數為對象,建議使用該方法進行解析后再進行傳遞。

Ajax進階

加載請求,及錯誤處理。

主要是處理網速較慢的情況,出現請求時間較長的問題。而此時若沒有一點提示,用戶可能會認為你的網頁出現了問題。若是能在請求過程中給用戶一些提示,比如:正在努力加載中…… 。 可能會對用戶更加友好一些。

jQuery提供了兩個全局事件,jQuery 提供了兩個全局事件, .ajaxStart() 和 .ajaxStop() 。

這兩個全局事件,只要用戶觸發了 Ajax,請求開始時( 未完成其他請求 )激活 .ajaxStart() ,請求結束時( 所有請求都結束了 )激活 .ajaxStop() 。

值得注意的是,因為是全局事件,所以這兩個方法是直接需要直接綁定到document上的。例如:

$(document).ajaxStart(function(){
    $(".loading").show();
}).ajaxStop(function(){
    $(".loading").hide();
});

當然你也可以自行在ajax內部進行一些設置,如請求超時時間,該ajax函數是否觸發全局事件等等。以鍵值對的方式寫明就可以了。

錯誤處理也特別簡單

$.ajax({
    //…………
    timeout : 500,//如果請求時間太長,可以設置超時
    global : false,//如果某個 ajax 不想觸發全局事件,可以設置取消
    error : function(xhr,errorText,errorType){//一般都直接用xhr對象
                alert("發生錯誤:"+xhr.status);//返回錯誤狀態碼
            }
});

除此之外 $.get() 、 $.post() 和 .load() ,可以通過連綴處理使用局部 .error() 方法來處理錯誤,當然還有一個全局的方法:通過全局 .ajaxError() 事件方法來返回錯誤信息。即可

請求全局事件

jQuery 對于 Ajax 操作提供了很多全局事件方法,除去上面已經提到的.ajaxStart()、.ajaxStop()、.ajaxError()等事件方法。他們都屬于請求時觸發的全局事件,除了這些,還有一些其他全局事件:

  1. .ajaxSuccess(),對應一個局部方法:.success(),請求成功完成時執行。
  2. .ajaxComplete(),對應一個局部方法:.complete(),請求完成后注冊一個回調函數。
  3. .ajaxSend(),沒有對應的局部方法,只有屬性 beforeSend,請求發送之前要綁定的函數。

注意:全局事件方法是所有 Ajax 請求都會觸發到,并且只能綁定在 document 上。而局部方法,則針對某個 Ajax。

對于一些全局事件方法的參數,大部分為對象,而這些對象有哪些屬性或方法能調用,

可以通過遍歷方法得到。如:

//遍歷 settings 對象的屬性
$(document).ajaxSuccess(function (event, xhr, settings) {
    for (var i in settings) {
        console.log(i);
    }
});

這些全局方法,在$.ajax()方法中都可以直接以參數中的鍵值對的形式來完成

JSON和JSONP

其實在同一個域中時,只要url的后綴是json的文件的,默認就是json。當然你還可以使用 $.ajax() 方法設置 dataType屬性加載 JSON 文件。

先來試試本地JSON:

php如下:

<?php
    $_arr= array('a'=>1,'b'=>2,'c'=>3);
    $_result = json_encode($_arr);
    echo $_result;
?>

js:

$.ajax({
    type:"post",
    url:"test.php",
    dataType:"json",//因為文件類型是php。但是返回的數據是json,所以必須設置類型,否則返回字符串
    success:function(response,staus,xhr){
        console.log(response.a);//打印出來1
    }
});

實現跨域:這部分需要服務器端配合。

<?php
    $_arr= array('a'=>1,'b'=>2,'c'=>3);
    $_result = json_encode($_arr);
    $_callback = $_GET['callback'];//關鍵在這。配合客戶端JS使用
    echo $_callback."($_result)";//php用點號實現字符串拼接
?>

客戶端實現:

$.ajax({//我本地地址為http://127.0.0.1:8020/ajax.html
    type:"GET",
    url:"http://localhost/test.php?callback=?",//這樣就可以實現跨域資源的訪問了,最后的?號,jQuery會自動轉化成字符串
    dataType:"json",//若這里使用JSONP的話,可以刪除上面url的“?callback=?”,jQuery會自動處理。
    success:function(response,staus,xhr){
        alert(response.a);
        console.log(response)
    }
});

當然我們還可以進行使用 $.getJSON() 。使用方式同上。

jqXHR對象

在之前,我們使用了局部方法:.success()、.complete()和.error()。這三個局部方法并不是 XMLHttpRequest 對象調用的,而是$.ajax()之類的全局方法返回的對象調用的。這個對象,就是 jqXHR 對象,它是原生對象 XHR 的一個超集。

//獲取 jqXHR 對象,查看屬性和方法
var jqXHR = $.ajax({
    type : 'POST',
    url : 'test.php',
    data : $('form').serialize()
});
for (var i in jqXHR) {
    document.write(i + '<br />');
}

注意:如果使用 jqXHR 對象的話,那么建議用.done()、.always()和.fail()代替.success()、.complete()和.error()。以為在未來版本中,很可能將這三種方法廢棄取消。

//成功后回調函數
jqXHR.done(function (response) {
    $('#box').html(response);
});

使用 jqXHR 的連綴方式比$.ajax()的屬性方式有三大好處:

  1. 可連綴操作,可讀性大大提高;
  2. 可以多次執行同一個回調函數;
  3. 為多個操作指定回調函數;

PS:很多都只做了一下測試,并不能熟練應用,先過一遍吧,以后再來熟練掌握。

來自: http://guowenfh.github.io/2016/01/03/jQuery-05-Ajax/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!