【发布时间】:2010-11-29 11:54:18
【问题描述】:
我需要addEventListener 来监听progress 事件在打开XMLHttp 连接(即xhr.open()),但beforeSend 方法返回一个已经打开的xhr 实例。我将如何覆盖它以正确添加侦听器?
【问题讨论】:
我需要addEventListener 来监听progress 事件在打开XMLHttp 连接(即xhr.open()),但beforeSend 方法返回一个已经打开的xhr 实例。我将如何覆盖它以正确添加侦听器?
【问题讨论】:
您可以在ajaxSetup 甚至在每个单独的$.ajax 调用中覆盖xhr 函数。这在 $.ajax 文档中有记录(感谢 Nick!)。
如果您想一直一直这样做,您的代码可能看起来像这样(未经测试):
(function() {
var originalXhr = jQuery.ajaxSettings.xhr;
jQuery.ajaxSetup({
xhr: function() {
var req = originalXhr();
if (req) {
// Add your progress handler
}
return req;
}
});
})();
...或像这样 (live example) 仅针对特定请求:
$.ajax({
url: "path/to/resource",
xhr: function() {
var req = $.ajaxSettings.xhr();
if (req) {
// Add your handler here
}
return req;
}
});
不幸的是,虽然覆盖 xhr 已记录在案,但当前配置的 (jQuery.ajaxSettings.xhr) 的位置似乎并不存在,因此从技术上讲,您仍然依赖于未记录的功能,方法是使用 jQuery.ajaxSettings.xhr你的代码。您只需要仔细检查每个 dot 版本是否仍然存在,它可能不会移动太多(jQuery.ajaxSettings 在文档中至少提到,here)。
【讨论】: