根据this question中的问题(ajaxStop发射两次),我写了下面的ajaxStop事件。
var ajaxCount = 0;
$(document).ajaxStop(function () {
ajaxCount += 1;
console.debug('calling ajaxStop, iteration ' + ajaxCount);
if (ajaxCount == 2) {
$('.fieldLoading').hide();
$('.fieldValue').show();
}
});
10次中有9次完全符合预期。一旦页面加载,调试控制台就会显示“调用ajaxStop,迭代1”。然后,在其他所有内容触发后,它会显示“调用ajaxStop,迭代2”。这就是我的期望。然而,大约5%或10%的时间它只显示迭代1,在一切都被触发后(这意味着没有显示数据)。
答案 0 :(得分:1)
我建议添加一个ajaxSend()处理程序来计算ajax请求的数量并将ajaxStop()转换为ajaxComplete()。而不是执行:
if (ajaxCount == 2)
然后你可以这样做:
if (ajaxStopCount == ajaxStartCount)
此外,您可以修改计数器以计算ACTIVE请求(减少ajaxComplete上的计数器,在ajaxSend上递增它(您的加载对话框可能会在请求之间消失,但会在另一个请求开始时重新出现;我不会隐藏/显示之间的延迟很大,但这取决于您的代码组织。)
为错误添加另一个处理程序,您应该设置。
答案 1 :(得分:0)
我最终使用了这样的队列:
var ajaxQueue = $({});
$.ajaxQueue = function (ajaxOpts) {
// Hold the original complete function.
var oldComplete = ajaxOpts.complete;
// Queue our ajax request.
ajaxQueue.queue(function (next) {
// Create a complete callback to fire the next event in the queue.
ajaxOpts.complete = function () {
// Fire the original complete if it was there.
if (oldComplete) {
oldComplete.apply(this, arguments);
}
// Run the next query in the queue.
next();
};
// Run the query.
$.ajax(ajaxOpts);
});
};
现在我只是将所有的ajax事件称为ajaxQueue()而不是ajax()。然后,我有一个$(文件).ajaxStop(),我用它来完成所有事情。