一、load() 加載頁面數據
load(url,[data],[callback]) url:加載的頁面地址,[data]傳送的數據,[callback]加載完成時回調函數。
設計一個load.html代碼如下:
1 <body> 2 <div id="div1"> 3 我是div1 4 </div> 5 <div id="div2"> 6 我是div2 7 </div> 8 </body>
$("div1").load("load.html"); //將load.html頁面的內容顯示在id=div1的div元素內
加載完成后,由於是AJAX所以頁面代碼不改變,但是頁面變為
另外‘:url:參數還可以用於篩選要加載頁面中的某部分內容
$("div1").load("load.html #div1");
加載完成后的效果為:
可以看到,篩選出了div上的id="div1"的元素內容。
二、getjson() 獲取json文件
語法:getJson(url,[data],[callback])
設計一個json文件UserInfo.json如下:
[ { "name":"劉德華", "sex":"男", "email":"liudehua@qq.com" }, { "name":"張學友", "sex":"男", "email":"zhangxueyou@qq.com" } ]
$(function(){
$.getJson("/UserInfo.json",function(){
$("#div1").empty();
var strHtml = "";
$.each(data,function(InfoIndex,info){
strHtml += "姓名:" + Info["name"] + "<br>";
strHtml += "性別:" + Info["name"] + "<br>";
strHtml += "郵箱:" + Info["name"] + "<br>";
})
$("#div1").html(strHtml);
})
})
三、$.getstricp() 獲取js文件
語法: $.getScript(url,[callback]) 獲取js腳本,通過全局函數$.getScript()獲取到的腳本會自動執行。
新建一個js文件,命名userinfo.js
var data = [ { "name": "劉德華", "sex": "男", "email": "liudehua@qq.com" }, { "name": "張學友", "sex": "男", "email": "zhangxueyou@qq.com" } ]; var strHtml = ""; $.each(data, function () { strHtml += "姓名:" + this["name"] + "<br/>"; strHtml += "性別:" + this["sex"] + "<br/>"; strHtml += "郵箱:" + this["email"] + "<hr/>"; }) $("#div1").html(strHtml);
頁面代碼:
$(function(){ $.getScript("userinfo.js",function(){ alert("js腳本加載完成!"); }) })
<div id="div1">
</div>
執行結果:
四、$.get 請求數據
語法:$.get(url,[data],[callback],[type]) url:等待加載的數據地址,[data]發送到服務器的數據,key/value形式,[callback]加載成功時執行的回調函數,[type]表示返回數據的個數。
1、$.get() 異步請求xml文件。
新建一個xml文件:
<?xml version="1.0" encoding="utf-8" ?> <Info> <User id="1"> <name>劉德華</name> <sex>男</sex> <email>liudehua@qq.com</email> </User> <User id="2"> <name>張學友</name> <sex>男</sex> <email>zhangxueyou@qq.com</email> </User> </Info>
頁面代碼:
$(function () { $.get("UserInfo.xml", function (data) { $("#div1").empty(); var strHtml = ""; $(data).find("User").each(function () { var $strUser = $(this); strHtml += "姓名:" + $strUser.find("name").text() + "<br/>"; strHtml += "性別:" + $strUser.find("sex").text() + "<br/>"; strHtml += "郵箱:" + $strUser.find("email").text() + "<hr/>"; }) $("#div1").html(strHtml); }) })
HTML:
<div id="div1">
</div>
執行結果:
2.$.get() 請求服務器數據
新建一個aspx文件,userinfo.aspx.cs內容
protected void Page_Load(object sender, EventArgs e) { string strName = System.Web.HttpUtility.UrlDecode(Request["name"]); string strHtml = "<div class='div1'>"; if (strName == "劉德華") { strHtml += "姓名:劉德華<br/>"; strHtml += "性別:男<br/>"; strHtml += "郵箱:liudehua@qq.com<hr/>"; } else if (strName == "張學友") { strHtml += "姓名:張學友<br/>"; strHtml += "性別:男<br/>"; strHtml += "郵箱:zhangxueyou@qq.com<hr/>"; } strHtml += "</div>"; Response.Write(strHtml); }
頁面代碼:
$(function () { $.get("UserInfo.aspx", {name:encodeURI("張學友")}, function (data) { $("#div1").empty().html(data); }) })
五、$.post() $.post()與$.get()沒有本質上的區別,不容的是$.get()不適合傳遞數據量較大的數據。
語法:$.post(url,[data],[callback],[type]) url:等待加載的數據地址,[data]發送到服務器的數據,key/value形式,[callback]加載成功時執行的回調函數,[type]表示返回數據的個數。
新建一個userinfo.aspx文件,其中userinfo.aspx.cs代碼為:
protected void Page_Load(object sender, EventArgs e) { string strName = System.Web.HttpUtility.UrlDecode(Request["name"]); string strSex = System.Web.HttpUtility.UrlDecode(Request["sex"]); string strHtml = ""; if (strName == "劉德華" && strSex == "男") { strHtml += "姓名:劉德華<br/>"; strHtml += "性別:男<br/>"; strHtml += "郵箱:liudehua@qq.com<hr/>"; } else if (strName == "張學友" && strSex == "男") { strHtml += "姓名:張學友<br/>"; strHtml += "性別:男<br/>"; strHtml += "郵箱:zhangxueyou@qq.com<hr/>"; } Response.Write(strHtml); }
頁面代碼:
$(function () { $.post("UserInfo.aspx", {name:encodeURI("劉德華"),sex:encodeURI("男")}, function (data) { $("#div1").empty().html(data); }) })
Html:
<div id="div1">
</div>
六、$.ajax() 最底層的jQuery AJAX函數
語法:$.ajax([options]) 其中[options]為可選參數,對應的意思參見下表。
參數名 類型 描述
url String 發送請求的地址
type String 數據請求方式(post或get),默認為get
data String 發送到服務器上的數據,如果不是字符串格式則自動轉為i字符串格式,get方法則附在html請求地址后面。
dataType String 服務器返回的數據類型,如果不指定,jQuery自動根據HTTP包判斷。可為:html、script、text、xml、json。
beforeSend Function 該函數用於發送請求前修改XMLHttpRequest對象。其中參數就是XMLHttpRequest對象,由於該函數本身是jQuery事件, 因此,如果函數返回false,則表示取消本次事件。
complete Function 請求完成后調用的回調函數,該函數無論數據發送成功或失敗都會調用,該函數有兩個參數,一個是XMLHttpRequest對 象,另一個是strStatus,用於描述成功請求類型的字符串。
success Function 請求成功后調用的回調函數,該函數有三個參數。第一個是XMLHttpRequest對象,第二個是strError,第三個是捕捉到 的錯誤對象strObject、
error Function 請求失敗后調用的回調函數,該函數有三個參數,第一個是XMLHttpRequest對象,第二個是出錯信息strError,第三個是 捕捉到的錯誤對象strObject。
timeout Number 請求超時的時間(毫秒),該設置將覆蓋$.ajaxSetup()方法中同樣的設置。
global Boolean 是否相應全局事件,默認是true,表示響應,如果設置成false,表示不響應,那么全局事件$.ajaxStart等將不響應。例如: 全局時間設定了清除緩存 $.ajaxSetup({ cache:false; });但啟動了global:false;將忽略全局中的設置,繼續使用緩存,同 時不觸發全局事件。
async Boolean 是否為異步請求,默認是true,表示是異步,如果設置成false,表示是同步請求。
cache Boolean 是否進行頁面緩存,true表示進行緩存,false表示不進行頁面緩存。
traditional Boolean 是否使用傳統的方式傳遞參數。目前知道的默認傳遞數組,后面會加[]。
新建一個Login.aspx 其中Login.aspx.cs代碼為
protected void Page_Load(object sender, EventArgs e) { string strName = System.Web.HttpUtility.UrlDecode(Request["txtName"]); string strPass = System.Web.HttpUtility.UrlDecode(Request["txtPass"]); bool blnLogin = false; if (strName == "admin" && strPass == "123456") { blnLogin = true; } Response.Clear(); //注意要先清空,再寫,再end()至於為什么要這樣,暫時還不清楚,但是如果不這樣做,會將整個頁面的都返回給AJAX請求。 Response.Write(blnLogin); Response.End(); }
前台JS代碼:
$(function () { $("#btnLogin").click(function () { $.ajax({ url: "userinfo.aspx", dataType: "html", data: { txtName: encodeURI($("#txtName").val()), txtPass: encodeURI($("#txtPass").val()) }, success: function (response) { alert(response.length); if (response == "True") { $(".clsShow").html("登錄成功"); } else { $("#divError").html("用戶名或密碼錯誤"); } } }) }) })
前台HTML代碼:
<div class="divFrame"> <div> <span>用戶登錄</span> </div> <div class="divContent"> <div class="clsShow"> <div id="divError" class="clsError"> </div> <div> 名稱:<input id="txtName" type="text" class="txt" /></div> <div> 名稱:<input id="txtPass" type="password" class="txt" /></div> <div> <input id="btnLogin" type="button" value="登錄" class="btn" /> <input id="btnReset" type="button" value="取消" class="btn" /> </div> </div> </div> </div>
七、全局函數
全局事件列表
事件名稱 參數 功能描述
ajaxComplete(fn) function Ajax請求完成時的函數
ajaxError(fn) function Ajax請求發生錯誤時執行函數,捕捉到的錯誤可作為最后一個參數傳遞。
ajaxSend(fn) function Ajax請求發送前執行函數
ajaxStart(fn) function Ajax請求開始時執行函數
ajaxStop(fn) function Ajax請求結束時實行函數
ajaxSuccess(fn) function Ajax請求成功時執行函數
八、ajax全局設置,對當前頁面所有的ajax請求有效。
$.ajaxSetup({ cache: false //關閉AJAX相應的緩存,這樣就相當於加了個new Date();不會再獲取服務器緩存 });
參數名 |
類型 |
描述 |
url |
String |
(默認: 當前頁地址) 發送請求的地址。 |
type |
String |
(默認: “GET”) 請求方式 (”POST” 或 “GET”), 默認為 “GET”。注意:其它 HTTP 請求方法,如 PUT 和 DELETE 也可以使用,但僅部分瀏覽器支持。 |
timeout |
Number |
設置請求超時時間(毫秒)。此設置將覆蓋全局設置。 |
async |
Boolean |
(默認: true) 默認設置下,所有請求均為異步請求。如果需要發送同步請求,請將此選項設置為 false。注意,同步請求將鎖住瀏覽器,用戶其它操作必須等待請求完成才可以執行。 |
beforeSend |
Function |
發送請求前可修改 XMLHttpRequest 對象的函數,如添加自定義 HTTP 頭。XMLHttpRequest 對象是唯一的參數。 function(XMLHttpRequest) {this;// the options for this ajax request} |
cache |
Boolean |
(默認: true) jQuery 1.2 新功能,設置為 false 將不會從瀏覽器緩存中加載請求信息。 |
complete |
Function |
請求完成后回調函數 (請求成功或失敗時均調用)。參數: XMLHttpRequest 對象,成功信息字符串。 function(XMLHttpRequest, textStatus) {this;// the options for this ajax request} |
contentType |
String |
(默認: “application/x-www-form-urlencoded”) 發送信息至服務器時內容編碼類型。默認值適合大多數應用場合。 |
data |
Object, |
發送到服務器的數據。將自動轉換為請求字符串格式。GET 請求中將附加在 URL 后。查看 processData 選項說明以禁止此自動轉換。必須為 Key/Value 格式。如果為數組,jQuery 將自動為不同值對應同一個名稱。如 {foo:["bar1", "bar2"]} 轉換為 ‘&foo=bar1&foo=bar2′。 |
dataType |
String |
預期服務器返回的數據類型。如果不指定,jQuery 將自動根據 HTTP 包 MIME 信息返回 responseXML 或 responseText,並作為回調函數參數傳遞,可用值: “xml”: 返回 XML 文檔,可用 jQuery 處理。 “html”: 返回純文本 HTML 信息;包含 script. 元素。 “script”: 返回純文本 JavaScript. 代碼。不會自動緩存結果。 “json”: 返回 JSON 數據 。 “jsonp”:JSONP格式。使用JSONP形式調用函數時,如 “myurl?callback=?” jQuery 將自動替換 ? 為正確的函數名,以執行回調函數。 |
error |
Function |
(默認: 自動判斷 (xml 或 html)) 請求失敗時將調用此方法。這個方法有三個參數:XMLHttpRequest 對象,錯誤信息,(可能)捕獲的錯誤對象。 function(XMLHttpRequest, textStatus, errorThrown) {// 通常情況下textStatus和errorThown只有其中一個有值this;// the options for this ajax request} |
global |
Boolean |
(默認: true) 是否觸發全局 AJAX 事件。設置為 false 將不會觸發全局 AJAX 事件,如 ajaxStart 或 ajaxStop 。可用於控制不同的Ajax事件 |
ifModified |
Boolean |
(默認: false) 僅在服務器數據改變時獲取新數據。使用 HTTP 包 Last-Modified 頭信息判斷。 |
processData |
Boolean |
(默認: true) 默認情況下,發送的數據將被轉換為對象(技術上講並非字符串) 以配合默認內容類型 “application/x-www-form-urlencoded”。如果要發送 DOM 樹信息或其它不希望轉換的信息,請設置為 false。 |
success |
Function |
請求成功后回調函數。這個方法有兩個參數:服務器返回數據,返回狀態 function(data, textStatus) {// data could be xmlDoc, jsonObj, html, text, etc...this;// the options for this ajax request} |
九、jQuery的Ajax狀態碼
"success":請求已成功完成
"notmodified":請求已正常完成,但服務器返回的響應內容是HTTP304 "Not Modified"
"error":請求沒有成功完成,原因是某些HTTP錯誤
"timeout":如果Ajax請求沒有指定的超時區間內完成,會調用錯誤回調,並傳入該狀態碼
"parsererror":HTTP請求已經完成,但jQuery無法按照期望的方式解析。例如服務器響應的是不符合格式的xml文檔或不符合格式的JSON文本時,就會出現該狀態碼
十、dataType的選項列表
"text" 將服務器的響應作為純文本返回,不做任何處理。
"html" 該類型與"text"一樣,響應是純文本。load()方法使用該類型,將返回的文本插入到文檔自身中。
"xml" 請求的URL被認為指向XML格式的數據,jQuery使用xmlHttpRequest對象的responseXML屬性來替代responseText屬性,傳給回調函數的值是一個表示該 XML文檔的Document對象,而不是保存文檔文本的字符串。
"script" 請求的URL被認為指向javascript文件,返回的文本在傳入回調函數前,會被當做腳本執行。$.getScript()使用該類型。
"json" 請求的URL被認為指向JSON格式的數據文件,會使用jQuery.parseJSON()來解析返回的內容(parseJSON是把JSON轉成對象的。),得到JSON對象后才傳入回 調函數。jQuery.getJSON()使用該類型。如果類型是"json",同時URL或數據字符串含有"=?"。該類型會被轉成"jsonp"。
"jsonp" 請求的URL被認為指向服務器腳本,該腳本支持"jsonp"協議,可以將JSON格式的數據作為參數傳遞給客戶端指定的函數。
如果調用$.get(),$.post(),$.ajax()函數時沒有指定以上類型中的任何一個,則jQuery會檢查HTTP響應中的Content-type頭。如果該頭部信息包含"xml"字符串,則傳入回調函數中的是XML文檔,如果頭部包含"json"字符串,則數據被解析成JSON並把解析后的對象傳給回調函數。如果頭部含有"javascript"字符串,則數據被當做腳本執行。如果以上都不符合,則數據會被當做純文本處理。
十一、同步AJAX
2013-05-30:
之前一直沒遇到過這個問題,上次記得有次面試的時候,被面試官考到,當時回答不出,今天特地來補上
后台代碼如下:
public class HomeController : Controller { public ActionResult Index() { return View(); } public ActionResult GetName() { return Content("張三"); } }
前台代碼如下:
<!DOCTYPE html> <html> <head> <title>同步AJAX</title> <script src="/Scripts/jquery-1.7.2.min.js" type="text/javascript"></script> <script type="text/javascript"> $(function () { var str; $.ajax({ url: "/Home/GetName", dataType: "text", type: "post", success: function (response) { str = response; //此行代碼后執行 } }) alert(str); //此行代碼先執行 }) </script> </head> <body> </body> </html>
猜下以上代碼彈出什么?
彈出如下:
為什么呢?需要特別注意AJAX是異步,因為有可能后面的alert彈出代碼比前面的success函數的代碼先執行,此時str還沒有被賦值。
如果想獲取到值怎么辦?這就要留意到jQuery提供的另一個重要屬性啦。async, 默認設置下,所有請求均為異步請求。如果需要發送同步請求,請將此選項設置為 false。注意,同步請求將鎖住瀏覽器,用戶其它操作必須等待請求完成才可以執行。
因此修改一下就正確了:
<script type="text/javascript"> $(function () { var str; $.ajax({ url: "/Home/GetName", dataType: "text", async: false, type: "post", success: function (response) { str = response; } }) alert(str); }) </script>
顯示結果如下:
jQuery AJAX傳遞數組時,會在參數后面增加[],這個問題可以通過擴展ModleBinder解決,也可以將數組轉為字符串,然后后台再split解決。但是感覺都不爽,僅僅這樣一個小問題,就需要這么多的操作,有沒有更好的方法呢?經檢查,發現根本原因在於jQuery,是jQuery在后面增加了[],據說是為了適應PHP,如果不希望增加這樣一個[],那只需要增加一個屬性。
$(function () { var ids = [28,29]; alert(typeof (ids)); $.ajax({ url: "/Home/Index", type: "post", dataType: "text", data: { id: ids }, success: function (response) { alert(123); } }) })
增加屬性后:
$(function () { var ids = [28,29]; alert(typeof (ids)); $.ajax({ url: "/Home/Index", type: "post", dataType: "text", traditional:true, data: { id: ids }, success: function (response) { alert(123); } }) })
提交的參數: