【问题标题】:How to override jQuery's use of XMLHttpRequest in $.ajax?如何在 $.ajax 中覆盖 jQuery 对 XMLHttpRequest 的使用?
【发布时间】:2010-11-29 11:54:18
【问题描述】:

我需要addEventListener 来监听progress 事件打开XMLHttp 连接(即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.)

【问题讨论】:

    标签: jquery ajax


    【解决方案1】:

    您可以在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)。

    【讨论】:

    • +1 - 请注意,它已记​​录在案,最后一个选项在这里:api.jquery.com/jQuery.ajax
    • @Nick Craver:我相信他指的是 jQuery.ajaxSettings 在api.jquery.com 没有自己的文档页面。
    猜你喜欢
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多