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