使用jQuery.ajax的HEADERS_RECEIVED的readyState事件

时间:2014-12-28 20:56:19

标签: javascript jquery ajax xmlhttprequest readystate

使用原生XMLHttpRequest对象,可以向onreadystatechange事件添加事件监听器,并在readyState2时收到通知,或HEADERS_RECEIVED。 这很有用,因为这样可以在长传输完成之前读取HTTP响应头。​​

然而,在jQuery的AJAX包装器中,似乎没有任何方法可以做到这一点。 jQuery.ajax API documentation实际上说了以下内容。

  

不提供onreadystatechange机制,因为donefailalwaysstatusCode涵盖了所有可能的要求。

除非我弄错了,否则所有列出的回调都会在收到整个请求后触发,这可能需要很长时间后标题可用且readyState2。< / p>

有没有办法在使用jQuery的AJAX包装器时向onreadystatechange和/或readyState 2添加回调,而无需轮询readyState属性?

我想可以使用readyState轮询AJAX对象的setInterval属性,但出于显而易见的原因,我不认为这是一个真正的解决方案。我也不认为修改jQuery的核心也是一个真正的解决方案。

更新

另一位SO用户指示我this question。不幸的是,这些答案似乎都不起作用。修改jQuery不是一个真正的解决方案。使用jQuery创建一个XHR对象类型的目的。最后的答案根本不起作用。事实上,整个问题看起来是一个过时的jQuery。

2 个答案:

答案 0 :(得分:0)

嗯,简短的回答是,由于旧版浏览器中的兼容性问题,jQuery不提供此功能。为了解决这些问题,jQuery简单地将标准降低到最低公分母。

稍微长一点的答案是,可以使用beforeSendxhr方法对其进行修补,但这并非易事,尤其是当您考虑旧版和跨浏览器兼容性时。为了缓解痛苦,I've create a jQuery plugin就是这样做的。

答案 1 :(得分:0)

似乎有可能。从 jQuery 获取 XMLHttpRequest 对象,然后按照此处所述监视状态更改:https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/onreadystatechange

文档中的示例代码:

xhr.onreadystatechange = function () {
  // In local files, status is 0 upon success in Mozilla Firefox
  if(xhr.readyState === XMLHttpRequest.DONE) {
    var status = xhr.status;
    if (status === 0 || (status >= 200 && status < 400)) {
      // The request has been completed successfully
      console.log(xhr.responseText);
    } else {
      // Oh no! There has been an error with the request!
    }
  }
};