由于我一直不清楚您到底要做什么,所以这里有一个解决方案,它执行以下操作:
- 您只能更改 jQuery ajax 基础结构 - 您无法更改所有 ajax 调用者,因此您希望在不更改调用代码的情况下从 ajax 函数中执行操作。
- 当一个ajax调用开始时,立即提出进度,但是延迟发送ajax请求1.5秒。
- ajax 调用完成后,隐藏进度状态。
这是代码:
// save old function
$.ajaxOld = $.ajax;
// install our global status hide handler
$.ajaxSetup({
complete: function() {
$('.loader').hide();
}
});
// replace ajax call with our own that adds the delay
$.ajax = function() {
// save state from the original function call for use later
var args = [].slice.call(arguments);
var self = this;
// show progress immediately
$('.loader').show();
// call the original ajax function in 1.5 seconds
setTimeout(function() {
$.ajaxOld.apply(self, args);
}, 1500)
}
警告 - 只要没有调用$.ajax()
期望它返回 jqXHR 对象并且没有使用 ajax 延迟,这将起作用。如果使用了这些,则需要编写一个更复杂的解决方案来阻止成功处理程序和完成处理程序。
编辑:这些是了解问题所在的较早尝试:
要确保通知在屏幕上显示的时间最短,您可以这样做:
beforeSend:function(xhr, settings){
xhr.startTime = new Date().getTime();
$('.loader').show();
complete:function(xhr){
var elapsed = new Date().getTime() - xhr.startTime;
if (elapsed < 3000) {
$('.loader').delay(3000 - elapsed).hide(1);
} else {
$('.loader').hide();
}
这将跟踪消息在屏幕上的显示时间,如果 ajax 调用很快,它将延迟隐藏消息直到 3 秒过去。如果 ajax 调用没有快速进行并且消息已经显示了足够长的时间,它会在 ajax 调用完成时将其隐藏。
如果您想做的是延迟内容的加载并且您正在处理程序中处理结果complete
,那么您可以这样做:
function finishMyAjax(xhr) {
// load your ajax content
$('.loader').hide();
}
beforeSend:function(xhr, settings){
xhr.startTime = new Date().getTime();
$('.loader').show();
complete:function(xhr){
var elapsed = new Date().getTime() - xhr.startTime;
var self = this;
var args = [].slice.call(arguments);
if (elapsed < 3000) {
setTimeout(function() {
finishMyAjax.apply(self, args);
}, 3000-elapsed);
} else {
finishMyAjax.apply(this, arguments);
}
如果您没有在完整的处理程序中处理所有 ajax 的结果,那么请包含处理结果的代码,以便我可以将其包含在这个想法中。这里的总体思路是记录 ajax 调用开始的时间。如果 ajax 响应到来时,还不到 3 秒,则您设置一个计时器来计算 3 秒内的剩余时间,并在计时器回调中完成响应。如果超过 3 秒,那么您只需继续正常处理结果即可。
这使您永远不会使用超出预期的时间,但总是至少 3 秒。您可以延迟启动 ajax 调用 3 秒,但是如果您的 ajax 调用需要 6 秒才能得到结果,那么整个过程将需要 9 秒,这不是您想要的。在我的方案中,如果 ajax 结果需要 1 秒,您将延迟处理到 3 秒。如果 ajax 结果需要 6 秒,结果将在它进来时被正确处理(没有额外的 3 秒延迟)。