Ajax和后退按钮.散列更改,但前一页状态存储在哪里?

use*_*003 12 javascript ajax

我正在尝试使用后退按钮进行ajax工作,并且缺少一些重要的东西.前一页状态存储在哪里?

情况1:

点击"让我变红".发生ajax事件,页面变为红色.哈希= #red

点击"让我变黄".发生ajax事件,页面变黄.哈希= #yellow

单击后退按钮.哈希现在回到#red.但我也希望页面是红色的.它还是黄色的.

案例2:

点击"让我变红".发生ajax事件,页面变为红色.哈希= #red

点击"转到其他网站".它归谷歌所有.

单击后退按钮.我们回到网站,hash = #red,但我也希望页面是红色的!

<!DOCTYPE html>
<html>
<style>
    .red{background:red}
    .yellow{background:yellow}
</style>
<head>
    <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <script type="text/javascript">
    $(function(){
        $('.ajax_thing').click(function(){
            location.hash=$(this).attr('action_type');
            return false
        })
        var originalTitle=document.title
        function hashChange(){
            var page=location.hash.slice(1)
            if (page!=""){
                $('#content').load(page+".html #sub-content")
                document.title=originalTitle+' – '+page
            }
        }
        if ("onhashchange" in window){ // cool browser
            $(window).on('hashchange',hashChange).trigger('hashchange')
        }else{ // lame browser
            var lastHash=''
            setInterval(function(){
                if (lastHash!=location.hash)
                    hashChange()
                lastHash=location.hash
            },100)
        }
    })

    </script>
</head>
<body>
<menu>
       <li><a class="ajax_thing" id = "red_action" action_type="red">Make me red</a></li>
        <li><a class="ajax_thing" id = "yellow_action" action_type="yellow">Make me yellow</a></li>
</menu>
        <li><a href = "http://www.google.com">Go to other site</a></li>
</body>
</html>
<script>

$("#red_action").click(function(e) {
  // ajax here. on success:
    $("body").removeClass("yellow");
    $("body").addClass("red");
})

$("#yellow_action").click(function(e) {
  // ajax here. on success:
    $("body").removeClass("red");
    $("body").addClass("yellow");
})

</script>
Run Code Online (Sandbox Code Playgroud)

gil*_*ly3 13

不要使用JavaScript来驱动您的网址,而是让您的网址驱动您的JavaScript.让window.onhashchange事件处理程序完成所有工作.其他所有东西都应该改变哈希值.

你甚至不需要链接的点击处理程序,只需将网址设置为正确的哈希:

<a href="#red">Red</a>
Run Code Online (Sandbox Code Playgroud)

然后,你的hashchange处理程序负责其余的事情:

function hashChange() {
    var page = location.hash.slice(1);
    if (page) {
        $('#content').load(page+".html #sub-content");
        document.title = originalTitle + ' – ' + page;
        switch (page) {
            // page specific functionality goes here
            case "red":
            case "yellow":
                $("body").removeClass("red yellow").addClass(page);
                break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

完全更改哈希的唯一原因是,如果您希望能够返回到页面并使其根据URL加载相同的状态.那么,你已经要求让URL驱动JavaScript,对吗?另外你为什么要更改哈希?将功能移出点击处理程序,进入hashchange事件只会简化事情.

  • 登录后说,这是一个令人难以置信的解决方案,几乎可以解决令人费解的问题. (2认同)

j00*_*0lz 6

使用AJAX时,使用history.pushState手动更新历史记录非常重要

然后为onpopstate事件创建函数测试并根据需要更新内容.

https://developer.mozilla.org/en-US/docs/Web/Guide/DOM/Manipulating_the_browser_history

  • 欢迎来到Stack Overflow.请总结一下你答案中的链接; 这样,如果链接过时,答案将不会完全无用. (2认同)
  • 这似乎是人们推荐的,或者对于所有浏览器,history.js。(实际上我最终做了一些更简单的事情,如果发生更改,我只需重新加载页面,并使用哈希跟踪更改) (2认同)