没有滚动或跳转的HTML锚链接
-
10-07-2019 - |
题
我有各种链接,它们都有唯一的ID,它们是<!> quot;伪锚。<!> quot;我希望它们影响url哈希值,并且点击魔法全部由一些mootools代码处理。但是,当我点击链接时,它们会自动滚动(或在一个案例中滚动到顶部)。我不想在任何地方滚动,但也需要我的javascript执行并在url更新中获得哈希值。
模拟示例代码:
<a href="#button1" id="button1">button 1</a>
<a href="#button2" id="button2">button 2</a>
<a href="#" id="reset">Home</a>
所以如果你点击<!>“按钮1 <!>”;链接,网址可以是 http://example.com/foo.php#button1
有没有人对此有任何想法?简单地使用一些javascript返回void会导致滚动,但也会杀死我的javascript(虽然我可以使用onclick来解决这个问题)但更重要的是,可以防止url中的哈希值发生变化。
解决方案
我可能错过了一些东西,但为什么不给它们不同的ID?
<a href="#button1" id="button-1">button 1</a>
<a href="#button2" id="button-2">button 2</a>
<a href="#" id="reset">Home</a>
或者你喜欢的任何惯例。
其他提示
锚链接的重点是将页面滚动到特定点。因此,如果您不希望发生这种情况,则需要附加onclick
处理程序并返回false。即使只是将其添加为属性也应该有效:
<a href="#button1" id="button1" onclick="return false">button 1</a>
上述效果的一面是URL本身不会改变,因为返回false将取消该事件。因此,既然您希望URL实际更改,您可以将window.location.hash
变量设置为您想要的值(这是您可以在不强制重新加载的情况下更改的URL的唯一属性)。你可以附加一个事件处理程序并调用像window.location.hash = this.id
这样的东西,虽然我不确定mootools如何处理事件。
(您还需要所有ID都是唯一的)
您可以使用以下代码来避免滚动:
<a href="javascript:void(0);">linktxt</a>
我找到了解决方案。在这里,我保存了一个旧的位置来调用href 滚动后恢复它
<script language="JavaScript" type="text/javascript">
<!--
function keepLocation(oldOffset) {
if (window.pageYOffset!= null){
st=oldOffset;
}
if (document.body.scrollWidth!= null){
st=oldOffset;
}
setTimeout('window.scrollTo(0,st)',10);
}
//-->
</script>
并在页面正文
<a href="#tab1" onclick="keepLocation(window.pageYOffset);" >Item</a>
感谢 sitepoint
此外,preventDefault
$(your-selector).click(function (event) {
event.preventDefault();
//rest of your code here
}
更简单的方法可能是将其添加为GET。也就是说,http://example.com/foo.php?q=#button1
而不是http://example.com/foo.php#button1
这对页面的显示方式没有任何影响(除非你想要它),并且大多数脚本语言已经有适当的工具来轻松(和安全地)读取数据。
在这里,我们在这个答案发布7年后,我发现了一种不同的方法使它工作:只需将window.location.hash指向一个不存在的锚!它不适用于<a>
s但在<div>
s中完美运行。
<div onclick="window.location.hash = '#NonExistentAnchor';">button 1</div>
在Chrome 56,Firefox 52和Edge(IE?)中运行良好。另一个好处是,这不会产生任何控制台错误或警告。
希望它能帮到我以外的人。