jQuery.ajax()
jQuery.ajax( url, [ settings ] ) 返回: jqXHR
描述: 執(zhí)行一個異步的HTTP(Ajax)的請求。
-
version added: 1.5jQuery.ajax( url, [ settings ] )
url一個用來包含發(fā)送請求的URL字符串。
settings一個以"{鍵:值}"組成的AJAX 請求設置。所有選項都是可選的??梢允褂?a href="#p=jQuery.ajaxSetup">$.ajaxSetup()設置任何默認參數(shù)???a href="#jQuery-ajax-settings">jQuery.ajax( settings )下所有設置的完整列表。
-
version added: 1.0jQuery.ajax( settings )
settings一個以"{鍵:值}"組成的AJAX 請求設置。所有選項都是可選的??梢允褂?a href="#p=jQuery.ajaxSetup">$.ajaxSetup()設置任何默認參數(shù)。
$.ajax()函數(shù)所有的基礎jQuery的Ajax請求發(fā)送。它往往不是必須的,直接調用這個函數(shù),幾個高層次的替代品如$.get()和.load()可用,更容易使用,如果不常見的選項是必需的,不過, $.ajax()可以使用更靈活。
在簡單地說, $.ajax()函數(shù)可以不帶參數(shù)調用:
$.ajax();
注意: 所有的選項都可以通過$.ajaxSetup() 函數(shù)來全局設置
這個例子中,不使用選項,加載當前頁面的內容,但其結果沒有。若要使用結果,我們可以實現(xiàn)的回調功能之一。
jqXHR 對象
該jQuery的XMLHttpRequest(jqXHR)對象返回$.ajax() 在jQuery 1.5是一個對象的超集瀏覽器的原生的XMLHttpRequest。例如,它包含responseText和responseXML性能,以及一個getResponseHeader()方法。當傳輸機制是XMLHttpRequest以外的東西(例如,一個一個JSONP請求腳本標簽)的jqXHR對象盡可能的模擬原生的XHR功能。
在jQuery 1.5.1, 在jqXHR對象還包含了overrideMimeType方法。
$.ajax()返回的jqXHR對象 實現(xiàn)約定的接口,給他們的所有屬性,方法,和約定的行為(見Deferred object獲取更多信息)。為了方便和一致性$.ajax()回調函數(shù)名稱中使用。jqXHR也提供.error() .success()和.complete()方法。這些方法當$.ajax()請求終止時需要一個函數(shù)參數(shù)調用,這個函數(shù)接收$.ajax()回調函數(shù)名相同的參數(shù)。在jQuery 1.5這允許你指定一個請求的多個回調,甚至可能分配請求后已完成回調。(如果請求已經完成,回調立即觸發(fā)。)
// Assign handlers immediately after making the request,
// and remember the jqxhr object for this request
var jqxhr = $.ajax({ url: "example.php" })
.success(function() { alert("success"); })
.error(function() { alert("error"); })
.complete(function() { alert("complete"); });
// perform other work here ...
// Set another completion function for the request above
jqxhr.complete(function(){ alert("second complete"); });
為了向后兼容XMLHttpRequest ,一jqXHR對象將公開下列屬性和方法:
readyStatestatusstatusText-
responseXMLand/orresponseText當?shù)讓拥恼埱蠓謩e作出XML和/或文本響應 -
setRequestHeader(name, value)這背離了換上了新一舊的價值,而不是串聯(lián)的新值與舊標準 getAllResponseHeaders()getResponseHeader()abort()
假如沒有onreadystatechange機制,不管怎樣
由于success , error , complete和statusCode覆蓋所有可能的要求。
回調函數(shù)
如果要處理$.ajax()得到的數(shù)據(jù),則需要使用回調函數(shù)。beforeSend、error、dataFilter、success、complete。
在jQuery 1.5, error , success ,和complete回調鉤子先入先出隊列管理。這意味著你可以為每個掛鉤分配多個回調。見Deferred object methods ,這是實現(xiàn)內部的$.ajax()回調掛鉤。
在this回調是在所有參考對象在context選項傳遞給$.ajax在設置;如果context沒有指定, this是他們自己的Ajax設置參考。
某些類型Ajax的請求,如JSONP形式和跨域的GET請求,請不要使用XHR;在這些情況下XMLHttpRequest和textStatus參數(shù)傳遞給回調是undefined 。
這里有$.ajax()提供的鉤子回調 :
- beforeSend 在發(fā)送請求之前調用,它接收
jqXHR對象和settings作為參數(shù)對象。 - error 在請求出錯時調用。如果請求失敗,在它們的順序依次登記。他們收到
jqXHR,字符串表示的錯誤類型,如果適用的異常對象。一些內置的錯誤,將提供作為例外對象的字符串: "abort", "timeout", "No Transport"。 dataFilter在請求成功之后調用。傳入返回的數(shù)據(jù)以及dataType參數(shù)的值。并且必須返回新的數(shù)據(jù)(可能是處理過的)傳遞給success回調函數(shù)。success當請求之后調用。傳入返回后的數(shù)據(jù),以及包含成功代碼的字符串。他們收到返回的數(shù)據(jù),一個包含成功的代碼和jqXHR對象。complete它們的順序依次登記回調,請求完成時,無論是在失敗或成功。他們收到jqXHR對象,以及一個包含成功或錯誤代碼。
For example, 通過使用返回的HTML,我們可以實現(xiàn)一個success事件處理器:
$.ajax({
url: 'ajax/test.html',
success: function(data) {
$('.result').html(data);
alert('Load was performed.');
}
});
數(shù)據(jù)類型
$.ajax()函數(shù)依賴服務器提供的信息來處理返回的數(shù)據(jù)。如果服務器報告說返回的數(shù)據(jù)是XML,那么返回的結果就可以用普通的XML方法或者jQuery的選擇器來遍歷。如果見得到其他類型,比如HTML,則數(shù)據(jù)就以文本形式來對待。
通過dataType選項還可以指定其他不同數(shù)據(jù)處理方式。除了單純的XML,還可以指定 html、json、jsonp、script或者text。
其中,text和xml類型返回的數(shù)據(jù)不會經過處理。這些數(shù)據(jù)僅僅是傳遞給處理程序的成功,無論是通過responseText或responseXML所有的jqXHR對象。
注意:我們必須確保網頁服務器報告的MIME類型與我們選擇的dataType所匹配。比如說,XML的話,服務器端就必須聲明 text/xml 或者 application/xml 來獲得一致的結果。
如果指定為 html類型,任何內嵌的JavaScript都會在HTML作為一個字符串返回之前執(zhí)行。類似的,指定script類型的話,也會先執(zhí)行服務器端生成JavaScript,然后再把腳本作為一個文本數(shù)據(jù)返回。
如果指定為json類型,則會把獲取到的數(shù)據(jù)作為一個JavaScript對象來解析,并且把構建好的對象作為結果返回。為了實現(xiàn)這個目的,他首先嘗試使用jQuery.parseJSON()。如果瀏覽器不支持,則使用一個Function來構建。JSON數(shù)據(jù)是一種能很方便通過JavaScript解析的結構化數(shù)據(jù)。如果獲取的數(shù)據(jù)文件存放在遠程服務器上(域名不同,也就是跨域獲取數(shù)據(jù)),則需要使用jsonp類型。使用這種類型的話,會創(chuàng)建一個查詢字符串參數(shù) callback=? ,這個參數(shù)會加在請求的URL后面。服務器端應當在JSON數(shù)據(jù)前加上回調函數(shù)名,以便完成一個有效的JSONP請求。如果要指定回調函數(shù)的參數(shù)名來取代默認的callback,可以通過設置$.ajax()的jsonp參數(shù)。
注意:JSONP是JSON格式的擴展。他要求一些服務器端的代碼來檢測并處理查詢字符串參數(shù)。更多信息可以參閱original post detailing its use.
如果指定了script或者jsonp類型,那么當從服務器接收到數(shù)據(jù)時,實際上是用了<script>標簽而不是XMLHttpRequest對象。這種情況下,$.ajax()不再返回一個XMLHttpRequest對象,并且也不會傳遞事件處理函數(shù),比如beforeSend。
發(fā)送數(shù)據(jù)到服務器
默認情況下,Ajax請求使用GET方法。如果要使用POST方法,可以設定type參數(shù)值。這個選項也會影響data選項中的內容如何發(fā)送到服務器。
data選項既可以包含一個查詢字符串,比如 key1=value1&key2=value2 ,也可以是一個映射,比如 {key1: 'value1', key2: 'value2'} 。如果使用了后者的形式,則數(shù)據(jù)再發(fā)送器會被轉換成查詢字符串。這個處理過程也可以通過設置processData選項為false來回避。如果我們希望發(fā)送一個XML對象給服務器時,這種處理可能并不合適。并且在這種情況下,我們也應當改變contentType選項的值,用其他合適的MIME類型來取代默認的 application/x-www-form-urlencoded 。
高級選項
global選項用于阻止響應注冊的回調函數(shù),比如.ajaxSend,或者ajaxError,以及類似的方法。這在有些時候很有用,比如發(fā)送的請求非常頻繁且簡短的時候,就可以在ajaxSend里禁用這個。更多關于這些方法的詳細信息,請參閱下面的內容。
如果服務器需要HTTP認證,可以使用用戶名和密碼可以通過username和password選項來設置。
Ajax請求是限時的,所以錯誤警告被捕獲并處理后,可以用來提升用戶體驗。請求超時這個參數(shù)通常就保留其默認值,要不就通過jQuery.ajaxSetup來全局設定,很少為特定的請求重新設置timeout選項。
默認情況下,請求總會被發(fā)出去,但瀏覽器有可能從他的緩存中調取數(shù)據(jù)。要禁止使用緩存的結果,可以設置cache參數(shù)為false。如果希望判斷數(shù)據(jù)自從上次請求后沒有更改過就報告出錯的話,可以設置ifModified為true。
scriptCharset允許給<script>標簽的請求設定一個特定的字符集,用于script或者jsonp類似的數(shù)據(jù)。當腳本和頁面字符集不同時,這特別好用。
Ajax的第一個字母是asynchronous的開頭字母,這意味著所有的操作都是并行的,完成的順序沒有前后關系。$.ajax()的async參數(shù)總是設置成true,這標志著在請求開始后,其他代碼依然能夠執(zhí)行。強烈不建議把這個選項設置成false,這意味著所有的請求都不再是異步的了,這也會導致瀏覽器被鎖死。
$.ajax函數(shù)返回他創(chuàng)建的XMLHttpRequest對象。通常jQuery只在內部處理并創(chuàng)建這個對象,但用戶也可以通過xhr選項來傳遞一個自己創(chuàng)建的xhr對象。返回的對象通常已經被丟棄了,但依然提供一個底層接口來觀察和操控請求。比如說,調用對象上的.abort()可以在請求完成前掛起請求。
擴展的Ajax
在jQuery 1.5,,jQuery的Ajax實現(xiàn)包括預過濾器,轉換器和傳輸,讓您擴展了很大的靈活性Ajax。如需有關這些先進功能的信息,請參閱Extending Ajax
其他注意事項:
- 由于瀏覽器的安全限制,大多數(shù)“Ajax”的要求,均采用同一起源的政策 ;該請求不能成功地檢索來自不同的域,子域或協(xié)議的數(shù)據(jù)。
- Script和JSONP形式請求不受同源策略的限制。
Examples:
Example: 加載并執(zhí)行一個 JS 文件。
$.ajax({
type: "GET",
url: "test.js",
dataType: "script"
});
Example: 保存數(shù)據(jù)到服務器,成功時顯示信息。
$.ajax({
type: "POST",
url: "some.php",
data: "name=John&location=Boston",
success: function(msg){
alert( "Data Saved: " + msg );
}
});
Example: 裝入一個 HTML 網頁最新版本。
$.ajax({
url: "test.html",
cache: false,
success: function(html){
$("#results").append(html);
}
});
Example: 同步加載數(shù)據(jù)。發(fā)送請求時鎖住瀏覽器。需要鎖定用戶交互操作時使用同步方式。
var html = $.ajax({
url: "some.php",
async: false
}).responseText;
Example: 發(fā)送 XML 數(shù)據(jù)至服務器。設置 processData 選項為 false,防止自動轉換數(shù)據(jù)格式。
var xmlDocument = [create xml document];
$.ajax({
url: "page.php",
processData: false,
data: xmlDocument,
success: handleResponse
});
Example: 作為發(fā)送數(shù)據(jù)到服務器的ID,保存一些數(shù)據(jù)到服務器,并通知用戶一旦它的完成。請注意,此用法 - 返回到一個變量的調用的結果 - 需要同步(阻塞)的要求! (異步:假)
bodyContent = $.ajax({
url: "script.php",
global: false,
type: "POST",
data: ({id : this.getAttribute('id')}),
dataType: "html",
async:false,
success: function(msg){
alert(msg);
}
}
).responseText;