ajaxStop发射两次......有时候

时间:2013-08-15 13:16:11

标签: ajax jquery

根据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,在一切都被触发后(这意味着没有显示数据)。

2 个答案:

答案 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(),我用它来完成所有事情。