如何使用jQuery方便快捷的實(shí)現(xiàn)Ajax功能

如何使用jQuery方便快捷的實(shí)現(xiàn)Ajax功能,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)網(wǎng)站空間、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、鯉城網(wǎng)站維護(hù)、網(wǎng)站推廣。

Ajax讓用戶頁(yè)面豐富起來(lái), 增強(qiáng)了用戶體驗(yàn). 使用Ajax是所有Web開(kāi)發(fā)的必修課. 雖然Ajax技術(shù)并不復(fù)雜, 但是實(shí)現(xiàn)方式還是會(huì)因?yàn)槊總€(gè)開(kāi)發(fā)人員的而有所差異.jQuery提供了一系列Ajax函數(shù)來(lái)幫助我們統(tǒng)一這種差異, 并且讓調(diào)用Ajax更加簡(jiǎn)單.

51CTO推薦專(zhuān)題:jQuery從入門(mén)到精通 jQuery給力插件大閱兵

一. 原始Ajax與jQuery中的Ajax

首先通過(guò)實(shí)例, 來(lái)看一下jQuery實(shí)現(xiàn)Ajax有多簡(jiǎn)單. 下面是一個(gè)使用原始Ajax的示例:

上面的實(shí)例中, data/AjaxGetCityInfo.aspx?resultType=html 地址會(huì)返回一段HTML代碼.

使用原始Ajax, 我們需要做較多的事情, 比如創(chuàng)建XmlHttpRequest對(duì)象, 判斷請(qǐng)求狀態(tài), 編寫(xiě)回調(diào)函數(shù)等.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.org/1999/xhtml">  <head>      <title>jQuery Ajax</title>      <script type="text/javascript">          $(function()          {              var xhr = new AjaxXmlHttpRequest();              $("#btnAjaxOld").click(function(event)              {                  var xhr = new AjaxXmlHttpRequest();                  xhr.onreadystatechange = function()                  {                      if (xhr.readyState == 4)                      {                          document.getElementById("divResult").innerHTML = xhr.responseText;                      }                  }                  xhr.open("GET", "data/AjaxGetCityInfo.aspx?resultType=html", true);                  xhr.send(null);              });          })           //跨瀏覽器獲取XmlHttpRequest對(duì)象          function AjaxXmlHttpRequest()          {              var xmlHttp;              try             {                  // Firefox, Opera 8.0+, Safari                  xmlHttp = new XMLHttpRequest();              }              catch (e)              {                   // Internet Explorer                  try                 {                      xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");                  }                  catch (e)                  {                       try                     {                          xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");                      }                      catch (e)                      {                          alert("您的瀏覽器不支持AJAX!");                          return false;                      }                  }              }              return xmlHttp;          }                    </script>   </head>  <body>          <button id="btnAjaxOld">原始Ajax調(diào)用</button><br />      <br />      <div id="divResult"></div>  </body>  </html>

而用jQuery的Load方法, 只需要一句話:

$("#divResult").load("data/AjaxGetCityInfo.aspx", { "resultType": "html" });

曾經(jīng)我是一個(gè)原始Ajax的絕對(duì)擁護(hù)者, 甚至摒棄微軟的Asp.net Ajax, 因?yàn)槲蚁胍?**的代碼靈活度. 使用原始Ajax讓我感覺(jué)完成自己的工作更加輕松, 即使多寫(xiě)了一些代碼. 但是當(dāng)我去翻看別人的Ajax代碼并且嘗試修改的時(shí)候, 我改變了我的看法--我們的代碼到處分布著創(chuàng)建XmlHttpRequest方法的函數(shù), 或者某些Ajax程序邏輯性和結(jié)構(gòu)性很差, 很難看懂.

