簡介:
Ajax 即“A
synchronous J
avascript And X
ML”(異步 JavaScript 和 XML),是指一種創建交互式、快速動態
網頁應用的網頁開發技術,無需重新加載整個網頁的情況下,能夠更新部分網頁的技術。
通過在后台與服務器進行少量數據交換,Ajax 可以使網頁實現異步更新。這意味着可以在不重新加載整個網頁的情況下,對網頁的某部分進行更新。
Ajax字段含義:
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,
String 發送到服務器的數據。將自動轉換為請求字符串格式。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
}
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,
String 發送到服務器的數據。將自動轉換為請求字符串格式。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
}
代碼案例:
案例一:
if (cursel == 8) { var rows = $("#gvCardStat tbody").find("tr").length; if (rows == 1) {//判斷是否加載過, $.ajax({ type: "GET", url: "/ashx/CardStat.ashx", dataType: "json", async: false, success: function (response) { var arrayLenth = response.length; var table = $("#gvCardStat"); for (var i = 0; i < arrayLenth; i++) { var trHtml = "<tr>" + "<td>" + response[i].Region + "</td>" + "<td>" + response[i].YelloCards + "</td>" + "<td>" + response[i].RedCards + "</td>" + "<td>" + response[i].SumCount + "</td>" + "</tr>" $("#gvCardStat tbody").append(trHtml); } } }); } }
//一般處理程序ashx public void ProcessRequest(HttpContext context) { User user = Auth.GetUserReq(); IList<string> groupList = new List<string>() { "XX", "XXX", "XXXX" }; IList<RegionCheck> regionChecks = GetCheckProject(user, groupList); DataContractJsonSerializer serializer = new DataContractJsonSerializer(regionChecks.GetType()); string json = string.Empty; using (MemoryStream ms = new MemoryStream()) { serializer.WriteObject(ms, regionChecks); json = Encoding.UTF8.GetString(ms.ToArray()); } HttpContext.Current.Response.Write(json); }
案例二:
前端:
<input type="button" class="btns" value="查詢" id="searchBtn" onclick="GetDataList()" /> <script type="text/javascript"> $(function () { }); function GetDataList() { var formArray = $(document.forms[0]).serializeArray(); var obj = { name: "methodName", value: "GetDataList" }; formArray.push(obj); $.ajax({ url: "ProgressSummary.aspx", type: "post", dataType: "text", data: formArray, success: function (dataStr) { $("#datalist").html(""); var dataObj = JSON.parse(dataStr); if (dataObj.success + "" == "1") { var data = dataObj.data; //表頭第一行 var tr_3 = $("<tr></tr>"); tr_3.append($("<th rowspan='2'>地市</th>")); var head_2Str = data.ListHead_2.join(',') + ""; for (var i = 0; i < data.ListHead_1.length; i++) { tr_3.append($("<th colspan='" + head_2Str.match(RegExp(data.ListHead_1[i], "g")).length + "'>" + data.ListHead_1[i] + "</th>")); } $("#datalist").append(tr_3); //表頭第二行 var tr = $("<tr></tr>"); for (var i = 0; i < data.ListHead_2.length; i++) { if (i != 0) { tr.append($("<th>" + data.ListHead_2[i].split("_")[1] + "</th>")); } } $("#datalist").append(tr); //表內容 for (var i = 0; i < data.ListBody.length; i++) { var tr_1 = $("<tr></tr>"); for (var j = 0; j < data.ListBody[i].length; j++) { tr_1.append($("<td>" + data.ListBody[i][j] + "</td>")); } $("#datalist").append(tr_1); } } else { alert(dataObj.message); } }, error: function (data) { alert("出現未處理異常"); } }); } </script>
后端:
public string GetDataList() { object result = new { }; try { DataSet ds = new DataSet(); ds = IoCContainer.Get<IT_PCRoomProjectDao>().GetProgressSummary(plan_CitySelect.SelectedValue + ""); if (ds == null) { result = new { success = "0", message = "未查到數據" }; return Newtonsoft.Json.JsonConvert.SerializeObject(result); } object dataList = new object(); List<object> listHead_1 = new List<object>(); List<object> listHead_2 = new List<object>(); List<List<string>> listBody = new List<List<string>>(); List<string> totalObj = new List<string>(); foreach (DataRow dr in ds.Tables[0].Rows) { object obj = dr["name"] + ""; listHead_1.Add(obj); } foreach (DataRow dr in ds.Tables[1].Rows) { object obj = dr["name"] + ""; listHead_2.Add(obj); } for (int j = 0; j < ds.Tables[2].Rows.Count; j++) { List<string> obj = new List<string>(); for (int i = 0; i < ds.Tables[2].Columns.Count; i++) { obj.Add(ds.Tables[2].Rows[j][i] + "" == "0" ? "-" : ds.Tables[2].Rows[j][i] + ""); if (j == 0) { totalObj.Add(0 + ""); } if (i == 0) { totalObj[i] = "全省"; } else { totalObj[i] = (int.Parse(totalObj[i]) + int.Parse(ds.Tables[2].Rows[j][i] + "")) + ""; if (j == ds.Tables[2].Rows.Count - 1) totalObj[i] = totalObj[i] + "" == "0" ? "-" : totalObj[i] + ""; } } listBody.Add(obj); } if (plan_CitySelect.SelectedValue + "" == "") { listBody.Add(totalObj); } dataList = new { ListHead_1 = listHead_1, ListHead_2 = listHead_2, ListBody = listBody }; result = new { success = "1", message = "查詢成功", data = dataList }; } catch (Exception e) { result = new { success = "0", message = "查詢失敗," + e.Message, data = "" }; } return Newtonsoft.Json.JsonConvert.SerializeObject(result
優點:
1.最大的優點就是頁面無需刷新,在頁面內與服務器通信,非常好的用戶體驗。
2.使用異步的方式與服務器通信,不需要中斷操作。
3.可以把以前服務器負擔的工作轉嫁給客戶端,減輕服務器和帶寬,可以最大程度減少冗余請求。
4.基於標准化的並被廣泛支持的技術,不需要下載插件或者小程序。
缺點:
1.AJAX干掉了Back和History功能,即對瀏覽器機制的破壞。
在動態更新頁面的情況下,用戶無法回到前一個頁面狀態,因為瀏覽器僅能記憶歷史記錄中的靜態頁面。一個被完整讀入的頁面與一個已經被動態修改過的頁面之間的差別非常微妙;用戶通常會希望單擊后退按鈕能夠取消他們的前一次操作,但是在Ajax應用程序中,這將無法實現。
2.安全問題技術同時也對IT企業帶來了新的安全威脅,ajax技術就如同對企業數據建立了一個直接通道。這使得開發者在不經意間會暴露比以前更多的數據和服務器邏輯。ajax的邏輯可以對客戶端的安全掃描技術隱藏起來,允許黑客從遠端服務器上建立新的攻擊。還有ajax也難以避免一些已知的安全弱點,諸如跨站點腳步攻擊、SQL注入攻擊和基於credentials的安全漏洞等。
3.對搜索引擎的支持比較弱。如果使用不當,AJAX會增大網絡數據的流量,從而降低整個系統的性能。