0

这个问题与我之前的问题有关: 是否 READYSTATE_LOADED 跨浏览器?

所以我知道 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%。

这使用户认为上传停滞不前,甚至认为它实际上一直在上升。

4

1 回答 1

3

没有状态可以检查以查看何时发送了请求。

readyState2 表示服务器已响应并且所有标头都已进入。这是在请求的主体部分进入之前触发的。

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

于 2012-07-26T22:37:01.127 回答