我們可以將通用方法放到一個(gè)js文件中, 然后告訴大家"嘿伙伴們, 都來(lái)用這個(gè)js中的方法". 但是在某些時(shí)候有些新來(lái)的外包人員并不知道有這個(gè)js文件的存在. 而且其實(shí)這個(gè)通用的js就是一個(gè)公共的腳本類(lèi)庫(kù), 我相信沒(méi)有人會(huì)覺(jué)得自己開(kāi)發(fā)一個(gè)類(lèi)庫(kù)會(huì)比jQuery更好!

所以我放棄了制造輪子的計(jì)劃, 大家都使用jQuery編寫(xiě)Ajax相關(guān)的方法就可以解決各種差異性問(wèn)題, 并且讓工作更有效率.

現(xiàn)在只是用jQuery的Ajax函數(shù), 我的頁(yè)面變得簡(jiǎn)潔了:

二. jQuery Ajax詳解

jQuery提供了幾個(gè)用于發(fā)送Ajax請(qǐng)求的函數(shù). 其中最核心也是最復(fù)雜的是jQuery.ajax( options ),所有的其他Ajax函數(shù)都是它的一個(gè)簡(jiǎn)化調(diào)用. 當(dāng)我們想要完全控制Ajax時(shí)可以使用此結(jié)果, 否則還是使用簡(jiǎn)化方法如get, post, load等更加方便. 所以jQuery.ajax( options ) 方法放到***一個(gè)介紹. 先來(lái)介紹最簡(jiǎn)單的load方法:

1. load( url, [data], [callback] )

Returns:jQuery包裝集

說(shuō)明:

load方法能夠載入遠(yuǎn)程 HTML 文件代碼并插入至 DOM 中。

默認(rèn)使用 GET 方式, 如果傳遞了data參數(shù)則使用Post方式.

- 傳遞附加參數(shù)時(shí)自動(dòng)轉(zhuǎn)換為 POST 方式。jQuery 1.2 中,可以指定選擇符,來(lái)篩選載入的 HTML 文檔,DOM 中將僅插入篩選出的 HTML 代碼。語(yǔ)法形如 "url #some > selector", 默認(rèn)的選擇器是"body>*".

講解:

load是最簡(jiǎn)單的Ajax函數(shù), 但是使用具有局限性:

1. 它主要用于直接返回HTML的Ajax接口

2. load是一個(gè)jQuery包裝集方法,需要在jQuery包裝集上調(diào)用,并且會(huì)將返回的HTML加載到對(duì)象中, 即使設(shè)置了回調(diào)函數(shù)也還是會(huì)加載.

不過(guò)不可否認(rèn)load接口設(shè)計(jì)巧妙并且使用簡(jiǎn)單.下面通過(guò)示例來(lái)演示Load接口的使用:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.org/1999/xhtml">  <head>      <title>jQuery Ajax - Load</title>       <script type="text/javascript" src="../scripts/jquery-1.3.2-vsdoc2.js"></script>       <script type="text/javascript">          $(function()          {              $("#btnAjaxGet").click(function(event)              {                  //發(fā)送Get請(qǐng)求                  $("#divResult").load("../data/AjaxGetMethod.aspx?param=btnAjaxGet_click" + "&timestamp=" + (new Date()).getTime());              });               $("#btnAjaxPost").click(function(event)              {                  //發(fā)送Post請(qǐng)求                  $("#divResult").load("../data/AjaxGetMethod.aspx", { "param": "btnAjaxPost_click" });              });               $("#btnAjaxCallBack").click(function(event)              {                  //發(fā)送Post請(qǐng)求, 返回后執(zhí)行回調(diào)函數(shù).                  $("#divResult").load("../data/AjaxGetMethod.aspx", { "param": "btnAjaxCallBack_click" }, function(responseText, textStatus, XMLHttpRequest)                  {                      responseText = " Add in the CallBack Function! <br/>" + responseText                      $("#divResult").html(responseText); //或者: $(this).html(responseText);                  });              });               $("#btnAjaxFiltHtml").click(function(event)              {                  //發(fā)送Get請(qǐng)求, 從結(jié)果中過(guò)濾掉 "鞍山" 這一項(xiàng)                  $("#divResult").load("../data/AjaxGetCityInfo.aspx?resultType=html" + "&timestamp=" + (new Date()).getTime() + " ul>li:not(:contains('鞍山'))");              });           })      </script>   </head>  <body>          <button id="btnAjaxGet">使用Load執(zhí)行Get請(qǐng)求</button><br />      <button id="btnAjaxPost">使用Load執(zhí)行Post請(qǐng)求</button><br />      <button id="btnAjaxCallBack">使用帶有回調(diào)函數(shù)的Load方法</button><br />      <button id="btnAjaxFiltHtml">使用selector過(guò)濾返回的HTML內(nèi)容</button>      <br />      <div id="divResult"></div>  </body>  </html>

