2

使用本机XMLHttpRequest对象,可以为事件添加事件侦听器onreadystatechange,并在readyStateis2HEADERS_RECEIVED. 这很有用,因为这可以在完成长传输之前读取 HTTP 响应标头。

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

但是,没有提供任何onreadystatechange机制,因为donefailalwaysstatusCode涵盖了所有可能的要求。

除非我弄错了,否则所有列出的回调都会在收到整个请求后触发,这可能是在标头可用并且readyState2.

有没有办法在不轮询属性的情况下向onreadystatechange和/或readyState 2使用 jQuery 的 AJAX 包装器添加回调?readyState

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

更新:

另一个 SO 用户将我引向了这个问题。不幸的是,这些答案似乎都不起作用。修改 jQuery 并不是真正的解决方案。使用 jQuery 创建 XHR 对象有点违背了目的。最后一个答案根本不起作用。事实上,整个问题看起来都是针对过时的 jQuery 的。

4

2 回答 2

0

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

稍长一点的答案是可以使用beforeSendandxhr方法将其修补到其中,但这并非微不足道,尤其是当您考虑到遗留和跨浏览器兼容性时。为了减轻痛苦,我创建了一个 jQuery 插件来做这件事。

于 2015-01-25T22:44:25.933 回答
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!
    }
  }
};
于 2021-02-21T02:02:58.087 回答