防止刷新时自动浏览器滚动

Tho*_*ggi 88 javascript browser

如果您转到页面a并滚动然后刷新页面将在您离开它的位置刷新.这很好,但是这也发生在网址中有锚位置的网页上.例如,如果您点击链接http://example.com/post/244#comment5并在环顾四周后刷新页面,则不会出现在锚点上并且页面会跳转.有没有办法用javascript来防止这种情况?所以无关紧要 - 你总是会导航到锚点.

jos*_*das 144

在Chrome上,即使您将scrollTop强制为0,它也会在第一次滚动事件后跳转.

你应该将滚动绑定到这个:

$(window).on('beforeunload', function() {
    $(window).scrollTop(0);
});
Run Code Online (Sandbox Code Playgroud)

因此浏览器被欺骗以相信它在刷新之前就开始了.

  • 对于非jQuery实现:`window.onbeforeunload = function(){window.scrollTo(0,0); }` (21认同)
  • 你为什么选择'beforeunload'事件而不是'卸载'.我的测试表明,最后一个允许避免跳转到顶部之前页面将被浏览器真正卸载. (5认同)
  • 工作得很完美! (3认同)
  • 如果你不想乱搞滚动,那么比接受的答案更有用. (3认同)
  • 这不是在Chrome 33中完成的工作.我的意思是在加载新页面之前它会滚动到顶部.但是,浏览器仍以某种方式记住先前的滚动位置,并执行相同的自动滚动到该位置. (2认同)

imo*_*mos 59

要禁用自动滚动恢复,只需将此标记添加到head部分.

<script>history.scrollRestoration = "manual"</script>
Run Code Online (Sandbox Code Playgroud)

它不支持IE.浏览器兼容性

  • 应该标记为正确答案anno 2018 (12认同)
  • 这在2019年应该是一个正确的答案。其他方法都无法100%起作用。 (3认同)
  • 可以确认这是最好的解决方案。此处的其他解决方案不适用于 Mobile Safari,并且可能会出现问题。这完美地工作。 (3认同)
  • 如果在IE / Edge中可用,这将是最佳答案。您可以投票将其在此处实施:https://wpdev.uservoice.com/forums/257854-microsoft-edge-developer/suggestions/17257562-implement-history-scrollrestoration (2认同)

Jan*_*ela 18

经过多次失败后,我终于成功了.anzo在这里是正确的,因为beforeunload当用户重新加载页面或点击链接时,使用会使页面跳转到顶部.这样unload做的明显方法也是如此.

$(window).on('unload', function() {
   $(window).scrollTop(0);
});
Run Code Online (Sandbox Code Playgroud)

Javascript方式(感谢ProfNandaa):

window.onunload = function(){ window.scrollTo(0,0); }
Run Code Online (Sandbox Code Playgroud)

编辑:16/07/2015

即使有unload事件,Firefox仍然存在跳转问题.

  • 这个解决方案比`beforeunload`解决方案要好得多,因为它可以防止在重新加载和锚点击时跳转到页面顶部. (3认同)

mrt*_*man 16

由于浏览器行为的变化,不再推荐使用此解决方案.看到其他答案.

基本上,如果使用锚点,我们绑定到窗口滚动事件.想法是第一个滚动事件必须属于浏览器完成的自动重新定位.发生这种情况时,我们会自行重新定位,然后删除绑定事件.这可以防止后续页面滚动加密系统.

$(document).ready(function() {
    if (window.location.hash) { 
        //bind to scroll function
        $(document).scroll( function() {
            var hash = window.location.hash
            var hashName = hash.substring(1, hash.length);
            var element;

            //if element has this id then scroll to it
            if ($(hash).length != 0) {
                element = $(hash);
            }
            //catch cases of links that use anchor name
            else if ($('a[name="' + hashName + '"]').length != 0)
            {
                //just use the first one in case there are multiples
                element = $('a[name="' + hashName + '"]:first');
            }

            //if we have a target then go to it
            if (element != undefined) {
                window.scrollTo(0, element.position().top);
            }
            //unbind the scroll event
            $(document).unbind("scroll");
        });
    }

});
Run Code Online (Sandbox Code Playgroud)