2012-07-26 72 views
0

這個問題是關係到我之前的問題: Is READYSTATE_LOADED across browsers?如何判斷XHR是否使用readyState發送到服務器?

所以我知道的readyState是不是跨瀏覽器可靠。我目前只是試圖在任何瀏覽器中做一個概念驗證。

我在我的插件,並有這樣的代碼:

var xhr = new XMLHttpRequest(); 
xhr.onreadystatechange = function(){    

    if (xhr.readyState == 4){ 
     self._onComplete(id, xhr);      
    } 
    else if (xhr.readyState == 2){ 
    self._onSent(id, xhr); 
    } 

}; 

如果我登錄的回調,馬上「完全」,經過我的服務器端腳本響應之前「已發送」的火災。我誤解了什麼是readyState 2?我嘗試了1踢,並沒有在服務器響應之前觸發。

我看了一下xhr對象的上傳對象,它至少有一個「進度」事件,但我仍然沒有看到有關進度的任何事情。事實上,如果上一次進度爲97%,則在文件完成發送到服務器時不會在100%時啓動。因此,當服務器處理上載時,在readyState變爲4之前進度掛起在97%。

這使得用戶認爲上傳停頓,甚至認爲它實際上一直在上升。

回答

2

沒有狀態來檢查發送請求的時間。

readyState 2意味着服務器響應,所有標題都來了,這是請求的主體部分來自於前右解僱。

最好的辦法是,當你發出解僱自己的事件命令send()

var xhr = new XMLHttpRequest(); 
xhr.onreadystatechange = function(){    

    if (xhr.readyState == 4){ 
     self._onComplete(id, xhr);      
    } 
    else if (xhr.readyState == 2){ 
    // Headers received 
    } 

}; 

xhr.send(data) 
self._onSend(id, xhr); 

4.6各國

UNSENT(數值0)的對象已被構建。

OPENED(數值1)open()方法已成功調用 。在此狀態期間,可以使用 setRequestHeader()設置請求標頭,並且可以使用send() 方法進行請求。

HEADERS_RECEIVED(數值2)所有重定向(如果有的話)都是 ,並且最終響應的所有HTTP標頭已收到 。該對象的幾個響應成員現在可用。

LOADING(數值3)正在接收響應實體主體。

DONE(數值4)數據傳輸已完成或 傳輸過程中出現問題(例如無限重定向)。

http://www.w3.org/TR/XMLHttpRequest/#states

編輯

var xhr = new XMLHttpRequest(); 
xhr.onreadystatechange = function(){    

    if (xhr.readyState == 4){ 
     self._onComplete(id, xhr);      
    } 
    else if (xhr.readyState == 2){ 
    // Headers received 
    } 
    else if (xhr.readyState == 1){ 
    // xhr.open() called 
    // You can set headers here amoung other things 
    xhr.send(data) 
    self._onSend(id, xhr); 
    } 

}; 

xhr.open(method, url, async, user, password) 

http://www.w3.org/TR/XMLHttpRequest/#the-open-method

+0

嗯,我正在讀它是關於狀態更加不明朗。如果我在.send熄滅的時候做了一些事情,是不是像第一個字節而不是100%的字節那樣? – 2012-07-26 22:47:39

+0

我想將您的答案標記爲唯一,但您能否回答我關於.send的問題? – 2012-08-01 21:17:34

+0

對不起,錯過了您的評論。如果你以我的答案爲例,你會在第一個字節被髮送的同時發射。就w3規範而言,當請求被髮送時,沒有辦法阻止。狀態0和1打開告訴你什麼時候開始。如果你在哪裏使用'xhr.open()',你會得到一個等於1的'xhr.readyState',但是不會發送請求。我會更新我的答案來展示一個例子。 – travis 2012-08-02 18:29:17

相關問題