第21章 Ajax與Comet

改變傳統(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末继谚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子阵幸,更是在濱河造成了極大的恐慌花履,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挚赊,死亡現(xiàn)場離奇詭異诡壁,居然都是意外死亡,警方通過查閱死者的電腦和手機荠割,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門妹卿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蔑鹦,你說我怎么就攤上這事夺克。” “怎么了嚎朽?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵铺纽,是天一觀的道長。 經(jīng)常有香客問我哟忍,道長狡门,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任魁索,我火速辦了婚禮融撞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘粗蔚。我一直安慰自己尝偎,他們只是感情好,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著致扯,像睡著了一般肤寝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抖僵,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天鲤看,我揣著相機與錄音,去河邊找鬼耍群。 笑死义桂,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蹈垢。 我是一名探鬼主播慷吊,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼曹抬!你這毒婦竟也來了溉瓶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤谤民,失蹤者是張志新(化名)和其女友劉穎堰酿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體张足,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡触创,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了兢榨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗅榕。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吵聪,靈堂內(nèi)的尸體忽然破棺而出凌那,到底是詐尸還是另有隱情,我是刑警寧澤吟逝,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布帽蝶,位于F島的核電站,受9級特大地震影響块攒,放射性物質(zhì)發(fā)生泄漏励稳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一囱井、第九天 我趴在偏房一處隱蔽的房頂上張望驹尼。 院中可真熱鬧,春花似錦庞呕、人聲如沸新翎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽地啰。三九已至愁拭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間亏吝,已是汗流浹背岭埠。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蔚鸥,地道東北人惜论。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像株茶,于是被迫代替她去往敵國和親来涨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容