【问题标题】:Prevent href="#" link from changing the URL hash防止 href=\"#\" 链接更改 URL 哈希
【发布时间】:2019-12-11 22:38:27
【问题描述】:

我有一个网站已经利用了 URL 中的哈希值,我不想改变它。当我使用 Zurb Foundation 并使用 href=\"#\" 作为菜单项时,单击它会删除以前的哈希值。

如何覆盖此行为?

更新:我认为保留元素会更好,因为当我更改它时,它会更改绑定到该 HTML 元素的样式。在与设计框架一起使用时,我总是更喜欢保持默认约定,而不是混淆覆盖的 css 属性。

谢谢。

  • 我只是关注 Zurb Foundation 文档,他们在菜单项链接中使用 href=\"#\"
  • 你可以把它留空,那仍然有效
  • 你能粘贴你的菜单html吗?什么都不做的菜单有什么意义?
  • 确实如此,它在每个 <a> 上都有 onclick 事件 - 我添加了它。
  • @user2587132 这是个好主意:效果很好!使用 href=\"\" 现在在我的测试中工作:不再更改 url 并且链接样式看起来正确..

标签: javascript html zurb-foundation


【解决方案1】:

您可以监听点击事件并调用preventDefault 来阻止浏览器设置哈希。

jQuery 示例:

$('.mylink').click(function(event){
    event.preventDefault();
});

【讨论】:

  • 你也可以return false,这是event.preventDefaultevent.stopPropagation的简写
【解决方案2】:

请阅读Progressive EnhancementUnobtrusive JavaScript

你应该(几乎)永远不会有href="#"。它是指向未定义锚点的链接(将是页面顶部)。使用它的人通常会这样做,因为他们想把 JavaScript 挂在上面。

如果你有一个链接,那么它应该指向一个有用的地方。通常,这将是另一个页面,它使用服务器端技术来获得与 JavaScript 相同的效果(尽管速度较慢)。然后,您可以阻止链接的正常行为。

例如:

<a href="/foo/bar" class="whatever">Foo: Bar</a>

使用脚本:

addEventListener('click', function (ev) {
    if (ev.target.classList.contains('whatever')) {
        ev.preventDefault();
        loadWithAjax(ev.target.href);
    }   
});

如果 JavaScript 做了一些无法在链接中表达的等效功能,那么您一开始就不应该使用链接。使用&lt;button&gt;,并认真考虑使用 JavaScript/DOM 而不是 HTML 将其添加到文档中。

(注意:很多人希望支持无法识别 classListaddEventListener checking browser support 的旧版浏览器,而查找兼容性例程留给读者作为练习。使用 YUI、jQuery 或类似方法是一种方法用于处理兼容性。)

【讨论】:

  • 谢谢。他们使用 <a> 作为样式。如果我删除它,它会改变样式,因此我更喜欢保留他们的代码约定 (foundation.zurb.com/docs/components/dropdown.html) 而不是使用 css
  • 并认真考虑使用 JavaScript/DOM 而不是 HTML 将其添加到文档中, 为什么?
  • 因此,如果 JS 加载失败,您不会得到一个不执行任何操作的 UI 控件。
  • 有时你必须使用&lt;a&gt;,比如Spectre CSS下拉列表中的菜单项,而没有href,光标不会变为pointer——我想你可以覆盖样式,但是天啊……
  • @user9645 — 查看您链接到的示例……这些是常规链接,href 属性包含有用的 URL。他们不应该使用href="#"(示例中的代码使用,但仅作为占位符),所以我的答案是成立的。
【解决方案3】:

您可以在 href 中使用 javascript:; 而不是在 href 中使用 #,这不会让 url 发生变化。

<a href="javascript:;">:Link</a>

【讨论】:

  • 而不是这样做,人们应该更喜欢使用按钮元素。
  • 正如我上面所说,我需要使用 <a> 因为基础有一个附加的样式,我更喜欢使用它们的样式和代码约定。 (foundation.zurb.com/docs/components/dropdown.html)
【解决方案4】:

而不是使用“#”使用“javascript:void(0)” 有关更多信息,请参阅此链接Which "href" value should I use for JavaScript links, "#" or "javascript:void(0)"?

【讨论】:

    【解决方案5】:

    只需使用这个:

    <a href="javascript:void()">text</a>
    

    【讨论】:

    • 有时你无法避免使用#target。例如,在使用 Foundation 组件(选项卡)时。
    【解决方案6】:

    我已执行以下操作以防止所有带有 href="#" 属性的标签执行导航(使用 JQuery):

    $('a[href$="#"]').click(function (event) {
                event.preventDefault ? event.preventDefault() : event.returnValue = false;
    
            });
    

    【讨论】:

    【解决方案7】:

    这对我有用。

    $(document).on('click', 'a', function (e) {
        if ($(this).attr('href') == '#') {
            e.preventDefault();
        }
    });
    

    【讨论】:

      【解决方案8】:

      在您的默认库中有以下代码。
      这将在单击事件上获取 href 值,如果找到哈希 (#) 值,则它将阻止默认事件,从而避免重定向到 href 值。

      $(document).on('click', 'a', function (e) {
          if ($('#'+e.target.id).attr('href')=='#') {
              e.preventDefault();
          }
      });
      

      【讨论】:

        【解决方案9】:

        最简单的方法是&lt;a href="#hash" onclick="event.preventDefault();"&gt;&lt;/a&gt;

        【讨论】:

          【解决方案10】:

          我的解决方案有点相同,使用 Javascript:

          -> 替换

          <a href=#foo class="ouvrir">Newsletter</a>
          

          经过:

          <a href="javascript://" class="ouvrir">Newsletter</a>
          

          和 Javascript:

          <script>
              $('.ouvrir').click(function(event){
                  window.location.href = "#foo";
                  history.pushState('', document.title, window.location.pathname);
              });
          </script>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-08-20
            • 2013-03-31
            • 2011-08-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-31
            • 1970-01-01
            相关资源
            最近更新 更多