上面的示例演示了如何使用Load方法.

提示:我們要時(shí)刻注意瀏覽器緩存, 當(dāng)使用GET方式時(shí)要添加時(shí)間戳參數(shù) (net Date()).getTime() 來(lái)保證每次發(fā)送的URL不同, 可以避免瀏覽器緩存.

提示: 當(dāng)在url參數(shù)后面添加了一個(gè)空格, 比如" "的時(shí)候, 會(huì)出現(xiàn)"無(wú)法識(shí)別符號(hào)"的錯(cuò)誤, 請(qǐng)求還是能正常發(fā)送. 但是無(wú)法加載HTML到DOM. 刪除后問(wèn)題解決.

2.jQuery.get( url, [data], [callback], [type] )

Returns:XMLHttpRequest

說(shuō)明:

通過(guò)遠(yuǎn)程 HTTP GET 請(qǐng)求載入信息。

這是一個(gè)簡(jiǎn)單的 GET 請(qǐng)求功能以取代復(fù)雜 $.ajax 。請(qǐng)求成功時(shí)可調(diào)用回調(diào)函數(shù)。如果需要在出錯(cuò)時(shí)執(zhí)行函數(shù),請(qǐng)使用 $.ajax。

講解:

此函數(shù)發(fā)送Get請(qǐng)求, 參數(shù)可以直接在url中拼接, 比如:

$.get("../data/AjaxGetMethod.aspx?param=btnAjaxGet_click");   //或者通過(guò)data參數(shù)傳遞:   $.get("../data/AjaxGetMethod.aspx", { "param": "btnAjaxGet2_click" });

兩種方式效果相同, data參數(shù)會(huì)自動(dòng)添加到請(qǐng)求的url中

如果url中的某個(gè)參數(shù), 又通過(guò)data參數(shù)傳遞, 不會(huì)自動(dòng)合并相同名稱(chēng)的參數(shù).

回調(diào)函數(shù)的簽名如下:

