javascript - 使用后退和前进按钮快速导航时如何防止加载多个 View

标签 javascript jquery ajax

我正在开发一个 Web 应用程序,用户可以在使用 AJAX 加载的不同页面(或“部分 View ”)之间导航。我这样做是为了当用户按下浏览器中的后退和前进按钮时,应用程序根据地址栏当时包含的 url 返回正确的 View 。

我的问题:当我通过按浏览器中的后退和前进按钮缓慢导航时,它会正常工作。但是,当我重复按后退或前进按钮时,它会在应用程序中加载多个 View 。

我的问题:有没有办法防止在应用程序中加载多个 View ,而只加载应该加载的 View ?

我的代码:

$(window).on("popstate", function (e) {
    $(".UserNavigation li").removeClass("active");
        LoadContent.init();
    })

    var LoadContent = {
    init: function (url, query) {

        var Content = { }
        var PathName;

        if (url == null) {
            PathName = window.location.pathname;
            Content.url = "ContentArea/" + PathName;
        }    
        else {
            var Controller = "ContentArea/"
            Content.url = Controller + url
        }            

        if (query)
            Content.query = query       

        LoadContent.Loading(this);

        xhr = $.ajax({
            type: "POST",
            url: Content.url,
            data: { query: Content.query, type: 0 },
            success: function (data) {  

                LoadContent.ApplyContent(data);

            },
            error: function () {

            },
            complete: function (data) {
                if (url != null)
                    LoadContent.UpdateHistory(data, url);
            }
        })
    },

    ApplyContent: function (data) {
        $("#ContentLoading").animate({
            opacity: 0
        }, 200, function () {
            $("#ContentLoading").addClass("hidden");
            $("#ContentArea").append(data).addClass("visible");
            LoadContent.UpdateMenu();
        })

        return this;
    },

    Loading: function () {
        $("#ContentArea").children().remove();
        $("#ContentLoading").removeClass("hidden");
        $("#ContentArea").removeClass("visible");
        $("#ContentLoading").animate({
            opacity: 1
        }, 200)
    },

    UpdateHistory: function (data, url) {
        var DataToSave = {
            StateURL: url,
        }

        history.pushState(DataToSave.StateURL, url, url)
    },

    UpdateMenu: function () {
        var CurrentPath = window.location.pathname;
        $(".UserNavigation li").removeClass("active");
        $("[href='" + CurrentPath + "']").parent().addClass("active");
    }
}

最佳答案

在下面的部分

ApplyContent: function (data) {
    $("#ContentLoading").animate({
        opacity: 0
    }, 200, function () {
        $("#ContentLoading").addClass("hidden");
        $("#ContentArea").append(data).addClass("visible");
        LoadContent.UpdateMenu();
    })

    return this;
},

.append()更改为.html()。这将防止多余的内容填充更多空间,但完全替换 #ContentArea 的 html。

就像 Parth 所说,您还应该中止正在运行的 Ajax 请求并启动一个新请求。这不会阻止服务器向您发送结果,因此最好在发送新请求时也取消服务器上的所有旧请求。

关于javascript - 使用后退和前进按钮快速导航时如何防止加载多个 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42709530/

相关文章:

php - 使用 jquery 将变量传递给 Php 以进行 MySQL 删除

javascript - 使用 HTML5 FileWriter 覆盖文件

javascript - 多个 AJAX 请求仅第一个有效,其他失败

Javascript 不适用于 ajax 生成的代码?

javascript - 如何检查是否为 "true or false = expanded area?"

javascript - 使用 $.ajax({dataType : 'script' }), 请求仅发出一次

javascript - 通过 ajax 和 jQuery 根据获取结果选择值

javascript - 从 JsonClient 获取错误消息

javascript - 如何访问作为键值对的对象数组

javascript - 单击功能未在 Jquery 中正确注册