确认使用jQuery.ajaxSettings.xhr

时间:2012-08-12 22:50:58

标签: javascript jquery ajax xmlhttprequest

var _orgAjax = jQuery.ajaxSettings.xhr;
jQuery.ajaxSettings.xhr = function () {
    var xhr = _orgAjax();
    DoSomeLogging();
    return xhr;
};

我继承了上面的代码。有人可以确认我的理解是,这会覆盖页面上任何其他位置的$.ajax(...)调用,并且每次都会执行DoSomeLogging()吗?

我正在寻找一个不同的bug,但偶然发现了这一点,并希望确定我理解这段遗留代码的作用是什么?

我不相信这是xhr函数的良好实践/使用,但有兴趣听取您的意见。我们正在使用Jquery 1.7.1。

最后,出于好奇,如果(_orgAjax())调用async: false未能返回,即使到达日志记录方法会怎么样?

感谢。

2 个答案:

答案 0 :(得分:4)

  

有人可以证实我的理解,这将覆盖任何   $ .ajax(...)调用页面上的任何其他位置并执行DoSomeLogging()   每一次?

是。除非在本地ajax实现中覆盖,否则这将定义全局默认行为。

更明确的定义全局设置的方法是使用ajaxSetup()

但是,您也可以使用ajaxSettings设置默认的全局行为,但这种特殊方式并未在jQuery文档中直接记录。

DEMO - 成功

  

最后,出于好奇,如果_orgAjax()如果失败则返回怎么办?   (async:false)调用,甚至可以达到日志记录方法吗?

设置正在配置beforeSend,因此无论异步设置如何, Esailija 都会正确指出记录方法。

请参阅DEMO - async: true,在返回之前调用日志记录 请参阅DEMO - 使用async: false,在返回之前也会调用日志记录

但请注意,根据ajax documentation

  

从jQuery 1.8开始,使用async:false和jqXHR($ .Deferred)是
  过时;您必须使用完整/成功/错误回调。

我知道你使用的是1.7.1,但如果某些东西被弃用,通常有充分的理由,我认为没有任何伤害。

要配置ajax,默认情况下登录complete

请参阅DEMO - 为文档配置complete的默认日志记录。 我知道这会使你的日志记录在发送之后而不是在发送之前执行,但这似乎是我认为1.8更喜欢它的方式。

答案 1 :(得分:0)

嗯,你可以:

$.ajaxSetup({
    beforeSend: function () {
        doSomeLogging();   
    }
});

这比重新定义$.ajaxSettings.xhr更简单。