Ajax筆記

一缴罗,1個HTTP請求一般由四部分組成:

1.HTTP請求的方法或動作疲陕,比如是GET還是POST
2.正在請求的URL孵睬,總得知道請求的地址是什么吧
3.請求頭,包含一些客戶端環(huán)境信息晒旅,身份驗證信息等
4.請求體顾瞪,也就是請求正文,請求正文中可以包含客戶提交的查詢字符串信息猪狈,    表單信息等

(1)GET請求:一般用于信息獲取
a.使用URL傳遞參數(shù)
b.對所發(fā)送信息的數(shù)量也是有限制的箱沦,一般在2000個字符

(2)POST請求:一般用于修改服務(wù)器上的資源
a.對所發(fā)送信息的數(shù)量無限制
一個HTTP響應(yīng)一般由三部分組成:
(1)一個數(shù)字和文字組成的狀態(tài)碼,用來顯示請求是成功還是失敗
(2)響應(yīng)頭雇庙,響應(yīng)頭也和請求頭一樣包含許多有用的信息谓形,例如服務(wù)器類型、日期時間疆前、內(nèi)容類型和長度等
(3)響應(yīng)體寒跳,也就是響應(yīng)正文

二、XMLHttpRequest對象

1.首先竹椒,新建一個XMLHttpRequest的實例 :

   var xhr = new XMLHttpRequest();

2.然后童太,向遠(yuǎn)處主機(jī)發(fā)出一個HTTP請求:

    xhr.open('GET','example.php');
    xhr.send();

3.接著,等待遠(yuǎn)程主機(jī)做出回應(yīng)胸完。這時需要監(jiān)控XMLHttpRequest對象的狀態(tài)變化书释,指定回調(diào)函數(shù):

xhr.onreadystatechange = function(){
    if(xhr.readyState == 4 && xhr.status == 200){
        alert(xhr.responseText);
    }else{
        alert(xhr.statusText);
    }
}

上面的代碼包含了老版本XMLHttpRequest對象的主要屬性;
xhr.readyState:XMLHttpRequest對象的狀態(tài)
0:請求未初始化,open還沒調(diào)用
1:服務(wù)器連接已建立舶吗,open已經(jīng)調(diào)用了
2:請求已接收征冷,也就是接收到頭信息了
3:請求處理中,也就是接收到響應(yīng)主體了
4:請求已完成誓琼,且響應(yīng)已就緒检激,也就是響應(yīng)完成了

xhr.status:服務(wù)器返回的狀態(tài)碼肴捉,等于200表示一切正常
responseText:獲得字符串形式的數(shù)據(jù)
responseXML:獲得XML形式的響應(yīng)數(shù)據(jù)
status和statusText:以數(shù)字和文本形式返回HTTP狀態(tài)碼:

1信息類 表示收到web瀏覽器請求,正在進(jìn)一步的處理中
2成功
3重定向
4客戶端錯誤
5服務(wù)器錯誤

getAllResponseHeader():獲取所有的響應(yīng)報頭
老版本的XMLHttpRequest對象的幾個缺點:
1.只支持文本數(shù)據(jù)的傳送叔收,無法用來讀取和上傳二進(jìn)制文件
2.傳送和接收數(shù)據(jù)時齿穗,沒有進(jìn)度信息,只能提示有沒有完成
3.受到“同域限制”饺律,只能向同一域名的服務(wù)器請求數(shù)據(jù)
新版本的功能

  • 可以設(shè)置HTTP請求的時限
  • 可以使用FormData對象管理表單數(shù)據(jù)
  • 可以上傳文件
  • 可以請求不同域名下的數(shù)據(jù)
  • 可以獲取服務(wù)器端的二進(jìn)制數(shù)據(jù)
  • 可以獲得數(shù)據(jù)傳輸?shù)倪M(jìn)度信息

HTTP請求時限:

    xhr.timeout = 3000;

上面語句將等待時間設(shè)為3000毫秒窃页。過了這個時限,就自動停止HTTP請求复濒。
與之配套的還有一個timeout事件脖卖,用來指定回調(diào)函數(shù)

    xhr.timeout = function(event){
        alert('請求超時!');
    }

目前巧颈,Opera畦木、Firefox和IE 10支持該屬性,IE 8和IE 9的這個屬性屬于XDomainRequest對象砸泛,而Chrome和Safari還不支持十籍。

三、FormData對象

