參考:ajax總結(jié)
原生Ajax
level 1
XMLHTTPRequest 屬性,方法和事件
-
XMLHTTPRequest考慮兼容 xhr.open(method, url, async, username, password)xhr.setRequestHeader(name, value)-
xhr.onreadystatechange事件、 xhr.send(null/string)-
xhr.readyState屬性,0 - 4 , 五個值,每改變一次都觸發(fā)xhr.onreadystatechange事件 -
xhr.statusHTTP 狀態(tài)碼 -
xhr.statusText狀態(tài)碼對應(yīng)文本 xhr.responseTextxhr.responseXMLxhr.getRequestHeader(name)xhr.getResponseHeader(name)- ·xhr.getAllResponseHeaders()·
- 注意點
-
xhr.setRequestHeader(name, value)必須在opend()之后,send()之前 -
xhr.onreadystatechange事件必須在send()之前
- 補充點
-
form元素的enctype屬性- 默認,
aplication/x-www-form-urlencoded -
post方式專用,multiple/form-data -
text/plain不編譯
- 默認,
// 基本格式
var xhr = new XMLHTTPRequest()
xhr.open(method, url)
xhr.setRequestHeader(name,value)
xhr.onreadystatechange = function () {
}
xhr.send(null)
level 2
XMLHTTPRequest 新增屬性,方法和事件
-
xhr.timeout屬性 -
xhr.ontimeout事件 -
xhr.responseType屬性,可以有以下值
- text
- document
- ArrayBuffer
- Blob
-
xhr.response屬性,可以有以下類型
- ArrayBuffer
- Blob
-
progress事件
- 下載,
xhr.onprogress - 上傳,
xhr.upload.onprogress xhr.onloadstartxhr.abortxhr.error-
xhr.load上傳成功 -
xhr.loadend上傳完成
// progress 基本用法,在傳輸過程中不斷觸發(fā)
xhr.onpregress = function (event) {
var percentCompleted = 0;
if (event.lengthComputable) {
percentCompleted = event.load / event.total;
}
}
接受二進制案例
- 知識點
ArrayBufferTypedArrayBlobURL/FileReader
- 上面已經(jīng)列出
ResponseType可能值
jQuery 中 Ajax
必備知識點
-
jqXHR。 是xhr的超集 -
$.ajax()。 內(nèi)部兩個重要的對象
-
jqXHR對象 -
s對象,由$.ajaxSetup({})設(shè)置,$.ajaxSetting對象,options對象
-
$.ajax()。返回jqXHR
options 參數(shù)設(shè)置
url-
username,password async-
global。 是否觸發(fā)全局Ajax事件 -
type。 請求類型 -
headers。 請求頭 -
content-type。 請求頭中的一個 -
cache。 是否在地址后添加“key = random” -
ifModified。 請求頭中的一個,配合上一個使用 -
data。 請求數(shù)據(jù) -
processData。 請求數(shù)據(jù)是否處理為查詢字符串形式,默認為true,改變 tranditionaltimeout-
context。 在局部回掉函數(shù)中,this是包含options的s對象,在全局回掉函數(shù)中,this是綁定的元素 -
dataType。 相應(yīng)數(shù)據(jù)類型
xmltextjsonjsonpscript
-
jsonp。 修改callback名稱 -
jsonpCallback。 指定回掉函數(shù) -
scriptCharset。 制定jsonp和script生成script標(biāo)簽的charset -
statusCode。HTTP狀態(tài)碼和回掉函數(shù)的映射
事件參數(shù),觸發(fā)時間,參考 ajax總結(jié)
局部事件
beforeSend-
dataFilter。成功后觸發(fā),304時不觸發(fā) successerrorcomplete
全局事件
-
ajaxStart。全局中沒有在進行的ajax時,發(fā)送ajax請求觸發(fā) ajaxSendajaxSuccessajaxError-
ajaxComplete。每個ajax請求完成時,觸發(fā) -
ajaxStop。全局中所有ajax請求完成時,觸發(fā)
成功的Ajax請求事件流

Ajax成功事件流.png
失敗的Ajax請求事件流

Ajax失敗事件流.png
全局事件典型用例
每當(dāng)
ajax請求開始前顯示一個提示框,ajax請求成功時顯示一個提示框,ajax請求結(jié)束時隱藏提示框,,使用ajax全局事件
其他相關(guān)方法
-
$.ajaxSetup({}),$.ajax()方法中所有的選項都可以通過$.ajaxSetup()設(shè)置 $.get()$.getScript()$.post()$.getJSON()$.getScript()$.load()- 常用的,關(guān)于表單的方法
-
$(form).serilize(),得到查詢字符串的樣式 $(form).serilizeArray()
緩存
-
$.ajax()設(shè)置cache為false,那么會在請求中添加請求參數(shù),使得地址不同,無法緩存 -
$.ajax()設(shè)置cache為true,同時設(shè)置ifModified為true,才能進行緩存。實際過程
- 第一次發(fā)送,服務(wù)器將
Last-Modified,ETag和響應(yīng)數(shù)據(jù)一起返回 - 第二次放松,客戶端將
Last-Modified,ETag存儲在If-Modified-Since和If-None-Match,然后和請求數(shù)據(jù)發(fā)送 - 服務(wù)端比較后
- 沒有改變,發(fā)送 304
- 改變,發(fā)送改變后的數(shù)據(jù)
跨域
-
$.ajax()中,使用jsonp和sciript實現(xiàn)跨域,必須使用get方法 - 異同
- 同:內(nèi)部使用
script標(biāo)簽實現(xiàn),不會觸發(fā)全局和局部事件,默認不開啟緩存 - 異:使用
script是加載js文件