防止刷新时自动浏览器滚动
如果转到页面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支持。 浏览器兼容性