Ajax快速入門

一、概述

Ajax是Asynchronous JavaScript and XML的縮寫绊谭。Asynchronous癣籽,是任務(wù)的一種執(zhí)行模式方灾,程序的執(zhí)行順序與任務(wù)的排列順序是不一致的、異步的讼渊。JavaScript动看,是程序的核心,用來進(jìn)行交互以及通信的控制與實(shí)現(xiàn)爪幻。XML菱皆,是進(jìn)行交互以及通信的數(shù)據(jù)格式,目前通常采用JSON的格式挨稿。

傳統(tǒng)web應(yīng)用搔预,每次用戶的交互都需要向服務(wù)器發(fā)送請求,服務(wù)器接收并處理請求之后叶组,返回新的頁面給客戶端瀏覽器拯田,在此期間用戶必須等待頁面重新繪制完成。

使用Ajax甩十,用戶的交互交給JavaScript來處理而不是直接發(fā)送給服務(wù)器船庇,此時(shí)頁面不進(jìn)行刷新,在此期間用戶可以繼續(xù)進(jìn)行頁面交互侣监。當(dāng)服務(wù)器將數(shù)據(jù)返回給JavaScript時(shí)鸭轮,可以局部更新頁面,從而用戶在頁面沒有提交或刷新就得到新的數(shù)據(jù)橄霉。

通過這種異步模式窃爷,使web應(yīng)用程序像桌面應(yīng)用程序一樣,能夠及時(shí)響應(yīng)用戶與服務(wù)器之間的交互,不必進(jìn)行頁面刷新或跳轉(zhuǎn)按厘,縮短等待時(shí)間医吊,減輕服務(wù)器的負(fù)載。

二逮京、原理

1卿堂、XMLHttpRequest對象

XMLHttpRequest對象是Ajax技術(shù)的核心,在IE 5中首次引入懒棉,是一種支持異步請求的技術(shù)草描。通過該對象,可以使用JavaScript向服務(wù)器提出請求并處理響應(yīng)策严,而不阻塞用戶的其他操作穗慕。

使用XMLHttpRequest對象向服務(wù)器發(fā)送請求和處理響應(yīng)之前,必須先創(chuàng)建一個(gè)XMLHttpRequest對象妻导。在不同的瀏覽器中逛绵,創(chuàng)建XMLHttpRequest對象的創(chuàng)建方式也不相同,所以需要對瀏覽器進(jìn)行判斷栗竖。

var xhr = new XMLHttpRequest();

var xhr = new ActiveXObject("Microsoft.XMLHTTP");

后者支持IE 5和IE 6暑脆。

2、發(fā)送請求

從表單獲取數(shù)據(jù):

var city = document.getElementById("city").value;

建立要連接的URL:

var url = "/pages/getCity.html?city=" + escape(city)

打開服務(wù)器連接:

xhr.open("GET", url, true);

最后一個(gè)參數(shù)設(shè)為true狐肢,表示請求一個(gè)異步連接添吗;如果設(shè)為false,表示發(fā)送請求后將等待服務(wù)器返回的響應(yīng)份名。

設(shè)置連接之后服務(wù)器要進(jìn)行的處理:

xhr.onreadystatechange = updatePage;

屬性onreadystatechange告訴服務(wù)器處理完請求之后碟联,執(zhí)行哪些操作。

發(fā)送請求:

xhr.send();

3僵腺、處理響應(yīng)

判斷響應(yīng)是否處于就緒狀態(tài):

if (xhr.readyState === 4 && xhr.status === 200)

獲得服務(wù)器的響應(yīng):

var response = xhr.responseText;

設(shè)置表單數(shù)據(jù):

document.getElementById("zipCode").value = response;

三鲤孵、改進(jìn)的XMLHttpRequest

老版本的XMLHttpRequest對象存在很多缺點(diǎn):

  • 只支持文本數(shù)據(jù)的傳送,無法讀取和上傳二進(jìn)制文件
  • 傳送數(shù)據(jù)時(shí)辰如,只能提示是否完成普监,沒有進(jìn)度信息
  • 不支持跨域

