改變傳統(tǒng)的“單擊闭翩、等待”模式
Ajax技術(shù)的核心是XMLHttpRequest對象(XHR)
一挣郭、XMLHttpRequest對象
IE5中,通過MSXML庫中的ActiveXObject對象來實現(xiàn)
IE7+疗韵、Chrome兑障、Firefox、Opera蕉汪、Safari都支持原生的XMLHttpRequest對象
XHR對象的方法:
1)open(參數(shù)1流译,參數(shù)2,參數(shù)3)---->啟動請求預(yù)備發(fā)送
參數(shù)1:請求的方法(get或post等)
參數(shù)2:URL(相對于執(zhí)行代碼的當前界面)不可跨域請求
參數(shù)3:true(異步,js代碼繼續(xù)執(zhí)行而無需等待響應(yīng))false(同步肤无,js代碼會等到服務(wù)器響應(yīng)之后再執(zhí)行)
2)send(參數(shù))---->請求分派到服務(wù)器
參數(shù):請求主體發(fā)送的數(shù)據(jù)先蒋,沒有的話為null
3)abort()---->接收到響應(yīng)之前調(diào)用此方法,可以取消異步請求
收到響應(yīng)后宛渐,自動填充的XHR屬性:
status:響應(yīng)的http狀態(tài)竞漾,確定響應(yīng)是否成功返回
statusText:響應(yīng)狀態(tài)碼的說明
responseText:響應(yīng)主體返回的內(nèi)容
responseXML:返回內(nèi)容是XML格式時,是XML DOM文檔窥翩,否則為null
readyState:異步時使用业岁,有以下幾種值::
0:未初始化,未調(diào)用open方法
1:已經(jīng)初始化寇蚊,啟動了open笔时,未使用send
2:啟動了send,未收到響應(yīng)
3:已經(jīng)接收部分數(shù)據(jù)
4:已經(jīng)接收全部數(shù)據(jù)仗岸,并可以在客戶端使用
注意:這個屬性的變化會引發(fā)readystatechange事件允耿,一般在調(diào)用open之前對這個事件做好處理借笙。
下面總結(jié)一下status的幾種常見的值:
200 返回成功
304 跟瀏覽器說我這里的資源沒有被修改!较锡!你自己的緩存里已經(jīng)有啦业稼,不要來煩我啦
XHR對象操作請求頭和響應(yīng)頭:
setRequestHeader(參數(shù)1,參數(shù)2)---->設(shè)置自定義的請求頭信息
參數(shù)1:頭部字段的名稱
參數(shù)2:頭部字段的值
注意:open之后蚂蕴、send之前調(diào)用
getResponseHeader(字段名)---->
getAllResponseHeaders()---->返回全部頭部信息
get請求和post請求:
get請求:可以將字符串參數(shù)追加到URL尾部低散,請求速度更快
post請求:把數(shù)據(jù)作為請求的主體提交,可以包含非常多的數(shù)據(jù)骡楼,而且格式不限熔号,耗費資源更多;
可以模擬表單數(shù)據(jù)提交鸟整,來提交post的數(shù)據(jù)引镊,設(shè)置請求頭信息:
Content-Type:application/x-www-form-urlencoded
二、XHR對象的發(fā)展:XHR2.0
新定義了FormData類型(不必設(shè)置請求頭信息)
IE8開始提出的吃嘿,timeout屬性祠乃,超過了timeout屬性值以后,觸發(fā)timeout事件
Firefox最早提出的overrideMimeType()兑燥,在send之前重新設(shè)定響應(yīng)內(nèi)容的類型
三亮瓷、進度事件
1)loadstart:接收到第一個字節(jié)觸發(fā)
2)process:持續(xù)觸發(fā)
利用這個屬性可以定制一個進度條
觸發(fā)onprocess事件的XHR對象有三個屬性(進度信息是否可用、已接收字節(jié)數(shù)降瞳、預(yù)期接收字節(jié)數(shù))
3)error:錯誤時觸發(fā)
4)abort:調(diào)用abort()觸發(fā)
5)load:接收到完整數(shù)據(jù)時觸發(fā)嘱支,用于簡化readystatechange事件
6)loadend:通信完成或者觸發(fā)了error、abort挣饥、load時觸發(fā)
四除师、跨域
XHR的限制:跨域安全策略
跨域:協(xié)議、域名扔枫、端口 任一不同
跨域危險:CSRF跨站點請求偽造(未經(jīng)授權(quán)系統(tǒng)有權(quán)訪問某資源) XSS跨站點腳本
官方解決方案:CORS跨域資源共享
思想:使用自定義的頭信息汛聚,讓瀏覽器和服務(wù)器進行溝通,協(xié)商是否允許請求或者響應(yīng)短荐,如果服務(wù)器返回的響應(yīng)頭信息和瀏覽器發(fā)送的請求頭信息相同URL倚舀,則表示允許!
注意:請求和響應(yīng)中都不包含cookie信息
IE對CORS的實現(xiàn):引入了XDR(只能異步)
同樣忍宋,請求和響應(yīng)中都不包含cookie信息
只支持get和post方法
不能讀取響應(yīng)頭信息
只能設(shè)置請求頭中的Content-Type字段痕貌,設(shè)置發(fā)送數(shù)據(jù)的格式
只能訪問響應(yīng)的原始文本,不能得到響應(yīng)的狀態(tài)代碼
其他瀏覽器對CORS的實現(xiàn):
跨域XHR對象
支持同步
可以訪問響應(yīng)的狀態(tài)代碼
使用絕對路徑糠排,加以區(qū)分
不能發(fā)送和接收cookie
不能設(shè)置自定義頭信息
調(diào)用getAllResponseHeaders()返回空字符串
Preflight Request:第一次發(fā)送請求時會多一次http請求
帶憑據(jù)(cookie等信息)的請求:
其他跨域技術(shù):CORS出現(xiàn)之前
1)圖像ping舵稠,動態(tài)創(chuàng)建圖像,利用img.src
特點:只能get方法、不能訪問響應(yīng)文本哺徊,單向通信
2)JSONP:回調(diào)函數(shù)(響應(yīng)到來時在頁面中調(diào)用的函數(shù))+數(shù)據(jù)(傳入回調(diào)函數(shù)的json數(shù)據(jù))
利用動態(tài)script的src(有能力不受限制從其他域加載資源)
特點:雙向通信室琢,可以訪問響應(yīng)文本
但是無法確定跨域是否安全
無法確定是否請求成功,網(wǎng)速和帶寬會影響判斷唉工,script的onerror事件暫時沒有得到瀏覽器的支持
五研乒、Comet
Ajax:從頁面向服務(wù)器請求數(shù)據(jù)
Comet:服務(wù)器向頁面推送數(shù)據(jù)(更實時)
實現(xiàn)Comet的兩種方式:
1)長輪詢
短輪詢:瀏覽器定時向服務(wù)器發(fā)送請求
長輪詢:瀏覽器發(fā)送一個請求以后,服務(wù)器一直打開淋硝,直到發(fā)送完數(shù)據(jù)
2)HTTP流
只存在一個HTTP連接
瀏覽器發(fā)送請求后,服務(wù)器一直打開宽菜,周期性發(fā)送數(shù)據(jù)
六谣膳、Web Socket
在一個單獨的持久連接上,全雙工铅乡、雙向通信
必須使用支持Web Socket協(xié)議(快速傳輸小數(shù)據(jù))的服務(wù)器才可以正常工作
可以跨域 必須傳入絕對URL