如果a标签的href属性中包含了一个#字符,我希望在用户点击时阻止页面跳转到顶部。因此,如果用户点击以下内容:
应该像正常行为一样工作。
<a href="#">Hello</a>
不应该发生任何事情。
然而:
<a href="#target">Lorem</a>
应该像正常行为一样工作。
在jQuery中,您可以轻松完成这项任务。
$('a[href="#"]').on('click', function(e) {
e.preventDefault();
});
如果禁止所有仅包含哈希的锚元素的默认行为,将会消除这些锚点跳转到页面顶部并滚动屏幕的情况。
使用纯JavaScript,假设支持 querySelector
和 addEventListener
,代码如下:
var anchors = document.querySelectorAll('a[href="#"]');
for ( var i=anchors.length; i--; ) {
anchors[i].addEventListener('click', fn, false);
}
function fn(event) {
event.preventDefault();
}
$(document).on('click', 'a[href="#"]', function(e) {
e.preventDefault();
});
直接使用DOM看起来会像这样
document.addEventListener('click', function(event) {
var clicked = event.target;
while ( clicked ) {
if (clicked.nodeName.toUpperCase() === 'A' &&
clicked.getAttribute('href') === '#') {
event.preventDefault();
break;
}
clicked = clicked.parentNode;
}
});
很显然,委托处理程序将捕获所有的点击,并进行一些检查以查看目标是否为锚点或在锚点内,其href只为#
。
除非DOM中有很多锚点,否则我认为这不会更有效率。
<a href="javascript:;">Hello</a>
<a href="javascript.void(0)">Hello</a>
#
值,什么使javascript:;
更像是一种黑客行为? - T.J. Crowder