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

Kot*_*Kot 9 ajax jquery

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

(注意:您需要在请求上调用open()之前添加事件侦听器.否则,不会触发progress事件.)

T.J*_*der 8

您可以在每个单独的呼叫中覆盖该xhr功能.这是记录在文档(感谢尼克!) .ajaxSetup$.ajax$.ajax

如果您想要始终执行此操作,您的代码可能看起来像这样(未经测试):

(function() {
    var originalXhr = jQuery.ajaxSettings.xhr; 
    jQuery.ajaxSetup({
        xhr: function() {
            var req = originalXhr();
            if (req) {
                // Add your progress handler
            }
            return req;
        }
    });
})();
Run Code Online (Sandbox Code Playgroud)

...或者像这样(实例)仅针对特定请求:

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

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