如何更新window.location.hash而不跳过文档?

我的网站上有一个滑动面板。

当它完成animation时,我像这样设置哈希

function() { window.location.hash = id; } 

(这是一个callback,并在之前分配的id )。

这很好,允许用户为面板添加书签,也可以让非JavaScript版本工作。

但是,当我更新哈希,浏览器跳转到该位置。 我猜这是预期的行为。

我的问题是:我怎么能防止这个? 即如何改变窗口的散列,但没有浏览器滚动的元素,如果散列存在? 某种event.preventDefault()的东西?

我正在使用jQuery 1.4和scrollTo插件 。

非常感谢!

更新

这是更改面板的代码。

 $('#something a').click(function(event) { event.preventDefault(); var link = $(this); var id = link[0].hash; $('#slider').scrollTo(id, 800, { onAfter: function() { link.parents('li').siblings().removeClass('active'); link.parent().addClass('active'); window.location.hash = id; } }); }); 

在现代浏览器上使用历史loggingAPI可以解决旧的问题,

 if(history.pushState) { history.pushState(null, null, '#myhash'); } else { location.hash = '#myhash'; } 

信贷来到Lea Verou

问题是你正在设置window.location.hash元素的ID属性。 无论您是否使用“preventDefault()”,浏览器都会跳转到该元素的预期行为。

解决这个问题的一种方法是用一个任意值作为前缀,如下所示:

 window.location.hash = 'panel-' + id.replace('#', ''); 

然后,您只需在页面加载时检查前缀哈希值。 作为一个额外的好处,你甚至可以顺利滚动到它,因为你现在控制散列值…

 $(function(){ var h = window.location.hash.replace('panel-', ''); if (h) { $('#slider').scrollTo(h, 800); } }); 

如果你需要在任何时候(而不仅仅是在最初的页面加载)工作,你可以使用一个函数来监视哈希值的变化,并跳转到正确的元素:

 var foundHash; setInterval(function() { var h = window.location.hash.replace('panel-', ''); if (h && h !== foundHash) { $('#slider').scrollTo(h, 800); foundHash = h; } }, 100); 

廉价和讨厌的解决scheme..使用丑##! 样式。

要设置它:

 window.location.hash = '#!' + id; 

阅读它:

 id = window.location.hash.replace(/^#!/, ''); 

由于它不匹配页面中的锚或id,因此不会跳转。

为什么不把当前的滚动位置,把它放在一个variables,然后分配哈希,并把页面回滚到原来的位置:

 var yScroll=document.body.scrollTop; window.location.hash = id; document.body.scrollTop=yScroll; 

这应该工作

我使用了现代浏览器的Attila Fulop(Lea Verou)解决scheme和旧浏览器的Gavin Brock解决scheme,如下所示:

 if (history.pushState) { // IE10, Firefox, Chrome, etc. window.history.pushState(null, null, '#' + id); } else { // IE9, IE8, etc window.location.hash = '#!' + id; } 

正如加文·布洛克(Gavin Brock)所观察到的那样,为了捕获身份证,你必须把string(在这种情况下可以有或不带“!”)如下处理:

 id = window.location.hash.replace(/^#!?/, ''); 

在此之前,我尝试了一个类似于user706270提出的解决scheme,但是它并不能很好地与Internet Explorer一起工作:因为它的Javascript引擎速度不是很快,您可以注意到滚动增加和减less,这产生了令人讨厌的视觉效果。

我不知道如果你可以改变原来的元素,但如何从使用id attr切换到其他类似data-id? 然后只要读取你的散列值的data-id的值,它就不会跳转。