新版本針對老版本的缺點(diǎn),做出很大改進(jìn):

  • 可以設(shè)置HTTP請求的時(shí)限
  • 可以使用FormData對象管理表單數(shù)據(jù)
  • 可以上傳文件
  • 可以獲取二進(jìn)制數(shù)據(jù)
  • 可以獲得數(shù)據(jù)傳輸?shù)倪M(jìn)度信息
  • 支持跨域請求

1琉兜、HTTP請求時(shí)限

設(shè)置最長等待時(shí)間凯正,超過這個(gè)時(shí)限,會自動(dòng)停止HTTP請求:

xhr.timeout = 3000;

2豌蟋、FormData對象

為了方便表單處理廊散,新增FormData對象,可以模擬表單:

var formData = new FormData();
formData.append('username', 'sean');
formData.append('age', 20);
xhr.send(formData);

3梧疲、上傳文件

要上傳的文件是表單元素允睹,所以可以將它放到FormData對象中运准,實(shí)現(xiàn)文件上傳:

for (var i=0; i\<files.length; i++) {
  formData.append('files[]', files[i]);
}

4、獲取二進(jìn)制數(shù)據(jù)

利用新增的responseType屬性缭受,指定服務(wù)器返回的數(shù)據(jù)類型胁澳,默認(rèn)是text文本類型。如果設(shè)置為blob贯涎,表示服務(wù)器返回的是二進(jìn)制對象听哭。

xhr.responseType = 'blob';

還可以設(shè)置為arraybuffer慢洋,把二進(jìn)制數(shù)據(jù)放在一個(gè)數(shù)組里:

xhr.responseType = "arraybuffer";

5塘雳、獲取進(jìn)度信息

傳送數(shù)據(jù)時(shí),使用progress事件普筹,返回進(jìn)度信息败明。它分上傳和下載兩種情況:下載屬于XMLHttpRequest對象,上傳屬于XMLHttpRequest.upload對象太防。

定義progress事件的回調(diào)函數(shù):

xhr.onprogress = updateProgress;
xhr.upload.onprogress = updateProgress;

在回調(diào)函數(shù)中妻顶,處理事件:

function updateProgress(event) {
  if (event.lengthComputable) {
    var percentComplete = event.loaded / event.total;
  }
}

與progress事件相關(guān)的其他事件:

  • load事件,傳送成功完成
  • abort事件蜒车,傳送被用戶取消
  • error事件讳嘱,傳送中出現(xiàn)錯(cuò)誤
  • loadStart事件,傳送開始
  • loadEnd事件酿愧,傳送結(jié)束

6沥潭、跨域請求

向不同域名的服務(wù)器發(fā)送HTTP請求,叫做跨域資源共享嬉挡,簡稱CORS钝鸽。前提是瀏覽器必須支持該功能,并且服務(wù)器端必須同意進(jìn)行跨域庞钢。

xhr.open('GET', 'http://www.google.com/');

四拔恰、jQuery中的用法

1、load(url [, data] [, callback])

可以遠(yuǎn)程載入HTML基括,并插入到DOM中颜懊。常用來從服務(wù)器上獲取靜態(tài)的數(shù)據(jù)文件。load方法的傳遞方式根據(jù)參數(shù)data來自動(dòng)指定风皿。如果沒有參數(shù)河爹,則采用GET方式,否則會采用POST方式揪阶。

參數(shù)說明:

  • url昌抠,服務(wù)端資源的url
  • data,發(fā)送到服務(wù)器的key/value數(shù)據(jù)
  • callback鲁僚,請求完成時(shí)的回調(diào)函數(shù)

2炊苫、get(url [, data] [, callback] [, type])

使用GET方式進(jìn)行異步請求裁厅。服務(wù)器的狀態(tài)和應(yīng)用的模型數(shù)據(jù)不受GET操作的影響。

參數(shù)說明:

  • url侨艾,服務(wù)端資源的url
  • data执虹,以key/value的形式構(gòu)造查詢字符串添加到url
  • callback,在請求成功時(shí)被調(diào)用唠梨,將請求結(jié)果和狀態(tài)傳遞給該方法
  • type袋励,服務(wù)器端返回內(nèi)容的格式

