【问题标题】:jQuery: Prevent jump on <a> tag if href only contains #jQuery:如果 href 仅包含 #,则防止在 <a> 标记上跳转
【发布时间】:2015-07-12 07:37:49
【问题描述】:

如果 a 标签在 href 中设置了哈希,我想防止它在点击时跳转到顶部。所以如果用户点击:

<a href="#">Hello</a>

什么都不应该发生。

但是:

<a href="#target">Lorem</a>

应该正常工作。

【问题讨论】:

  • 这里为什么需要链接?如果它什么都不做?
  • @AlexSikilinda 用于下拉菜单点击...

标签: jquery anchor


【解决方案1】:

在 jQuery 中你可以很容易地做到这一点

$('a[href="#"]').on('click', function(e) {
    e.preventDefault();
});

防止所有锚点上的默认操作仅使用哈希作为 href 将消除这些锚点滚动到页面顶部的问题

在纯 javascript 中假设支持 querySelectoraddEventListener,它看起来像

var anchors = document.querySelectorAll('a[href="#"]');

for ( var i=anchors.length; i--; ) {
    anchors[i].addEventListener('click', fn, false);
}

function fn(event) {
    event.preventDefault();
}

另一个选项是委托事件处理程序,如 cmets 中所述

$(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 中有很多锚点,否则我认为它不会更有效。

【讨论】:

  • 这将为每个匹配的元素添加一个处理程序。委托事件不是更好吗? #好奇
  • @Mackan 您应该发布一个答案演示如何使用单个处理程序。
  • @adeneo:根据我的经验,委托点击处理从来都不是性能问题。点击是用户操作,因此是相对于人类时间而非计算机时间来判断的。无论如何,点击都会冒泡,所以唯一额外的时间是循环检查我们是否关心点击,即使在最复杂的页面中,它也将是 - 什么 - 20、30 次迭代,最多? (每个父/子链接一次迭代,DOM 不会大量 深。)委托不一定是正确的答案,只是一个有用的替代方案,尤其是像 jQuery 这样的良好库支持。
  • @adeneo:正如我所说,委派不一定是正确的答案。 :-) 99% 的时间,除非动态添加和删除元素,否则我会使用直接处理程序,尽管随着我对委派越来越熟悉,我会做更多。使用 this 问题未举例说明的直接处理程序的一个原因是:假设我想处理点击并停止传播?使用委托处理程序,点击已经从元素传播到我正在处理它的地方,我所能做的就是阻止它走得更远。与以往一样,需要为特定工作选择合适的工具。
  • @adeneo:我没有回答你的问题,抱歉:是的,我遇到过直接处理程序是个问题,但很少 ,它与我上面没有提到的委托的其他用途有关:如果我们正在谈论 数千 个元素(例如,一张大桌子),委托确实有助于减少内存使用。再次,大概不是这里的用例,虽然我想 OP 没有告诉我们链接是什么......我对你的原始答案没有任何问题。 :-) 但如果可以感谢您的编辑,我会再次投票。
【解决方案2】:

使用“javascript:;”或“javascript.void(0)”:

<a href="javascript:;">Hello</a>
<a href="javascript.void(0)">Hello</a>

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 2014-08-12
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
相关资源
最近更新 更多