2012-07-26 70 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

相关问题