ajax操作往往用來傳遞表單數(shù)據(jù)唇礁。為了方便表單處理勾栗,HTML 5新增了一個FormData對象,可以模擬表單盏筐。
首先围俘,新建一個FormData對象。

  var formData = new FormData();

然后机断,為它添加表單項楷拳。

  formData.append('username', '張三');
  formData.append('id', 123456);

最后,直接傳送這個FormData對象吏奸。這與提交網(wǎng)頁表單的效果欢揖,完全一樣。

xhr.send(formData);

FormData對象也可以用來獲取網(wǎng)頁表單的值:

var form = document.getElementById('myform');
var formData = new FormData(form);
formData.append('secret', '123456'); // 添加一個表單項
xhr.open('POST', form.action);
xhr.send(formData);

四奋蔚、上傳文件

新版XMLHttpRequest對象她混,不僅可以發(fā)送文本信息,還可以上傳文件泊碑。
假定files是一個"選擇文件"的表單元素(input[type="file"])坤按,我們將它裝入FormData對象。

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

然后馒过,發(fā)送這個FormData對象臭脓。

  xhr.send(formData);

五、跨域資源共享(CORS)

新版本的XMLHttpRequest對象腹忽,可以向不同域名的服務(wù)器發(fā)出HTTP請求来累。這叫做"跨域資源共享"(Cross-origin resource sharing砚作,簡稱CORS)。
使用"跨域資源共享"的前提嘹锁,是瀏覽器必須支持這個功能葫录,而且服務(wù)器端必須同意這種"跨域"。如果能夠滿足上面的條件领猾,則代碼的寫法與不跨域的請求完全一樣米同。

  xhr.open('GET', 'http://other.server/and/path/to/script');

目前,除了IE 8和IE 9摔竿,主流瀏覽器都支持CORS面粮,IE 10也將支持這個功能。服務(wù)器端的設(shè)置继低,請參考《Server-Side Access Control》但金。

八、接收二進(jìn)制數(shù)據(jù)(方法A:改寫MIMEType)

老版本的XMLHttpRequest對象郁季,只能從服務(wù)器取回文本數(shù)據(jù)(否則它的名字就不用XML起首了),新版則可以取回二進(jìn)制數(shù)據(jù)钱磅。
這里又分成兩種做法梦裂。較老的做法是改寫數(shù)據(jù)的MIMEType,將服務(wù)器返回的二進(jìn)制數(shù)據(jù)偽裝成文本數(shù)據(jù)盖淡,并且告訴瀏覽器這是用戶自定義的字符集年柠。

  xhr.overrideMimeType("text/plain; charset=x-user-defined");

然后,用responseText屬性接收服務(wù)器返回的二進(jìn)制數(shù)據(jù)褪迟。

  var binStr = xhr.responseText;

由于這時冗恨,瀏覽器把它當(dāng)做文本數(shù)據(jù),所以還必須再一個個字節(jié)地還原成二進(jìn)制數(shù)據(jù)味赃。

  for (var i = 0, len = binStr.length; i < len; ++i) {
    var c = binStr.charCodeAt(i);
    var byte = c & 0xff;
  }

最后一行的位運(yùn)算"c & 0xff"掀抹,表示在每個字符的兩個字節(jié)之中,只保留后一個字節(jié)心俗,將前一個字節(jié)扔掉傲武。原因是瀏覽器解讀字符的時候,會把字符自動解讀成Unicode的0xF700-0xF7ff區(qū)段城榛。

六揪利、接收二進(jìn)制數(shù)據(jù)(方法B:responseType屬性)

從服務(wù)器取回二進(jìn)制數(shù)據(jù),較新的方法是使用新增的responseType屬性狠持。如果服務(wù)器返回文本數(shù)據(jù)疟位,這個屬性的值是"TEXT",這是默認(rèn)值喘垂。較新的瀏覽器還支持其他值甜刻,也就是說绍撞,可以接收其他格式的數(shù)據(jù)。
你可以把responseType設(shè)為blob罢吃,表示服務(wù)器傳回的是二進(jìn)制對象楚午。

  var xhr = new XMLHttpRequest();
  xhr.open('GET', '/path/to/image.png');
  xhr.responseType = 'blob';

接收數(shù)據(jù)的時候,用瀏覽器自帶的Blob對象即可尿招。

  var blob = new Blob([xhr.response], {type: 'image/png'});