function (data, textStatus) {    // data could be xmlDoc, jsonObj, html, text, etc...    this; // the options for this ajax request  }

其中data是返回的數(shù)據(jù), testStatus表示狀態(tài)碼, 可能是如下值:

"timeout","error","notmodified","success","parsererror"

在回調(diào)函數(shù)中的this是獲取options對(duì)象的引用.有關(guān)options的各種說(shuō)明, 請(qǐng)參見(jiàn):

http://docs.jquery.com/Ajax/jQuery.ajax#options

type參數(shù)是指data數(shù)據(jù)的類(lèi)型, 可能是下面的值:

"xml", "html", "script", "json", "jsonp", "text".

默認(rèn)為"html".

jQuery.getJSON( url, [data], [callback] ) 方法就相當(dāng)于 jQuery.get(url, [data],[callback], "json")

3. jQuery.getJSON( url, [data], [callback] )

Returns:XMLHttpRequest

相當(dāng)于:jQuery.get(url, [data],[callback], "json")

說(shuō)明:

通過(guò) HTTP GET 請(qǐng)求載入 JSON 數(shù)據(jù)。

在 jQuery 1.2 中,您可以通過(guò)使用JSONP 形式的回調(diào)函數(shù)來(lái)加載其他網(wǎng)域的JSON數(shù)據(jù),如 "myurl?callback=?"。jQuery 將自動(dòng)替換 ? 為正確的函數(shù)名,以執(zhí)行回調(diào)函數(shù)。

注意:此行以后的代碼將在這個(gè)回調(diào)函數(shù)執(zhí)行前執(zhí)行。

講解:

getJSON函數(shù)僅僅將get函數(shù)的type參數(shù)設(shè)置為"JSON"而已. 在回調(diào)函數(shù)中獲取的數(shù)據(jù)已經(jīng)是按照J(rèn)SON格式解析后的對(duì)象了:

$.getJSON("../data/AjaxGetCityInfo.aspx", { "resultType": "json" }, function(data, textStatus)  {        alert(data.length);        alert(data[0].CityName);  });

服務(wù)器端返回的字符串如下:

[{""pkid"":""0997"",""ProvinceId"":""XJ"",""CityName"":""阿克蘇"",""CityNameEn"":""Akesu"",""PostCode"":""843000"",""isHotCity"":false},

{""pkid"":""0412"",""ProvinceId"":""LN"",""CityName"":""鞍山"",""CityNameEn"":""Anshan"",""PostCode"":""114000"",""isHotCity"":false}]

示例中我返回的餓是一個(gè)數(shù)組, 使用data.length可以獲取數(shù)組的元素個(gè)數(shù), data[0]訪問(wèn)***個(gè)元素, data[0].CityName訪問(wèn)***個(gè)元素的CityName屬性.

4.jQuery.getScript( url, [callback] )

Returns:XMLHttpRequest

相當(dāng)于: jQuery.get(url, null, [callback], "script")

說(shuō)明:

通過(guò) HTTP GET 請(qǐng)求載入并執(zhí)行一個(gè) JavaScript 文件。

jQuery 1.2 版本之前,getScript 只能調(diào)用同域 JS 文件。 1.2中,您可以跨域調(diào)用 JavaScript 文件。注意:Safari 2 或更早的版本不能在全局作用域中同步執(zhí)行腳本。如果通過(guò) getScript 加入腳本,請(qǐng)加入延時(shí)函數(shù)。

講解:

以前我使用dojo類(lèi)庫(kù)時(shí)官方默認(rèn)的文件不支持跨域***導(dǎo)致我放棄使用dojo(雖然在網(wǎng)上找到了可以跨域的版本, 但是感覺(jué)不夠***). 所以我特別對(duì)這個(gè)函數(shù)的核心實(shí)現(xiàn)和使用做了研究.

首先了解此函數(shù)的jQuery內(nèi)部實(shí)現(xiàn), 仍然使用get函數(shù), jQuery所有的Ajax函數(shù)包括get***都是用的是jQuery.ajax(), getScript將傳入值為"script"的type參數(shù), ***在Ajax函數(shù)中對(duì)type為script的請(qǐng)求做了如下處理:

var head = document.getElementsByTagName("head")[0];              var script = document.createElement("script");  script.src = s.url;   //上面的代碼動(dòng)態(tài)建立了一個(gè)script語(yǔ)句塊, 并且將其加入到head中:   head.appendChild(script);   //當(dāng)腳本加載完畢后, 再?gòu)膆ead中刪除:  // Handle Script loading     if ( !jsonp ) {        var done = false;        // Attach handlers for all browsers        script.onload = script.onreadystatechange = function(){            if ( !done && (!this.readyState ||                this.readyState == "loaded" || this.readyState == "complete") ) {                   done = true;                   success();                   complete();                    // Handle memory leak in IE                   script.onload = script.onreadystatechange = null;                   head.removeChild( script );             }        };    }

我主要測(cè)試了此函數(shù)的跨域訪問(wèn)和多瀏覽器支持.下面是結(jié)果:

 IE6FireFox注意事項(xiàng)
非跨域引用js通過(guò)通過(guò)回調(diào)函數(shù)中的data和textStatus均可用
跨域引用js通過(guò)通過(guò)回調(diào)函數(shù)中的data和textStatus均為undifined

下面是我關(guān)鍵的測(cè)試語(yǔ)句, 也用來(lái)演示如何使用getScript函數(shù):

$("#btnAjaxGetScript").click(function(event)  {      $.getScript("../scripts/getScript.js", function(data, textStatus)      {          alert(data);          alert(textStatus);          alert(this.url);      });  });   $("#btnAjaxGetScriptCross").click(function(event)  {      $.getScript("http://resource.elong.com/getScript.js", function(data, textStatus)      {          alert(data);          alert(textStatus);          alert(this.url);      });  });

5. jQuery.post( url, [data], [callback], [type] )

Returns: XMLHttpRequest

說(shuō)明:

通過(guò)遠(yuǎn)程 HTTP POST 請(qǐng)求載入信息。

這是一個(gè)簡(jiǎn)單的 POST 請(qǐng)求功能以取代復(fù)雜 $.ajax 。請(qǐng)求成功時(shí)可調(diào)用回調(diào)函數(shù)。如果需要在出錯(cuò)時(shí)執(zhí)行函數(shù),請(qǐng)使用 $.ajax。

講解:

具體用法和get相同, 只是提交方式由"GET"改為"POST".

6. jQuery.ajax( options )

Returns:XMLHttpRequest

說(shuō)明:

通過(guò) HTTP 請(qǐng)求加載遠(yuǎn)程數(shù)據(jù)。

jQuery 底層 AJAX 實(shí)現(xiàn)。簡(jiǎn)單易用的高層實(shí)現(xiàn)見(jiàn) $.get, $.post 等。

$.ajax() 返回其創(chuàng)建的 XMLHttpRequest 對(duì)象。大多數(shù)情況下你無(wú)需直接操作該對(duì)象,但特殊情況下可用于手動(dòng)終止請(qǐng)求。

$.ajax() 只有一個(gè)參數(shù):參數(shù) key/value 對(duì)象,包含各配置及回調(diào)函數(shù)信息。詳細(xì)參數(shù)選項(xiàng)見(jiàn)下。

注意: 如果你指定了 dataType 選項(xiàng),請(qǐng)確保服務(wù)器返回正確的 MIME 信息,(如 xml 返回 "text/xml")。錯(cuò)誤的 MIME 類(lèi)型可能導(dǎo)致不可預(yù)知的錯(cuò)誤。見(jiàn) Specifying the Data Type for AJAX Requests 。

注意:如果dataType設(shè)置為"script",那么所有的遠(yuǎn)程(不在同一域名下)的POST請(qǐng)求都將轉(zhuǎn)化為GET請(qǐng)求。(因?yàn)閷⑹褂肈OM的script標(biāo)簽來(lái)加載)

