【问题标题】:Preventing scroll to top in href="#" links防止在 href="#" 链接中滚动到顶部
【发布时间】:2021-05-06 00:59:51
【问题描述】:

我正在为页面编写一个插件,以防止<a href="#"> 在单击时滚动到顶部。

我知道href="#!"href="javascript:void(0);" 和在点击事件期间event.preventDefault() 都是解决方案。

由于页面是动态的,我正在考虑“吸收”所有点击或使用MutationObserver。目前我已经实现了第一个解决方案(下面的代码)。

我想知道是否有人可以帮助突出每个解决方案的优缺点以帮助我做出决定(或者是否有更好的解决方案/改进我的代码)。我关心的是每个解决方案如何随着页面变得更加动态/拥有更多节点而扩展。

我觉得像我所做的那样为整个文档添加点击事件应该是最好的?

document.body.addEventListener('click', function() {
  var hash = false
  for (const el of event.composedPath()) {
    switch (el.hash) {
      case "":
        hash = true
      case undefined:
        continue
    }
    hash = false
    break
  }
  if (hash) event.preventDefault()
})

为了提供一些背景信息,这是一个 html5 游戏,在最繁忙的时候,文档中可能有 10000+ <a> 标签,并且可能一次添加/减去数千个标签。我不希望用户在每次点击或页面因我的插件而发生变化时出现明显的延迟。

【问题讨论】:

  • 在我看来,您可以简化代码以不包含任何 for 循环等。href = e.target.getAttribute("href"); if (href !== null && href[0] == "#") event.preventDefault()
  • 目标不一定是a标签本身
  • 这就是!== null 存在的原因,它涵盖了href 不存在的情况
  • 见下面的答案。如果目标的父级是<a href="#"> 标签,那么您的代码将错过它。

标签: javascript html href add-on


【解决方案1】:

您可以使用 Element.closest() 从被点击的元素向上遍历 DOM,并使用 href 属性中的特定值定位链接。

如果结果不是null,则使用Event.preventDefault() 取消锚点滚动

document.addEventListener('click', event => {
  const link = event.target.closest('a[href="#"]');

  if (link === null) {
    return;
  }

  event.preventDefault();
});

【讨论】:

  • 谢谢,这比我有的更好。只是想知道,为什么不if (link) event.preventDefault()
  • 这也行。我猜这只是风格问题。 :)
  • 刚刚意识到,在有多个 a 标签的情况下,我希望它只检查最接近的 'a' 标签(但这只是一个小的编辑)。建议修改
  • 您能否详细说明您对 multiple a tags 的含义?尽管您的编辑可能更适合您的需求,但它并不能回答您问题的标题; 防止在 href="#" 链接中滚动到顶部
  • 如果您点击了<a href="#"><a href="#some link"></a></a>,那么您的原始代码会阻止#some 链接打开?
猜你喜欢
  • 1970-01-01
  • 2020-02-11
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多