如何在$ .ajax中覆盖jQuery对XMLHttpRequest的使用?

时间:2010-11-29 11:54:18

标签: jquery ajax

我需要addEventListener在打开XMLHttp连接之前监听progress事件(即xhr.open()),但beforeSend方法会返回xhr实例已经打开。如何覆盖它以正确添加监听器?

Note: You need to add the event listeners before calling open() on the request. Otherwise the progress events will not fire.

1 个答案:

答案 0 :(得分:8)

您可以覆盖ajaxSetup中的xhr功能,甚至可以覆盖每个$.ajax个人(function() { var originalXhr = jQuery.ajaxSettings.xhr; jQuery.ajaxSetup({ xhr: function() { var req = originalXhr(); if (req) { // Add your progress handler } return req; } }); })(); 。这在$.ajax docs (感谢Nick!)

中有记录

如果您想要所有时间,您的代码可能看起来像这样(未经测试):

$.ajax({
  url: "path/to/resource",
  xhr: function() {
    var req = $.ajaxSettings.xhr();
    if (req) {
      // Add your handler here
    }
    return req;
  }
});

...或像这样(live example)仅针对特定请求:

xhr

不幸的是,尽管记录了覆盖jQuery.ajaxSettings.xhr,但是当前配置的{(1}})的位置似乎不是,因此从技术上讲,您仍然依赖于未记录的功能代码中的jQuery.ajaxSettings.xhr。你只需要仔细检查每个点发布时是否仍然存在,它可能不会移动太多(jQuery.ajaxSettings至少提到在文档中,{{3 }})。