0

基于这个问题中的问题(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,在一切都已触发之后(这意味着没有数据显示)。

4

2 回答 2

1

我建议添加一个 ajaxSend() 处理程序来计算 ajax 请求的数量并将 ajaxStop() 转换为 ajaxComplete()。而不是执行:

if (ajaxCount == 2) 

然后你可以这样做:

if (ajaxStopCount == ajaxStartCount)

此外,您可以修改您的计数器以计算 ACTIVE 请求(在 ajaxComplete 上减少计数器,在 ajaxSend 上增加它(您的加载对话框可能会在请求之间消失,但​​会在另一个请求开始时重新出现;我不会想象太多隐藏/显示之间的延迟,但这取决于您的代码组织)。

添加另一个错误处理程序,您应该设置好。

于 2013-08-15T13:44:06.317 回答
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()。然后,我有一个 $(document).ajaxStop() 用来完成所有事情。

于 2013-08-26T19:33:40.330 回答