3、post(url [, data] [, callback] [, type])

使用POST方式進(jìn)行異步請求当叭。發(fā)送到服務(wù)器的數(shù)據(jù)可以用來修改應(yīng)用的模型數(shù)據(jù)茬故。

get和post方式的區(qū)別:

  • GET請求會將參數(shù)放在url后進(jìn)行傳遞;POST請求會作為HTTP的消息體發(fā)送給服務(wù)器蚁鳖。
  • GET對傳輸?shù)臄?shù)據(jù)大小有限制磺芭,通常不大于2KB;POST方式傳遞的數(shù)據(jù)大小理論上不受限制醉箕。
  • GET方式請求的數(shù)據(jù)會被瀏覽器緩存钾腺,可能會帶來安全問題;POST方式不會被瀏覽器緩存讥裤。

4放棒、getScript

用來加載js文件,js文件會自動(dòng)執(zhí)行己英。

5间螟、getJSON

用來加載JSON文件。

6剧辐、ajax(options)

是jQuery最底層的實(shí)現(xiàn)寒亥。參數(shù)包含了所需要的請求設(shè)置以及回調(diào)函數(shù),以key/value形式存在荧关。

選項(xiàng):

  • url溉奕,發(fā)送請求地址
  • type,請求方式忍啤,默認(rèn)為GET
  • data加勤,發(fā)送到服務(wù)器的key/value數(shù)據(jù)
  • dataType,服務(wù)器返回的數(shù)據(jù)類型
  • complete同波,請求完成后的回調(diào)函數(shù)鳄梅。參數(shù)是XMLHttpRequest對象和一個(gè)描述成功請求類型的字符串
  • success,請求成功的回調(diào)函數(shù)未檩。參數(shù)是服務(wù)器返回的數(shù)據(jù)和描述狀態(tài)的字符串
  • error戴尸,請求失敗時(shí)調(diào)用的函數(shù)。參數(shù)是XMLHttpRequest對象冤狡、錯(cuò)誤信息和捕獲的錯(cuò)誤對象
  • contentType孙蒙,發(fā)送信息給服務(wù)器時(shí)的內(nèi)部編碼類型
  • jsonp项棠,在jsonp請求中替代callback的名稱

參考資料:

阮一峰:XMLHttpRequest Level 2 使用指南

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市挎峦,隨后出現(xiàn)的幾起案子香追,更是在濱河造成了極大的恐慌,老刑警劉巖坦胶,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件透典,死亡現(xiàn)場離奇詭異,居然都是意外死亡顿苇,警方通過查閱死者的電腦和手機(jī)峭咒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岖圈,“玉大人讹语,你說我怎么就攤上這事钙皮》淇疲” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵短条,是天一觀的道長导匣。 經(jīng)常有香客問我,道長茸时,這世上最難降的妖魔是什么贡定? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮可都,結(jié)果婚禮上缓待,老公的妹妹穿的比我還像新娘。我一直安慰自己渠牲,他們只是感情好旋炒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著签杈,像睡著了一般瘫镇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上答姥,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天铣除,我揣著相機(jī)與錄音,去河邊找鬼鹦付。 笑死尚粘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的敲长。 我是一名探鬼主播郎嫁,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼互捌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了行剂?” 一聲冷哼從身側(cè)響起秕噪,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎厚宰,沒想到半個(gè)月后腌巾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铲觉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年澈蝙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撵幽。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡灯荧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盐杂,到底是詐尸還是另有隱情逗载,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布链烈,位于F島的核電站厉斟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏强衡。R本人自食惡果不足惜擦秽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望漩勤。 院中可真熱鬧感挥,春花似錦、人聲如沸越败。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽眉尸。三九已至域蜗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間噪猾,已是汗流浹背霉祸。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留袱蜡,地道東北人丝蹭。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像坪蚁,于是被迫代替她去往敵國和親奔穿。 傳聞我的和親對象是個(gè)殘疾皇子镜沽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

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