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

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

我正在寻找一个不同的错误,但偶然发现了这一点,并想确保我了解这段遗留代码的作用?

无论如何,我不相信这是一个很好的实践/使用该xhr功能,但有兴趣听听您的意见。我们正在使用 Jquery 1.7.1。

最后,出于好奇,如果 ( ) 调用_orgAjax()未能返回,日志记录方法是否会被调用?async: false

谢谢。

4

2 回答 2

4

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

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

定义全局设置的更多记录方法是使用ajaxSetup()

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

观看演示​​- 成功

最后,出于好奇,如果 _orgAjax() 在 (async: false) 调用时未能返回,那么日志记录方法会被调用吗?

设置正在配置,因此无论EsailijabeforeSend正确指出的异步设置如何,都将始终调用日志记录方法。

参见DEMO - with async: true, 在 return 之前调用 logging
参见DEMO - with async: false, logging 也在 return 之前调用

但是请注意,根据ajax 文档

从 jQuery 1.8 开始,不推荐在 jqXHR ($.Deferred) 中使用 async: false
;您必须使用完成/成功/错误回调。

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

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

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

于 2012-08-12T23:08:41.113 回答
0

嗯,你可以:

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

这肯定比重新定义要简单$.ajaxSettings.xhr

于 2012-08-12T23:06:18.847 回答