【问题标题】:JQuery & history.js back button not workingJQuery & history.js 后退按钮不起作用
【发布时间】:2012-06-21 20:41:30
【问题描述】:

我正在使用 history.JS(最新)和 Jquery(最新)来加载和替换网站的一部分,这一切正常,目前我只是想让它在现代浏览器中工作,所以我' m 不摆弄哈希更改。

似乎一切正常,但是当我单击浏览器(最新的 FF 和 Chrome)上的后退按钮时,页面并没有改变(尽管 url 和标题确实改变了)。我用谷歌搜索了一下这里,但我看不到发生了什么。

查看堆栈溢出时,我发现了这个页面:Restoring content when clicking back button with History.js 这似乎在问一个类似的问题。我已经将#left_col(被替换的div)的加载内容添加到状态数据中,但我不确定从那里去哪里,我知道当状态改变时我需要重新加载该数据,但我不知道怎么做。

var History = window.History; 
var origTitle = document.title;
if ( !History.enabled ) {
    return false;
}
    
History.Adapter.bind(window,'statechange',function(){ 
    var State = History.getState();     
    History.log(State.data, State.title, State.url);
});

$('.ajaxload').live("click", function() {
    History.pushState({state:1,leftcol:$('#left_col').html()}, origTitle, $(this).attr("href"));
    $('#left_col').load($(this).attr("rel"));
    return false;
});

非常感谢任何帮助!

更新:

我设法让页面在用户单击返回时更改,但它没有加载正确的状态(它似乎返回两种状态而不是一种),我添加到上述代码中的代码是:

window.addEventListener('popstate', function(event) {
    var State = History.getState(); 
    $('#left_col').html(State.data.leftcol);
});

【问题讨论】:

    标签: javascript jquery history.js


    【解决方案1】:

    事实证明,我需要使用 History.js 更新 statechange 页面,而不是我想的 poState。以下是我为可能遇到相同问题的任何人提供的完整(和工作)代码:

        var History = window.History;
        var origTitle = document.title;
    
        if ( !History.enabled ) { return false; }
        History.pushState({state:$(this).attr('data-state'),leftcol:$('#left_col').html()}, origTitle, $(this).attr("href"));           // save initial state to browser history
    
        function updateContent(data) {
            if(data == null) return;                    // check if null (can be triggered by Chrome on page load)
            $('#left_col').html(data);              // replace left col with new (or old from history) data
            History.pushState({state:$(this).attr('data-state'),leftcol:$('#left_col').html()}, origTitle, $(this).attr("href"));           // save this state to browser history
        }
    
        History.Adapter.bind(window,'statechange',function(){           // use this NOT popstate (history.JS)
            var State = History.getState();
            //History.log(State.data, State.title, State.url);
            updateContent(State.data.leftcol);                                          // call update content with data for left col from saved state
        });
    
        $('.ajaxload').live("click", function() {                                   // attach click event, get html and send it to updateContent
            $.get($(this).attr("rel"), updateContent);
            return false;
        });
    

    【讨论】:

    • 我发现了另一个问题。 1. 在主页 > 点击链接到页面 A 2. 在页面 A > F5 重新加载页面 > 点击返回 3. 它不会返回。你必须点击它两次。如何修复两次点击?
    • 嗨,我不确定。
    • 此答案已过时,请参阅github.com/browserstate/history.js/issues/47 以使用state.internal
    【解决方案2】:

    您说在状态更改时需要重新加载数据是正确的,因为您必须让 javascript 撤消所做的更改或从原始状态重新呈现内容。

    这可能更适合您的议程: https://github.com/thorsteinsson/jquery-routes

    编辑:

    您也可以考虑使用backbone.js (http://backbonejs.org/),因为它可以帮助您以一种更容易理解需要做什么的方式创建结构和抽象代码。

    Backbone 带有它自己的 url 路由器和所谓的视图。

    【讨论】:

    • 谢谢,我真的很想坚持使用 History.JS,因为一旦我将它完全用于现代浏览器,我想使用它来与旧浏览器兼容。我只是不明白需要使用什么事件或触发器将数据从旧状态加载回页面。
    • 我在现有网站上进行设置,基本上我的目标是通过换出图像和相关 cmets 在网站部分内的页面之间移动时节省较慢的页面加载。我不是在创建应用程序,也不是从头开始,所以我真的只是想修复现有的问题。
    • 我不认为兼容性是骨干网或 jquery-routes 的问题。如果您想坚持使用 History.js,那么您必须检查状态更改的 url,如果 url 与原始 url 相同,则撤消更改。
    • 是的,没错,这就是我想要做的,但我就是不知道该怎么做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多