注意矾柜,是讀取xhr.response,而不是xhr.responseText就谜。
你還可以將responseType設(shè)為arraybuffer怪蔑,把二進(jìn)制數(shù)據(jù)裝在一個數(shù)組里。

  var xhr = new XMLHttpRequest();
  xhr.open('GET', '/path/to/image.png');
  xhr.responseType = "arraybuffer";

接收數(shù)據(jù)的時候丧荐,需要遍歷這個數(shù)組缆瓣。

  var arrayBuffer = xhr.response;
  if (arrayBuffer) {
    var byteArray = new Uint8Array(arrayBuffer);
    for (var i = 0; i < byteArray.byteLength; i++) {
      // do something
    }
  }

更詳細(xì)的討論,請看Sending and Receiving Binary Data虹统。

七弓坞、進(jìn)度信息

新版本的XMLHttpRequest對象,傳送數(shù)據(jù)的時候车荔,有一個progress事件渡冻,用來返回進(jìn)度信息。
它分成上傳和下載兩種情況忧便。下載的progress事件屬于XMLHttpRequest對象族吻,上傳的progress事件屬于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;
    }
  }

上面的代碼中巍举,event.total是需要傳輸?shù)目傋止?jié),event.loaded是已經(jīng)傳輸?shù)淖止?jié)凝垛。如果event.lengthComputable不為真禀综,則event.total等于0。
與progress事件相關(guān)的苔严,還有其他五個事件定枷,可以分別指定回調(diào)函數(shù):
  
load事件:傳輸成功完成。
  abort事件:傳輸被用戶取消届氢。
  error事件:傳輸中出現(xiàn)錯誤欠窒。
  loadstart事件:傳輸開始。
  loadEnd事件:傳輸結(jié)束,但是不知道成功還是失敗岖妄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末型将,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子荐虐,更是在濱河造成了極大的恐慌七兜,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件福扬,死亡現(xiàn)場離奇詭異腕铸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)铛碑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門狠裹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人汽烦,你說我怎么就攤上這事涛菠。” “怎么了撇吞?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵俗冻,是天一觀的道長。 經(jīng)常有香客問我牍颈,道長言疗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任颂砸,我火速辦了婚禮,結(jié)果婚禮上死姚,老公的妹妹穿的比我還像新娘人乓。我一直安慰自己,他們只是感情好都毒,可當(dāng)我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布色罚。 她就那樣靜靜地躺著,像睡著了一般账劲。 火紅的嫁衣襯著肌膚如雪戳护。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天瀑焦,我揣著相機(jī)與錄音腌且,去河邊找鬼。 笑死榛瓮,一個胖子當(dāng)著我的面吹牛铺董,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播禀晓,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼精续,長吁一口氣:“原來是場噩夢啊……” “哼坝锰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起重付,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤顷级,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后确垫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弓颈,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年森爽,在試婚紗的時候發(fā)現(xiàn)自己被綠了恨豁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡爬迟,死狀恐怖橘蜜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情付呕,我是刑警寧澤计福,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站徽职,受9級特大地震影響象颖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姆钉,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一说订、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧潮瓶,春花似錦陶冷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至思恐,卻和暖如春沾谜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胀莹。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工基跑, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人描焰。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓涩僻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子逆日,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,665評論 2 354

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

  • 本文詳細(xì)介紹了 XMLHttpRequest 相關(guān)知識嵌巷,涉及內(nèi)容: AJAX、XMLHTTP室抽、XMLHttpReq...
    semlinker閱讀 13,657評論 2 18
  • 這種人我還帶他出去玩么搪哪?有一次我和我朋友去動物園,就先去了老校區(qū)轉(zhuǎn)轉(zhuǎn)坪圾,結(jié)果就轉(zhuǎn)到了藝術(shù)設(shè)計學(xué)院晓折。去了人家的實驗室,...
    鍵盤瞎閱讀 1,312評論 10 43
  • AJAX簡單介紹 AJAX = Asynchronous JavaScript and XML(異步的 JavaS...
    晴天_jy閱讀 352評論 0 2
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,965評論 6 13
  • 可還記得那些舊時光 垂緌飲清露兽泄,流響出疏桐漓概。 居高聲自遠(yuǎn),非是藉秋風(fēng)病梢。 每一個悄然而至的夏天胃珍,都因蟬鳴而變得鮮活有...
    喵愛眨眼睛閱讀 1,265評論 0 2