使用原生XMLHttpRequest
对象,可以向onreadystatechange
事件添加事件监听器,并在readyState
为2
时收到通知,或HEADERS_RECEIVED
。
这很有用,因为这样可以在长传输完成之前读取HTTP响应头。
然而,在jQuery的AJAX包装器中,似乎没有任何方法可以做到这一点。 jQuery.ajax API documentation实际上说了以下内容。
不提供
onreadystatechange
机制,因为done
,fail
,always
和statusCode
涵盖了所有可能的要求。
除非我弄错了,否则所有列出的回调都会在收到整个请求后触发,这可能需要很长时间后标题可用且readyState
为2
。< / p>
有没有办法在使用jQuery的AJAX包装器时向onreadystatechange
和/或readyState
2
添加回调,而无需轮询readyState
属性?
我想可以使用readyState
轮询AJAX对象的setInterval
属性,但出于显而易见的原因,我不认为这是一个真正的解决方案。我也不认为修改jQuery的核心也是一个真正的解决方案。
更新
另一位SO用户指示我this question。不幸的是,这些答案似乎都不起作用。修改jQuery不是一个真正的解决方案。使用jQuery创建一个XHR对象类型的目的。最后的答案根本不起作用。事实上,整个问题看起来是一个过时的jQuery。
答案 0 :(得分:0)
嗯,简短的回答是,由于旧版浏览器中的兼容性问题,jQuery不提供此功能。为了解决这些问题,jQuery简单地将标准降低到最低公分母。
稍微长一点的答案是,可以使用beforeSend
和xhr
方法对其进行修补,但这并非易事,尤其是当您考虑旧版和跨浏览器兼容性时。为了缓解痛苦,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!
}
}
};