上一篇單獨寫的是ajax跨域,這一篇就來詳細說一說ajax,ajax是現代web開發中必不可少的一部份內容,很是基礎也很是重要,這篇總結一下到目前爲止我對ajax的理解。javascript
ajax是web開發中的一種交互技術,全稱爲Asynchronous JavaScript And XMLHttpRequest,使用ajax能夠實現頁面局部更新,每次變化再也不須要請求整個頁面,以前在我web開發歷史的文章中也提到過,從前的web頁面每次須要更新時都必需要刷新整個頁面,總體體驗很是很差。ajax的出現並大量使用在web開發中絕對是顛覆性的變化,它使得開發出優秀的web應用成爲現實,今後各類各樣的前端技術才得以興起。時至今日,ajax已經成爲web開發中難以或缺的一部分。前端
ajax的核心天然就是XMLHttpRequest對象了,它存在於全部現代瀏覽器中(IE5 和 IE6 使用 ActiveXObject),它使得瀏覽器能夠發出HTTP請求與接收HTTP響應。有了這一基礎,剩下的就是js交互了,整個過程瀏覽器就能夠處理,而交換數據的文檔也不限於xml(如今經常使用json)。java
一次ajax交互是瀏覽器向服務器請求一次數據的過程,整個過程可分爲4步:jquery
以上就是一次完整的ajax交互,下面來經過代碼展現一下簡單的ajax流程。web
先來看代碼ajax
var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); // url 是一個URL xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200 || xhr.status == 304){ // 得到 xhr.responseText 爲相應數據 } }; xhr.send();
咱們來一點點看其中涉及到的方法和相關概念,首先建立了一個XMLHttpRequest對象,而後接下來是一個open方法,第一個參數是請求方法,第二個參數是一個URL,默認狀況要求同源(關於同源策略和跨域能夠看我上一篇文章),第三個參數指的是是否爲異步請求,默認是true能夠省略。open方法結束會初始化HTTP請求參數,可是並不發送請求。json
作好請求發送準備了,不過如今還不能發送請求。由於請求是異步的,咱們沒法獲知請求的進度和響應狀態,XMLHttpRequest給咱們提供了一個事件onreadystatechange,咱們能夠經過監聽這個時間來關注這種變化,因此下一步是註冊onreadystatechange事件。api
先了解一下readyState,當一個XMLHttpRequest初次建立時,這個readyState的值從0開始,直到接收到完整的HTTP響應,這個值增長到4,具體狀況以下:跨域
狀態 | 名稱 | 描述 |
---|---|---|
0 | Uninitialized | 初始化狀態。XMLHttpRequest 對象已建立或已被 abort() 方法重置。 |
1 | Open | open()方法已調用,可是 send() 方法未調用。請求尚未被髮送。 |
2 | Sent | Send()方法已調用,HTTP 請求已發送到 Web 服務器。未接收到響應。 |
3 | Receiving | 全部響應頭部都已經接收到。響應體開始接收但未完成。 |
4 | Loaded | HTTP 響應已經徹底接收。 |
在這裏咱們只要判斷這個值是否是4就能夠知道響應是否接收完成了。promise
另外一個要關注的就是status,它指的就是HTTP狀態碼,這個你們都很熟悉了,只要是200(OK)或304(Not Modified)就是成功的請求(這裏也能夠關注statusText,它指的是狀態碼對應的名稱,不經常使用)。此時就能夠獲取到響應數據了,responseText即爲響應體內容(還有一個responseXML,它對請求的響應解析爲XML並做爲Document對象返回,不經常使用)。到此,請求準備徹底完成。
接下來調用send方法,發送請求,其中若是是POST或PUT請求能夠把請求體做爲參數傳入。整個請求到此就發送完成了。
XMLHttpRequest還有幾個這裏沒涉及到的方法abort,getAllResponseHeaders,getResponseHeader,setRequestHeader,暫時用不到這裏不過多介紹了。
對於ie五、6,建立xhr對象要使用new ActiveXObject("Microsoft.XMLHTTP"),不過之後應該沒用了。
以上就是原生js實現的ajax,在實際開發中咱們幾乎永遠都不會去寫ajax,封裝好的ajax庫有不少,比較熟悉的jquery中的$.ajax,$get,$post等等。到此,傳統的基於XMLHttpRequest 實現的ajax的內容就結束了,不過如今還有一個東西須要認識一下。
XMLHttpRequest的api上面已經看到了,能夠說的上很複雜了,它複雜到咱們平時幾乎都用不上原生api,因而,一種新的更優雅的解決方案--fetch誕生了。
首先fetch是新東西,先來看瀏覽器支持率:
能夠看出其實不是很樂觀,不過沒關係,咱們可使用polyfill來實現,因此能夠直接來看fetch的例子:
fetch(url, { method: 'GET', headers: new Headers({ 'Accept': 'application/json' }) }).then(res=>{ return res.json() }).then(res=>{ console.log(res) }).catch(err=>{ // 處理異常 })
能夠看出fetch是基於promise的(關於promise相關內容在這篇文章中提到過),因此能夠鏈式調用,整個過程不難理解,請求結果若是是json還支持直接處理,fetch的api很是實用,適合現代前端開發使用,使用React開發時候一般咱們都選fetch做爲數據請求工具。
至此,這篇文章內容就結束了,最後仍是版權信息:尊重原創,轉載分享前請先知悉做者,也歡迎指出錯誤不足共同交流,更多內容歡迎關注做者博客點擊這裏