javascript - 在 Ajax 调用的 $.post 简写上切换加载程序

标签 javascript jquery ajax twitter-bootstrap

我有以下代码用于进行 Ajax 调用:

$.post($form.attr('action'), $form.serialize(), 'json').done(function (data, textStatus, jqXHR) {
    // Some logic here for done callback

    // Redirect to another URL after 5 seconds
    window.setTimeout(function () {
        window.location = data.redirect_to;
    }, 5000);
}).fail(function () {
    // Some logic here for fail callback
})

该代码运行良好。现在我需要将一个“加载器”附加到此 Ajax 调用。我知道我可以将其附加到 $(document) 自 jQuery 1.8+ 文档公开以来(在 this 主题上也发现了相同的内容),所以我做了以下操作:

$(function () {
  // a bunch of logic here
}).ajaxStart(function () {
    $('#loaderModal').modal('show');
    $('#loaderModal').on('show.bs.modal', function (e) {
        $('#loaderDiv').loader();
    })
}).ajaxStop(function () {
    $('#loaderModal').modal('hide');
    $('#loaderModal').on('hidden.bs.modal', function (e) {
        $('#loaderDiv').loader('destroy');
    })
});

这又有效,但碰巧我在页面上有其他 Ajax 调用(用于某些字段的验证目的),并且每次运行其中任何一个时,都会显示加载程序,这是不正确的,因为我只需要附加到上面显示的代码(第一段代码)。我怎样才能做到这一点?

作为与本文相关的第二部分,donefail 回调上的一些逻辑触发 Bootstrap Growl消息,您一定已经注意到,我正在使用包含加载程序的 Twitter Bootstrap Modal 组件,因此我担心运行加载程序的调用会以某种方式阻止 回调时的第二次调用done 被调用,这可能吗?这些事件的执行速度有多快?

PS:如果你们有更好的解决方案,请提前表示感谢

最佳答案

不要使用全局事件处理程序,而是显示/隐藏当前 ajax 请求的加载程序,例如

//show the loader before the request
showLoader();
$.post($form.attr('action'), $form.serialize(), 'json').done(function (data, textStatus, jqXHR) {
    // Some logic here for done callback

    // Redirect to another URL after 5 seconds
    window.setTimeout(function () {
        window.location = data.redirect_to;
    }, 5000);
}).fail(function () {
    // Some logic here for fail callback
}).always(hideLoader) //hide the loader after the ajax request

function showLoader() {
    $('#loaderModal').modal('show');
    $('#loaderModal').on('show.bs.modal', function (e) {
        $('#loaderDiv').loader();
    })
}

function hideLoader() {
    $('#loaderModal').modal('hide');
    $('#loaderModal').on('hidden.bs.modal', function (e) {
        $('#loaderDiv').loader('destroy');
    })
}

关于javascript - 在 Ajax 调用的 $.post 简写上切换加载程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26247944/

相关文章:

javascript - 应用所有变换矩阵

javascript - JQuery 处理交互内容

javascript - 如何从 KendoUI 模态窗口获取返回值

javascript - 如何平滑 jquery 动画

javascript - 如何使用 javascript 切换某些 jquery 效果

ajax - 在使用 MVC 3 和 jQuery 进行 AJAX 和动态创建之后,元素未通过不显眼的验证进行验证

Ajax XMLHttpRequest 对象限制

javascript - 当我将对象作为 Prop 传递给子组件时如何避免重新渲染?

javascript - 如何缩小正则表达式验证失败的原因?

Jquery 覆盖链接,使用 url