【问题标题】:preventDefault() on an <a> tag<a> 标签上的 preventDefault()
【发布时间】:2023-03-26 19:10:01
【问题描述】:

我有一些 HTML 和 jQuery 可以在单击链接时上下滑动 div 以显示或隐藏它:

<ul class="product-info">
  <li>
    <a href="#">YOU CLICK THIS TO SHOW/HIDE</a>
    <div class="toggle">
      <p>CONTENT TO SHOW/HIDE</p>
    </div>
  </li>
</ul>
$('div.toggle').hide();
$('ul.product-info li a').click(function(event){
  $(this).next('div').slideToggle(200);
}

我的问题是:如何使用preventDefault() 来阻止链接充当链接并在我的 URL 末尾添加“#”并跳转到页面顶部?

我不知道正确的语法,我只是不断收到错误提示

preventDefault() 不是函数。

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    Javascript中你可以使用它

    window.event.preventDefault();
    

    它适用于我的情况。将上述行写入您的函数中。

    【讨论】:

      【解决方案2】:

      1 - 简单的方法:

      <a href="javascript:;">Click Me</a>
      

      2 - 使用 void(0):

      <a href="javascript:void(0);">Click Me</a>
      

      3 - 使用preventDefault():

      <a href='#' onclick="event.preventDefault()">Click Me</a>
      

      4 - 使用 inline onclickIIFEeventpreventDefault() 在 Javascript 中执行此操作的另一种方法:

      <a href='#' onclick="(function(e){e.preventDefault();})(event)">Click Me</a>
      

      【讨论】:

      • 嗨,或者干脆&lt;a href='#' onclick="event.preventDefault()"&gt;Click Me&lt;/a&gt;
      • @ankabot 是的。我相信这是在其他一些答案中。我只是想以未提及的不同方式添加答案。还可以在 Javascript 中显示不同的做事方式。 (在 JS 中有无限的做事方式!)。最佳答案更易于阅读且更实用。这只是理论而不是实践:)
      【解决方案3】:

      经过几次操作,当页面最终应该转到&lt;a href"..."&gt;链接时,您可以执行以下操作:

      jQuery("a").click(function(e){
          var self = jQuery(this);
          var href = self.attr('href');
          e.preventDefault();
          // needed operations
      
          window.location = href;
      });
      

      【讨论】:

      • 为什么要preventDefault,然后自己做默认动作呢?只需执行您需要添加的内容,并让默认设置仍然生效。
      【解决方案4】:

      href属性设置为href="javascript:;"

      <ul class="product-info">
        <li>
         <a href="javascript:;">YOU CLICK THIS TO SHOW/HIDE</a>
        <div class="toggle">
          <p>CONTENT TO SHOW/HIDE</p>
        </div>
       </li>
      </ul>
      

      【讨论】:

      • 不错的锚点小宝石——谢谢!谁能描述一下为什么会这样?
      • @KLVTZ href 锚标签属性(a)可能不为空...但我们可以将其设置为javascript:&lt;code-here&gt;,即合法/有效。然后我们通过添加分号输入 &lt;code-here&gt; 只是一个空语句。这样链接什么都不做。
      • 非常感谢!这让我可以在 CalePHP 的面包屑中实现一个后退按钮功能(记住跨页面的 pushState() 设置的状态),例如 $this->Html->addCrumb('Sessions', 'javascript:window.history.back(); ');
      • 这是一个旧答案,但即使在那时仍然是不好的建议。使用 JavaScript 将事件处理程序附加到元素,而不是 HTML。并且不要滥用 HTML 使用带有 href 属性的锚元素(它应该将用户导航到其他地方)来启动行为(按钮的用途)。
      【解决方案5】:

      尝试类似:

      $('div.toggle').hide();
      $('ul.product-info li a').click(function(event) {
          event.preventDefault();
          $(this).next('div').slideToggle(200);
      });
      

      这是jQuery documentation中的相关页面

      【讨论】:

        【解决方案6】:

        建议不要使用return false,结果会出现3种情况:

        1. event.preventDefault();
        2. event.stopPropagation();
        3. 停止回调执行并在调用时立即返回。

        所以在这种情况下,你真的应该只使用event.preventDefault();

        Archive of article - jQuery Events: Stop (Mis)Using Return False

        【讨论】:

          【解决方案7】:

          您可以在事件调用中使用return false; 来停止事件传播,它的作用类似于event.preventDefault(); 否定它。或者您可以在 href 属性中使用 javascript:void(0) 来评估给定的表达式,然后将 undefined 返回给元素。

          在事件被调用时返回:

          <a href="" onclick="return false;"> ... </a>
          

          无效案例:

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

          您可以在以下位置查看更多信息:What's the effect of adding void(0) for href and 'return false' on click event listener of anchor tag?

          【讨论】:

            【解决方案8】:
            <ul class="product-info">
              <li>
                <a href="javascript:void(0);">YOU CLICK THIS TO SHOW/HIDE</a>
                  <div class="toggle">
                    <p>CONTENT TO SHOW/HIDE</p>
                  </div>
              </li>
            </ul>
            

            使用

            javascript:void(0);

            【讨论】:

            • @AhmadSharif 我今天在 FF 40.0.3 和 IE 11 上测试过,还有工作。
            • 我认为 void(0) 对用户来说可能很难看/令人困惑,当他们悬停链接时可以看到它。您实际上可以放置任何有效的 JS,所以我喜欢放置一个描述它的作用的注释。例如href="javascript:// Send Email"
            • 这是一个旧答案,但即使在那时仍然是不好的建议。使用 JavaScript 将事件处理程序附加到元素,而不是 HTML。并且不要通过使用具有href 属性的锚元素(应该将用户导航到其他地方)来启动行为(按钮的用途)来滥用 HTML。
            【解决方案9】:

            这是我刚刚测试过的非 JQuery 解决方案,它可以工作。

            <html lang="en">
            <head>
            <script type="text/javascript">
            addEventListener("load",function(){
                var links= document.getElementsByTagName("a");
                for (var i=0;i<links.length;i++){
                    links[i].addEventListener("click",function(e){
                    alert("NOPE!, I won't take you there haha");
                    //prevent event action
                    e.preventDefault();
                    })
                }
            }); 
            
            </script>
            </head>
            <body>
            <div>
            <ul>
                <li><a href="http://www.google.com">Google</a></li>
                <li><a href="http://www.facebook.com">Facebook</a></li>
                <p id="p1">Paragraph</p>
            </ul>
            </div>
            <p>By Jefrey Bulla</p>
            </body>
            </html>
            

            【讨论】:

              【解决方案10】:

              如果停止传播事件不会打扰您,只需使用

              return false;
              

              在处理程序的末尾。在 jQuery 中,它会阻止默认行为并停止事件冒泡。

              【讨论】:

                【解决方案11】:

                为什么不直接在 CSS 中做呢?

                去掉锚标签中的'href'属性

                <ul class="product-info">
                  <li>
                    <a>YOU CLICK THIS TO SHOW/HIDE</a>
                    <div class="toggle">
                      <p>CONTENT TO SHOW/HIDE</p>
                    </div>
                  </li>
                </ul>
                

                在你的 CSS 中,

                  a{
                    cursor: pointer;
                    }
                

                【讨论】:

                • 这种方式会在不良浏览器(即家庭)中失去:hover属性
                【解决方案12】:

                或者,您可以只从点击事件中返回 false:

                 $('div.toggle').hide();
                 $('ul.product-info li a').click(function(event){
                  $(this).next('div').slideToggle(200);
                + return false; 
                 });
                

                这将阻止触发 A-Href。

                但是请注意,出于可用性原因,在理想的世界中,对于想要在新标签中打开链接的人来说,href 应该仍然存在于某个地方;)

                【讨论】:

                • 是的,我想我是在回答我认为你的意图而不是问题:)
                • 对于它的价值,很多年前有人吹捧你应该返回 -1 以防止触发 href。我认为这不再适用于任何浏览器,您必须“返回 false”以防止页面跳转。
                猜你喜欢
                • 1970-01-01
                • 2012-03-28
                • 1970-01-01
                • 2012-09-14
                • 1970-01-01
                • 2023-01-03
                • 2019-12-10
                • 2012-11-03
                相关资源
                最近更新 更多