Answers:
您需要防止发生click事件的默认操作(即,导航到链接目标)。
有两种方法可以做到这一点。
event.preventDefault()
调用.preventDefault()
传递给您的处理程序的事件对象的方法。如果您使用jQuery绑定处理程序,则该事件将是的实例,jQuery.Event
并且将是的jQuery版本.preventDefault()
。如果您addEventListener
用于绑定处理程序,它将是Event
和的原始DOM版本.preventDefault()
。两种方式都可以满足您的需求。
例子:
$('#ma_link').click(function($e) {
$e.preventDefault();
doSomething();
});
document.getElementById('#ma_link').addEventListener('click', function (e) {
e.preventDefault();
doSomething();
})
return false;
从事件处理程序返回false将自动调用event.stopPropagation()和event.preventDefault()
因此,使用jQuery,您可以选择使用这种方法来防止默认链接行为:
$('#ma_link').click(function(e) {
doSomething();
return false;
});
如果您使用的是原始DOM事件,那么这也将在现代浏览器中起作用,因为HTML 5规范规定了这种行为。但是,该规范的较旧版本却没有,因此,如果需要与较旧浏览器的最大兼容性,则应.preventDefault()
显式调用。请参阅event.preventDefault()与返回false(无jQuery)以获取详细规范。
您可以将href设置为,#!
而不是#
例如,
<a href="#!">Link</a>
单击时不会进行任何滚动。
谨防!单击后仍会在浏览器的历史记录中添加一个条目,这意味着单击链接后,用户的后退按钮不会将其带到以前的页面。因此,最好使用这种.preventDefault()
方法,或者将两者结合使用。
这是一个小提琴,它对此进行了说明(只需将浏览器向下滚动直到获得滚动条):http :
//jsfiddle.net/9dEG7/
HTML5规范中的“ 导航到片段标识符”部分下指定了此行为。带有href的链接"#"
导致文档滚动到顶部的原因是,此行为已明确指定为处理空片段标识符的方式:
2.如果
fragid
为空字符串,则文档的指示部分为文档的顶部
使用href "#!"
代替而是仅因为避免了此规则而起作用。感叹号没有什么魔力-它只是一个方便的片段标识符,因为它与典型的脆弱标识符明显不同,并且不太可能匹配页面上的id
或name
元素。确实,我们可以将几乎所有内容都放在哈希后面;唯一不能满足要求的是空字符串,单词“ top”或与页面上元素匹配name
或id
属性的字符串。
更准确地说,我们只需要一个片段标识符,该标识符将使我们进入以下算法中的步骤8,从而从脆弱的对象中确定文档的指示部分:
将URL解析器算法应用于URL,并让fragid作为生成的已解析URL的片段组件。
如果
fragid
为空字符串,则文档的指示部分为文档的顶部;在此处停止算法。让
fragid bytes
百分号进行解码的结果fragid
。让
decoded fragid
是施加UTF-8解码器算法的结果fragid bytes
。如果UTF-8解码器发出解码器错误,请中止该解码器,然后跳转到标为的步骤no decoded fragid
。如果DOM中存在一个元素的ID完全等于
decoded fragid
,则树形顺序中的第一个此类元素是文档的指示部分;在此处停止算法。没有经过解码的脆弱:如果DOM中存在一个元素,其名称属性的值恰好等于
fragid
(notdecoded fragid
),则树形顺序中的第一个此类元素是文档的指示部分;在此处停止算法。如果fragid是字符串的ASCII不区分大小写的匹配项
top
,则文档的指示部分位于文档的顶部;在此处停止算法。否则,文档中没有指示的部分。
只要我们执行步骤8,并且文档中没有指示的部分,就会遵循以下规则:
如果没有指示的部分...,那么用户代理将不执行任何操作。
这就是为什么浏览器无法滚动的原因。
preventDefault()
在单击处理程序中使用的理想替代方法-遗憾的是。
一种简单的方法是利用此代码:
<a href="javascript:void(0);">Link Title</a>
这种方法不会强制刷新页面,因此滚动条保持在原位。而且,它允许您以编程方式更改onclick事件并使用jQuery处理客户端事件绑定。
由于这些原因,上述解决方案优于:
<a href="javascript:myClickHandler();">Link Title</a>
<a href="#" onclick="myClickHandler(); return false;">Link Title</a>
当且仅当myClickHandler方法不会失败时,最后一种解决方案才能避免出现滚动跳转问题。
如果您可以简单地更改该href
值,则应使用:
<a href="javascript:void(0);">Link Title</a>
我刚想出的另一种巧妙的解决方案是使用jQuery来阻止单击动作的发生并导致页面滚动,但仅限于href="#"
链接。
<script type="text/javascript">
/* Stop page jumping when links are pressed */
$('a[href="#"]').live("click", function(e) {
return false; // prevent default click action from happening!
e.preventDefault(); // same thing as above
});
</script>
return false
应该在preventDefault()
第二行之后,否则您将永远无法到达第二行?
<a onclick="yourfunction()">
这会很好。无需添加href =“#”
您可能要检查CSS。在这里的例子:https://css-tricks.com/the-checkbox-hack/有position: absolute; top: -9999px;
。在Chrome上尤其如此,因为onclick="whatever"
仍跳至clicked元素的绝对位置。
删除position: absolute; top: -9999px;
,display: none;
可能会有帮助。