【问题标题】:Exception for hashchange function - browser history back?hashchange 函数的例外 - 浏览器历史记录回来了?
【发布时间】:2012-02-01 16:52:16
【问题描述】:

我什至不知道我应该如何称呼这个问题......这个问题的标题根本没有任何意义,我知道!

以下情况:我有一个单页布局,用户向下滚动。我有部分.layer,当在视口内时,应该将地址栏中的哈希更改为id。所以例如.layer#one 在视口内地址栏中的 url 看起来像这样 www.whatever.com/#!/one

$(window).scroll(function() {       
    hash = $('.layer:in-viewport').attr('id');
    top.location.hash = "!/" + hash;
});

这很好用,完全符合我的要求。我使用!/ 使用这种语法的原因是,如果我只是将位置设置为hash,则只有滚动行为会出现错误,因为浏览器会尝试坚持哈希位置。

现在的问题是,我希望能够使浏览器历史记录返回按钮正常工作! 使用 jQuery 附带的 hashchange 函数,这通常会相当简单……

$(window).bind( 'hashchange', function( event ) {
    //query the hash in the addressbar and jump to its position on the site
});

我遇到的唯一问题是,如果在滚动时更改哈希值,也会触发 hashchange 函数。所以它会再次跳转或停留在浏览器中的当前位置。知道如何解决这个问题吗?我可能可以在滚动时取消绑定 hashchange,对吧?但这是最好的解决方案吗?

【问题讨论】:

    标签: javascript jquery hash hashchange


    【解决方案1】:

    当然,只要哈希值在滚动时发生变化,您就可以解除绑定并重新绑定。例如:

    var old_hash;
    
    var scroller = function() {       
        hash = $('.layer:in-viewport').attr('id');
    
        if ( old_hash != hash ) {
          $(window).off('hashchange', GoToHash); // using jQuery 1.7+ - change to unbind for < 1.7
          top.location.hash = "!/" + hash;
    
          setTimeout(function() { // ensures this happens in the next event loop
            $(window).on('hashchange', GoToHash);
          }, 0);
    
          old_hash = hash;
        }
    }
    
    var GoToHash = function() {
      //query the hash in the addressbar and jump to its position on the site
    }
    
    $(window).scroll(scroller);
    

    【讨论】:

    • 嗯,谢谢你的这种方法。看起来真的很好,但我似乎无法让它工作。我将我的代码发布到了 jsfiddle,但该演示当然不能在 jsfiddle 网站上运行。 jsfiddle.net/JDpqs
    • 顺便说一句,如果你能负担得起使用 pushState/onpopstate,那就太好了。
    • 是的,我当然包括在内。我已经和我一起工作了。只是 hashchange 没有。如果我使用您的脚本,我会遇到与之前相同的问题,即滚动行为会被中断,因为随着哈希值的变化,函数会触发并且浏览器会尝试跳转到当前视口中的哈希值!
    • “如果你能负担得起使用 pushState/onpopstate”是什么意思?实际上并不知道它的存在。只是不知道这将如何工作。我当然会为这个项目使用新的 html5 技术!
    • 对不起,错字。修正了我的答案。否则,通过“负担”,我的意思是询问您是否需要支持不包含 pushState 支持的浏览器。如果没有,那就去吧!
    猜你喜欢
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 2011-11-14
    • 2013-05-21
    • 2011-02-04
    • 1970-01-01
    相关资源
    最近更新 更多