分析ajax請求過程以及請求方法

ajax 的全稱是Asynchronous JavaScript and XML,其中,Asynchronous 是異步的意思,它有別於傳統web開發中採用的同步的方式。據小編翻牆瞭解到,ajax很早就有了,只不過那時候都不用它,後來谷歌把它用在谷歌地圖上,人們感覺使用起來很方便,而且頁面不用刷新,用戶體驗非常好(那時候的網站也沒有什麼用戶體驗^_^)

ajax 原理

XMLHttpRequest是ajax的核心機制,它是在IE5中首先引入的,是一種支持異步請求的技術。簡單的說,也就是javascript可以及時向服務器提出請求和處理響應,而不阻塞用戶,達到頁面無刷新的效果

var xhr = new XMLHttpRequest()
//IE瀏覽器使用var xhr = new ActiveXObject
xhr.open('get', url, true)
xhr.send(null)
xhr.onreadystatechange = function () {
    if (xhr.readyState == 4) {
        if (xhr.status == 200) {
            success(xhr.responseText)
        } else {
            fail && fail(xhr.status)
        }
    }
}

xhr.open()

第三個參數:true/fasle 默認值爲true
false就是等待有返回數據的時候再繼續往下走,還沒有得到數據的時候就會卡在那裏,直到獲取數據爲止。
true就是不等待,直接返回,這就是所謂的異步獲取數據!

xhr.send

需要傳送的數據,接受一個字符串類型

xhr.onreadystatechange

每次狀態改變所都會觸發的事件處理程序

xhr.readyState有以下幾種狀態

0 請求未初始化,open方法尚未調用

1 服務器連接已建立,open方法已經調用,尚未調用send方法

2 請求已接收,也就是接收到頭信息了

3 請求處理中,也就是接收到響應主體了,這時因爲響應及http頭不全,這時通過responseBody和responseText獲取部分數據會出現錯誤

4 請求已完成,數據接收完畢,此時可以通過通過responseXml和responseText獲取完整的迴應數據

xhr.status常見HTTP狀態

0**:未被始化

1**:請求收到,繼續處理

2**:操作成功收到,分析、接受

3**:完成此請求必須進一步處理

4**:請求包含一個錯誤語法或不能完成

5**:服務器執行一個完全有效請求失敗

jQuery.ajax

$.ajax({
    url: '',
    Type: '',
    data: '',
    async:true,
    dataType: '',
    beforeSend: function(xhr) {
      xhr.setRequestHeader("Access-Toke");
    },
    success: function (data) {
        fn1()
    },
    error: function (err) {
       error && error(err) 
    }
})
fn2()

success-函數

$.ajax中的success方法是否獲取成功的回調,jQuery判斷了以下幾種狀態,在源碼中有以下代碼(大概位置8193行)

isSuccess = status >= 200 && status < 300 || status === 304

304---通常的說法就是瀏覽器還有緩存,服務器告訴客戶,原來緩存的文檔還可以繼續使用

async-布爾值

async默認的設置值爲true,這種情況爲異步方式,就是說當ajax發送請求後,在等待server端返回的這個過程中,前臺會繼續 執行ajax塊後面的腳本,直到server端返回正確的結果纔會去執行success,也就是說這時候執行的是兩個線程,ajax塊發出請求後一個線程 和ajax塊後面的腳本(另一個線程)

asyn設爲false時,這時ajax的請求時同步的,也就是說,這個時候ajax塊發出請求後,他會等待在fn1()這個地方,不會去執行fn2(),知道fn1()部分執行完畢。

dataType--字符串

dataType可以指定以下值

xml:返回XML文檔,可用JQuery處理

html:返回純文本HTML信息;包含的script標籤會在插入DOM時執行

script:返回純文本JavaScript代碼。不會自動緩存結果。除非設置了cache參數。注意在遠程請求時(不在同一個域下),所有post請求都將轉爲get請求

json:返回JSON數據

jsonp:JSONP格式。使用SONP形式調用函數時,例如myurl?callback=?,JQuery將自動替換後一個“?”爲正確的函數名,以執行回調函數

text:返回純文本字符串

beforeSend--函數

送請求前可以修改XMLHttpRequest對象的函數,例如添加自定義HTTP頭。在beforeSend中如果返回false可以取消本次ajax請求。XMLHttpRequest對象是惟一的參數

ajax優缺點

優點 : 通過異步,提升用戶的體驗,減少不必要的數據往返,實現局部刷新

缺點 : 對搜索引擎支持比較弱

參考文章:
jQuery官方文檔
XMLHTTPRequest狀態完整列表
jQuery源碼
JavaScrip進度事件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章