jQuery 1.2 中,您可以跨域加載 JSON 數(shù)據(jù),使用時(shí)需將數(shù)據(jù)類(lèi)型設(shè)置為 JSONP。使用 JSONP 形式調(diào)用函數(shù)時(shí),如 "myurl?callback=?" jQuery 將自動(dòng)替換 ? 為正確的函數(shù)名,以執(zhí)行回調(diào)函數(shù)。數(shù)據(jù)類(lèi)型設(shè)置為 "jsonp" 時(shí),jQuery 將自動(dòng)調(diào)用回調(diào)函數(shù)。

講解:

這是jQuery中Ajax的核心函數(shù), 上面所有的發(fā)送Ajax請(qǐng)求的函數(shù)內(nèi)部***都會(huì)調(diào)用此函數(shù).options參數(shù)支持很多參數(shù), 使用這些參數(shù)可以完全控制ajax請(qǐng)求. 在Ajax回調(diào)函數(shù)中的this對(duì)象也是options對(duì)象.

因?yàn)槠綍r(shí)使用最多的還是簡(jiǎn)化了的get和post函數(shù), 所以在此不對(duì)options參數(shù)做詳細(xì)講解了. options參數(shù)文檔請(qǐng)見(jiàn):http://docs.jquery.com/Ajax/jQuery.ajax#options

