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

如果转到页面a并滚动,则刷新页面将在您离开的位置刷新。 这很好,但是在url中有一个锚点的页面也会出现这种情况。 一个例子是,如果你点击链接http://example.com/post/244#comment5并刷新页面,看看你周围不会在锚点和页面跳转。 有没有什么办法来阻止这与JavaScript? 所以,无论如何,你总是会定位到锚点。

请注意,这似乎不再在Chrome中工作了。 何塞的答案似乎是目前最好的解决scheme。 我将完整保留这个答案作为参考。

基本上,如果使用锚点,我们绑定到Windows滚动事件。 这个想法是,第一个滚动事件必须属于由浏览器完成的自动重新定位。 发生这种情况时,我们自己重新定位,然后删除绑定的事件。 这可以防止后续的页面滚动出现在系统中。

 $(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"); }); } }); 

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

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

 $(window).on('beforeunload', function() { $(window).scrollTop(0); }); 

所以浏览器被欺骗,相信它是刷新前的开始。

最终失败的数量终于成功了。 anzo在这里是正确的,因为使用beforeunload会使用户重新加载页面或点击链接时页面跳转到顶部。 所以unload是明确的方式来做到这一点。

 $(window).on('unload', function() { $(window).scrollTop(0); }); 

Javascript方式(感谢ProfNandaa ):

 window.onunload = function(){ window.scrollTo(0,0); } 

编辑:16/07/2015

即使unload事件,Firefox的跳转问题仍然存在。

这是一个更一般的方法。 而不是试图阻止浏览器滚动(或跳到顶部,因为它看起来像),我只是恢复在页面上的以前的位置。 也就是说,我在localStorage中logging当前页面的y偏移量,并在页面加载后滚动到这个位置。

 function storePagePosition() { var page_y = window.pageYOffset; localStorage.setItem("page_y", page_y); } window.addEventListener("scroll", storePagePosition); var currentPageY; try { currentPageY = localStorage.getItem("page_y"); if (currentPageY === undefined) { localStorage.setItem("page_y") = 0; } window.scrollTo( 0, currentPageY ); } catch (e) { // no localStorage available } 

你应该能够。

Onload,检查window.location.hash是否有值。 如果是这样,请使用与哈希值匹配的ID来获取元素。 find元素的位置(recursion调用offsetTop / offsetLeft),然后将这些值传递给window.scrollTo(x, y)方法。

这应该滚动页面到所需的元素。

你可以在最后加一个#,这样页面就会加载到顶部。

适用于所有浏览器,手机和台式机,因为它非常简单。

 $(document).ready(function() { var url = window.location.href; console.log(url); if( url.indexOf('#') < 0 ) { window.location.replace(url + "#"); } else { window.location.replace(url); } 

});

//最后用#加载页面。

要禁用自动滚动恢复,只需将此标签添加到头部分。

 <script>history.scrollRestoration = "manual"</script> 

它不被IE支持。 浏览器兼容性