【问题标题】:history.pushState breaking on browser back buttonhistory.pushState 在浏览器后退按钮上中断
【发布时间】:2012-11-05 21:35:57
【问题描述】:

我正在开发一个单页应用程序,其中每个部分都通过 ajax 加载。主页是它自己的页面,然后单击“关于”,它会将您带到单页应用程序。我已经获得了要在每个部分上更改的 url 以及浏览器上的后退和前进按钮来使用这个 sn-p:

$('.down-button').on('click', function() {
        var stateObj = { principles: "about-principles" };
        history.pushState(stateObj, null, "about-principles");
        $('#principles-wrap').scrollintoview({ duration: 1000 });
    });

但是,当您一直点击返回主页时,主页不会刷新,您仍停留在“关于”页面上。或者,如果您单击返回主页的链接,则会收到 404 错误。

我错过了什么?

编辑

下面是剩下的代码:

function button_scroll () {
// Call scrollIntoView js file into this 
$.getScript("/js/jquery.scrollintoview.min.js", function() {
    $('.down-button').on('click', function() {
        var stateObj = { principles: "about-principles" };
        history.pushState(stateObj, null, "about-principles");
        $('#principles-wrap').scrollintoview({ duration: 1000 });
    });
    $('.up-button-principles').on('click', function() {
        var stateObj = { mission: "about-mission" };
        history.pushState(stateObj, null, "about-mission");
        $('#mission-wrap').scrollintoview({ duration: 1000 });
    });
    $('.down-button-principles').on('click', function() {
        var stateObj = { snapshot: "about-snapshot" };
        history.pushState(stateObj, null, "about-snapshot");
        $('#snapshot-wrap').scrollintoview({ duration: 1000 });
    });
    $('.up-button-snapshot').on('click', function() {
        var stateObj = { principles: "about-principles" };
        history.pushState(stateObj, null, "about-principles");
        $('#principles-wrap').scrollintoview({ duration: 1000 });
    });
    $('.down-button-snapshot').on('click', function() {
        var stateObj = { people: "about-people" };
        history.pushState(stateObj, null, "about-people");
        $('#people-wrap').scrollintoview({ duration: 1000 });
    });
    $('.up-button-people').on('click', function() {
        var stateObj = { snapshot: "about-snapshot" };
        history.pushState(stateObj, null, "about-snapshot");
        $('#snapshot-wrap').scrollintoview({ duration: 1000 });
    });

});

}

//Dropdown
$(document).ready(function () {
$(window).on('load resize', function () {
    resize_mission();
    resize_principles();
    resize_snapshot();
    resize_people();
    button_scroll();
});
var dropDown = $('.dropdown');
$('h3.about').on('click', function() {
    dropDown.slideDown('fast', function() {
        var url = 'about2.php'
        var stateObj = { mission: "about-mission" };
        history.pushState(stateObj, null, "about-mission");
        $.get(url, function(data) {
            resize_mission();
            resize_principles();
            resize_snapshot();
            resize_people();
            button_scroll();
        });
    });
});

});

这就是我正在做的。没有插件。

【问题讨论】:

    标签: jquery ajax browser-history pushstate


    【解决方案1】:

    您是否正在停止关于页面上的主页点击事件的默认操作?如您在链接上使用preventDefault()stopPropagation() 点击您的关于页面?您是否也在停止 hashchange 事件的默认行为?我们可能需要查看更多关于您的历史实现的代码。您是否使用任何历史插件?

    【讨论】:

    • 我添加了其余的代码。不,我没有做 preventDefault() 或使用插件。您可以在此处查看页面:teneo.telegraphbranding.com
    • 您可能想看看 Ben Alman 的 JQuery BBQ 插件 (benalman.com/projects/jquery-bbq-plugin)。它非常易于使用并且可以跨浏览器工作(以及您当前代码不会使用的旧浏览器)。我一直在我的项目中使用它(就像许多 JQuery 开发人员一样),它让生活变得更轻松:)。但是,一旦有机会,我会再次查看您更新的代码。
    • 如何在我的网站上实现 BBQ 插件?我对文档有点困惑。再次感谢您的帮助!
    • 最初需要花一些时间来了解如何做 :)。如果您不需要 BBQ 提供的所有额外功能,Ben 还有一个更简单的插件 (benalman.com/projects/jquery-hashchange-plugin)。否则,请查看此线程:stackoverflow.com/questions/116446/…,因为提到了很多历史插件。也许你可以在那里找到一个更容易理解、更适合你的情况的东西。
    猜你喜欢
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 2011-02-17
    • 1970-01-01
    • 2012-07-09
    • 2017-06-29
    相关资源
    最近更新 更多