三. Ajax相關(guān)函數(shù).

jQuery提供了一些相關(guān)函數(shù)能夠輔助Ajax函數(shù)。

1. jQuery.ajaxSetup( options )

無(wú)返回值

說(shuō)明:

設(shè)置全局 AJAX 默認(rèn)options選項(xiàng)。

講解:

有時(shí)我們的希望設(shè)置頁(yè)面上所有Ajax屬性的默認(rèn)行為.那么就可以使用此函數(shù)設(shè)置options選項(xiàng), 此后所有的Ajax請(qǐng)求的默認(rèn)options將被更改.

options是一個(gè)對(duì)象, 可以設(shè)置的屬性請(qǐng)此連接:http://docs.jquery.com/Ajax/jQuery.ajax#toptions

比如在頁(yè)面加載時(shí), 我使用下面的代碼設(shè)置Ajax的默認(rèn)option選項(xiàng):

$.ajaxSetup({      url: "../data/AjaxGetMethod.aspx",      data: { "param": "ziqiu.zhang" },      global: false,      type: "POST",      success: function(data, textStatus) { $("#divResult").html(data); }  });

上面的代碼設(shè)置了一個(gè)Ajax請(qǐng)求需要的基本數(shù)據(jù): 請(qǐng)求url, 參數(shù), 請(qǐng)求類(lèi)型, 成功后的回調(diào)函數(shù).

此后我們可以使用無(wú)參數(shù)的get(), post()或者ajax()方法發(fā)送ajax請(qǐng)求.完整的示例代碼如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.org/1999/xhtml">  <head>      <title>jQuery Ajax - Load</title>       <script type="text/javascript" src="../scripts/jquery-1.3.2-vsdoc2.js"></script>       <script type="text/javascript">          $(document).ready(function()          {              $.ajaxSetup({                  url: "../data/AjaxGetMethod.aspx",                  data: { "param": "ziqiu.zhang" },                  global: false,                  type: "POST",                  success: function(data, textStatus) { $("#divResult").html(data); }              });               $("#btnAjax").click(function(event) { $.ajax(); });              $("#btnGet").click(function(event) { $.get(); });              $("#btnPost").click(function(event) { $.post(); });              $("#btnGet2").click(function(event) { $.get("../data/AjaxGetMethod.aspx",{ "param": "other" }); });           });       </script>   </head>    <body>          <button id="btnAjax">不傳遞參數(shù)調(diào)用ajax()方法</button><br />      <button id="btnGet">不傳遞參數(shù)調(diào)用get()方法</button><br />      <button id="btnPost">不傳遞參數(shù)調(diào)用post()方法</button><br />      <button id="btnGet2">傳遞參數(shù)調(diào)用get()方法, 使用全局的默認(rèn)回調(diào)函數(shù)</button><br />      <br />      <div id="divResult"></div>  </body>  </html>

注意當(dāng)使用get()或者post()方法時(shí), 除了type參數(shù)將被重寫(xiě)為"GET"或者"POST"外, 其他參數(shù)只要不傳遞都是使用默認(rèn)的全局option. 如果傳遞了某一個(gè)選項(xiàng), 比如***一個(gè)按鈕傳遞了url和參數(shù), 則本次調(diào)用會(huì)以傳遞的選項(xiàng)為準(zhǔn). 沒(méi)有傳遞的選項(xiàng)比如回調(diào)函數(shù)還是會(huì)使用全局option設(shè)置值.

2.serialize( )

Returns:String

說(shuō)明:

序列表表格內(nèi)容為字符串,用于 Ajax 請(qǐng)求。

