首先應該請楚,咱們在使用瀏覽器瀏覽網頁時,實際上是瀏覽器幫咱們發起一個又一個請求,唰唰唰~想象一下,當輸入地址按下回車開始(其實在webkit的實現中,當咱們輸入地址時,瀏覽器已經在開始作地址匹配,DNS預查了..),一個GET請求便發起了,通過一系列的解析最終到達服務器(其中過程網上有不少版本,包括從鍵盤按下開始解釋,這個不是咱們如今的重點哈),服務器再返回咱們想要的資源。
那麼,前端如何使用本身的代碼發送請求,獲得本身想要的數據呢?除了使用style / script / img 這些標籤,它們能夠由瀏覽器解析併發出請求。若是咱們本身程序中須要數據,後端給咱們接口,咱們該如何獲取呢?javascript
DOM標準中定義了一個XMLHttpRequest類型的對象,提供前端開發中發出請求的接口。我在控制檯中打出來,一塊兒來看看:前端
var xhr=new XMLHttpRequest(); console.log(xhr);
abort getAllResponseHeaders getResponseHeader open overrideMimeType send setRequestHeaderjava
注:在MDN中咱們還能夠看到XMLHttpRequestEventTarget的介紹,當時看到順手翻譯了,當回頭想一想,以前真的不知道這個對象是在哪裏用的。它實際上是一個描述事件處理程序的接口,其中有onabort / onerror / onload / onloadstart / onprogress / ontimeout /onloadend 這些用來指定發生相關事件時執行的方法。在chrome中,從原型鏈往上追溯,咱們的確能夠看到XMLHttpRequest的原型的原型是一個XMLHttpRequestEventTarget對象。在firefox中,咱們依然能夠看到該對象中的這些屬性,但chrome中是沒有的,由於咱們也看到了,這些屬性現在都被定義在XMLHttpRequest對象中了。google了一下,大體看到的都是關於要取消這個對象的文章。先無論了,反正都是作的事件處理的事情,並且瀏覽中看到都在XMLHttpRequest對象中。web
屬性:chrome
0: open()方法還未被調用
1: send()方法還未被調用
2: send()方法已經被調用,響應頭和相應狀態已經返回
3: 響應體下載中,responseText中已經有了部分數據
4: 整個請求過程完畢json
'': 默認值,表示響應主體類型爲DOMString,關於DOMString類型,它就是一個utf-16的字符串,相似javascript使用的string類型,DOMString直接映射爲一個字符串
ArrayBuffer: 響應主體類型爲ArrayBuffer,ArrayBuffer用來表示一個定長的原始二進制buffer
Blob: 響應主體類型爲Blob,Blob類型用來表示定長原始二進制的類文件對象(file-like)
document: 相應主體類型爲Document, 即文檔對象
json: 響應主體類型爲json
text: 響應主體爲DOMString後端
從上圖看到,XMLHttpRequest構造方法的原型中,定義了幾個常量,這些常量就是上面說到的一些狀態碼,除此以外,它定義了XMLHttpRequest對象用到的方法,一塊兒看看:
方法:跨域
不建議使用文本類型的ArrayBuffer做爲參數,由於它已經不是XMLHttpRequest的一部分了。使用ArrayBufferView替代它。
若是數據是一個文檔對象,會在發出以前進行序列化。瀏覽器
說了這麼多概念性的東西,寫個請求試試:服務器
var xhr=new XMLHttpRequest();xhr.onreadystatechange=function(e){ console.log(e); if(xhr.readyState==4 && xhr.status==200){ console.log(xhr.responseText); }}xhr.open('get','./data.json');xhr.send();
先看看event中的東西:
每次readyState改變時,event對象清楚地記錄了當前事件的狀況,如不冒泡、沒有取消冒泡、事件不能被取消、當前的目標是XMLHttpRequest對象、沒有阻止默認事件、事件傳播的當前階段、是否返回值,發生時刻,事件名稱等等狀況。
我以前老是簡單認爲事件目標都是在某個DOM節點上,其實並非這樣,由於就像這個http請求,它就是由一個XMLHttpRequest對象發起的。