序列化最常用在將表單數(shù)據(jù)發(fā)送到服務(wù)器端時(shí). 被序列化后的數(shù)據(jù)是標(biāo)準(zhǔn)格式, 可以被幾乎所有的而服務(wù)器端支持.

為了盡可能正常工作, 要求被序列化的表單字段都有name屬性, 只有一個(gè)eid是無(wú)法工作的.

像這樣寫(xiě)name屬性:

<input id="email" name="email" type="text" />

講解:

serialize()函數(shù)將要發(fā)送給服務(wù)器的form中的表單對(duì)象拼接成一個(gè)字符串. 便于我們使用Ajax發(fā)送時(shí)獲取表單數(shù)據(jù). 這和一個(gè)From按照Get方式提交時(shí), 自動(dòng)將表單對(duì)象的名/值放到url上提交差不多.

比如這樣一個(gè)表單:

如何使用jQuery方便快捷的實(shí)現(xiàn)Ajax功能

生成的字符串為:single=Single&para;m=Multiple&para;m=Multiple3&check=check2&radio=radio1

提示:代碼見(jiàn) chapter6\7-serialize.htm

3.serializeArray( )Returns: Array

 Returns: Array<Object>

說(shuō)明:

序列化表格元素 (類(lèi)似 '.serialize()' 方法) 返回 JSON 數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)。

注意,此方法返回的是JSON對(duì)象而非JSON字符串。需要使用插件或者第三方庫(kù)進(jìn)行字符串化操作。

講解:

看說(shuō)明文檔讓我有所失望, 使用此函數(shù)獲取到的是JSON對(duì)象, 但是jQuery中沒(méi)有提供將JSON對(duì)象轉(zhuǎn)化為JSON字符串的方法.

在JSON官網(wǎng)上沒(méi)有找到合適的JSON編譯器, ***選用了jquery.json這個(gè)jQuery插件:

http://code.google.com/p/jquery-json/

使用起來(lái)異常簡(jiǎn)單:

var thing = {plugin: 'jquery-json', version: 1.3};  var encoded = $.toJSON(thing);              //'{"plugin": "jquery-json", "version": 1.3}'  var name = $.evalJSON(encoded).plugin;      //"jquery-json"  var version = $.evalJSON(encoded).version;  // 1.3

使用serializeArray( ) 再配合 $.toJSON 方法, 我們可以很方便的獲取表單對(duì)象的JSON, 并且轉(zhuǎn)換為JSON字符串:

$("#results").html( $.toJSON( $("form").serializeArray() ));

結(jié)果為:

[{"name": "single", "value": "Single"}, {"name": "param", "value": "Multiple"}, {"name": "param", "value": "Multiple3"}, {"name": "check", "value": "check2"}, {"name": "radio", "value": "radio1"}]

四. 全局Ajax事件

在jQuery.ajaxSetup( options ) 中的options參數(shù)屬性中, 有一個(gè)global屬性:

global

類(lèi)型:布爾值

默認(rèn)值: true

說(shuō)明:是否觸發(fā)全局的Ajax事件.

這個(gè)屬性用來(lái)設(shè)置是否觸發(fā)全局的Ajax事件. 全局Ajax事件是一系列伴隨Ajax請(qǐng)求發(fā)生的事件.主要有如下事件:

名稱(chēng)說(shuō)明
ajaxComplete( callback )AJAX 請(qǐng)求完成時(shí)執(zhí)行函數(shù)
ajaxError( callback )AJAX 請(qǐng)求發(fā)生錯(cuò)誤時(shí)執(zhí)行函數(shù)
ajaxSend( callback )AJAX 請(qǐng)求發(fā)送前執(zhí)行函數(shù)
ajaxStart( callback )AJAX 請(qǐng)求開(kāi)始時(shí)執(zhí)行函數(shù)
ajaxStop( callback )AJAX 請(qǐng)求結(jié)束時(shí)執(zhí)行函數(shù)
ajaxSuccess( callback )AJAX 請(qǐng)求成功時(shí)執(zhí)行函數(shù)

用一個(gè)示例講解各個(gè)事件的觸發(fā)順序:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.org/1999/xhtml">  <head>      <title>jQuery Ajax - AjaxEvent</title>       <script type="text/javascript" src="../scripts/jquery-1.3.2.min.js"></script>       <script type="text/javascript">          $(document).ready(function()          {               $("#btnAjax").bind("click", function(event)              {                  $.get("../data/AjaxGetMethod.aspx");              })               $("#divResult").ajaxComplete(function(evt, request, settings) { $(this).append('<div>ajaxComplete</div>'); })              $("#divResult").ajaxError(function(evt, request, settings) { $(this).append('<div>ajaxError</div>'); })              $("#divResult").ajaxSend(function(evt, request, settings) { $(this).append('<div>ajaxSend</div>'); })              $("#divResult").ajaxStart(function() { $(this).append('<div>ajaxStart</div>'); })              $("#divResult").ajaxStop(function() { $(this).append('<div>ajaxStop</div>'); })              $("#divResult").ajaxSuccess(function(evt, request, settings) { $(this).append('<div>ajaxSuccess</div>'); })           });       </script>   </head>  <body>        <br /><button id="btnAjax">發(fā)送Ajax請(qǐng)求</button><br/>    <div id="divResult"></div>  </body>  </html>

結(jié)果如圖:

如何使用jQuery方便快捷的實(shí)現(xiàn)Ajax功能

我們可以通過(guò)將默認(rèn)options的global屬性設(shè)置為false來(lái)取消全局Ajax事件的觸發(fā).

五. 注意事項(xiàng)

如果在Get請(qǐng)求發(fā)送的url中有兩個(gè)同名參數(shù), 比如兩個(gè)param參數(shù):

http://localhost/AjaxGetMethod.aspx?param=Multiple&param=Multiple3

使用服務(wù)器端方法獲取param參數(shù):

if (!String.IsNullOrEmpty(HttpContext.Current.Request["Param"]))  {     param = HttpContext.Current.Request["Param"];  }

此時(shí)獲取到得param是一個(gè)用","分隔多個(gè)值的字符串:

Multiple,Multiple3

六. 總結(jié)

本文介紹如何使用jquery實(shí)現(xiàn)Ajax功能. 用于發(fā)送Ajax請(qǐng)求的相關(guān)函數(shù)如load, get, getJSON和post這些漸變Ajax方法, 對(duì)于核心的ajax 方法沒(méi)有過(guò)多介紹, 主要是通過(guò)配置復(fù)雜的參數(shù)實(shí)現(xiàn)完全控制Ajax請(qǐng)求. 另外講解了ajax的輔助函數(shù)比如用于序列化表單對(duì)象為字符串的serialize()方法, 用于將表單對(duì)象序列化為JSON對(duì)象的serializeArray()方法. 這些在使用腳本獲取數(shù)據(jù)實(shí)現(xiàn)與服務(wù)器端交互是很有用, JSON格式的數(shù)據(jù)在處理大對(duì)象編程時(shí)將我們從混亂的屬性字符串中解放出來(lái).

jQuery還提供錄入全局ajax事件這一個(gè)特殊的事件, 并且可以在一個(gè)對(duì)象上設(shè)置這些事件, 在發(fā)送Ajax請(qǐng)求的各個(gè)生命周期上會(huì)調(diào)用這些事件, 可以通過(guò)修改默認(rèn)的options對(duì)象的global屬性打開(kāi)或關(guān)閉全局事件.

看完上述內(nèi)容,你們掌握如何使用jQuery方便快捷的實(shí)現(xiàn)Ajax功能的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

當(dāng)前題目:如何使用jQuery方便快捷的實(shí)現(xiàn)Ajax功能
標(biāo)題來(lái)源:http://muchs.cn/article2/ipjdoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管虛擬主機(jī)、網(wǎng)站維護(hù)動(dòng)態(tài)網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)