【问题标题】:How do I disable a href link in JavaScript?如何在 JavaScript 中禁用 href 链接?
【发布时间】:2011-07-19 14:04:32
【问题描述】:

我有一个标签<a href="#"> Previous </a> 1 2 3 4 <a href="#"> Next </a>,在某些情况下我希望完全禁用这个标签。

来自 cmets 的代码(这是生成链接的方式)

if (n_index != n_pages) 
    a = a+'<li><a href="#" onclick="javascript:paginateAjaxPage('+(n_index+1) +','+stype+');">></a></li><li><a href="#" onclick="javascript:paginateAjaxPage('+n_pages+','+stype+');" >>></a></li>'; 
else 
    a = a+'<li><a style="cursor: pointer;" onclick="return false;">></a></li><li><a style="cursor: pointer;" onclick="return false" >>></a></li>'; 
a = a+'</ul></div>';

【问题讨论】:

标签: javascript html


【解决方案1】:

最简单的方法就是 element.style.pointerEvents = "none";

有人在上面提到了一些类似的东西,但不需要任何自定义 CSS - 只需直接在您的 JS 中设置样式属性,然后在/如果您想稍后重新启用它时返回“”。

【讨论】:

    【解决方案2】:

    使用以下所有三个:Event.preventDefault();Event.stopPropagation();return false;。每个解释...

    Event 接口的 preventDefault() 方法告诉用户代理,如果事件没有得到显式处理,则不应像通常那样采取其默认操作。 (来源:MDN Webdocs。)

    • Event.stopPropagation(); :阻止事件单击包含父级 DOM 中的链接(即,如果两个链接在 UI 中视觉上重叠)。

    Event 接口的 stopPropagation() 方法可防止在捕获和冒泡阶段进一步传播当前事件。 (来源:MDN Webdocs。)

    • return false; :向onevent 处理程序指示我们正在取消链接点击行为。

    处理程序的返回值确定事件是否被取消。 (来源:MDN Webdocs。)

    Full Working JSBin Demo.

    StackOverflow 演示...

    document.getElementById('my-link').addEventListener('click', function(e) {
      console.log('Click happened for: ' + e.target.id);
      e.preventDefault();
      e.stopPropagation();
      return false;
    });
    &lt;a href="https://www.wikipedia.com/" id="my-link" target="_blank"&gt;Link&lt;/a&gt;

    【讨论】:

      【解决方案3】:

      根据许多答案和我的经验,我的最佳解决方案是:

      <a href="javascript:">I am a useless link</a>
      

      一些选项及其注意事项

      <a href="#">I will make you page jump to top</a> 
      
      <a href="#" onclick="DoSomething(); return false;">I'll break others scripts events</a>
      
      <a href="javascript: openPage()" >Please... I should be an onclick event...</a>
      
      <a href="javascript:" onclick="openPage()" >Please...do I even need to be an anchor?</a>
      
      <script>element.removeAttribute("href") // some browsers will remove link style</script>
      
      <script>element.href = null // some browsers will remove link style</script>
      
      <style>
       a.my-off-class {
          pointer-events: none
       }
       /** I disable hover event too. And... Is this a style responsability?
      </style>
      

      【讨论】:

        【解决方案4】:

        0)你最好记住 如果您有链接和“#”href,某些浏览器会“跳转”。所以最好的方法是自定义 JavaScript

        1)如果你在自定义JavaScript之后,这里是:

        <a href="#" onclick="DoSomething(); return false;">Link</a>
        

        “return false”会阻止链接实际被关注。

        2)您可以考虑避免使用以下

        <a href="javascript:void(0);" onclick="DoSomething();">Link</a>
        

          <a href="javascript:;" onclick="DoSomething();">Link</a>
        

        因为 javascript 伪协议可以在某些浏览器中使页面进入等待状态,这可能会产生意想不到的后果。 IE6 以它而闻名。但是如果您不关心 IE6,并且您正在测试所有内容 - 这可能是一个很好的解决方案。

        3) 如果您的项目中已经有 jQuerybootstrap,您可以考虑使用它们,如下所示:

        $('.one-click').on("click", function (e) {
           $( this ).addClass('disabled');
        });
        

        .disabled 类来自引导程序。

        Qupte 表单引导站点 (here)

        链接功能警告

        .disabled 类使用pointer-events: none 尝试禁用 s 的链接功能,但该 CSS 属性尚未标准化。此外,即使在支持指针事件的浏览器中:无,键盘导航仍然不受影响,这意味着有视力的键盘用户和辅助技术用户仍然能够激活这些链接。所以为了安全起见,在这些链接上添加一个tabindex="-1" 属性(以防止它们接收键盘焦点)并使用custom JavaScript 禁用它们的功能。

        custom JavaScript 显示在 1

        部分

        【讨论】:

        • 有人需要把它作为答案,引导人这样做是有原因的。即使这是一个坏主意,它仍然是一个答案,并解释了为什么这个主意不好,答案是给人们带来好处。
        • 答案改进
        【解决方案5】:

        MDN 建议 element.removeAttribute(attrName); 在您想要禁用它时将其设置为 null(或其他值)。在这种情况下,它将是element.removeAttribute("href");

        https://developer.mozilla.org/en-US/docs/Web/API/Element/removeAttribute

        【讨论】:

        • 这是我见过的禁用&lt;a&gt; 元素的最佳答案。我一直在寻找一种渐进式增强方法,该方法使链接能够为关闭 javascript 的用户正常工作,但禁用链接并在 javascript 可用时增强它们。使用 unobtrusive javascript 时,删除属性(并可选择将值存储在 data-href 中)效果很好。
        【解决方案6】:
        (function ($) {
            $( window ).load(function() {
                $('.navbar a').unbind('click');
                $('.navbar a').click(function () {
                    //DO SOMETHING
                    return false;
                });
            });
        })(jQuery);
        

        我发现这种方式更容易实现。它的优点是你 js。不在您的 html 中,而是在不同的文件中。我认为没有解除绑定。这两个事件仍然活跃。不确定。但在某种程度上你只需要这个事件

        【讨论】:

        • unbind 有必要吗?我相信return falsee.preventDefault() 就足够了。
        • 请解释 OP 的代码有什么问题以及为什么通过编辑您的答案来解决问题。
        【解决方案7】:

        以下禁用链接的代码:

        <a href="javascript: void(0)">test disabled link</a> 
        

        另一个非常简单的解决方案是:

        <a href="#">test disabled link</a>
        

        第一个解决方案是有效的。

        【讨论】:

        • 请在发布前查看现有答案。这些选项已经被建议......两年多以前。最好不要恢复旧线程,除非响应对现有答案做出了重要的贡献。
        【解决方案8】:

        你也可以使用 void 代替:

        <a href="javascript:;">this link is disabled</a> 
        

        【讨论】:

          【解决方案9】:

          我也有类似的需求,但我的动机是防止链接被双击。我使用 jQuery 完成了它:

          $(document).ready(function() {
              $("#myLink").on('click', doSubmit);
          });
          
          var doSubmit = function() {
              $("#myLink").off('click');
              // do things here
          };
          

          HTML 如下所示:

          <a href='javascript: void(0);' id="myLink">click here</a>
          

          【讨论】:

            【解决方案10】:

            使用 jQuery 试试这个:

            $(function () {
                $('a.something').on("click", function (e) {
                    e.preventDefault();
                });
            });
            

            【讨论】:

              【解决方案11】:

              另一种禁用链接的方法

              element.removeAttribute('href');
              

              没有 href 的锚标记将作为禁用/纯文本反应

              <a> w/o href </a>
              

              而不是&lt;a href="#"&gt; with href &lt;/a&gt;

              jsFiddel

              希望这是有益的。

              【讨论】:

                【解决方案12】:

                您可以使用此样式类停用页面中的所有链接:

                a {
                    pointer-events:none;
                }
                

                当然,诀窍是仅在需要时停用链接,这是如何做到的:

                使用一个空的 A 类,像这样:

                a {}
                

                然后,当您想停用链接时,请执行以下操作:

                    GetStyleClass('a').pointerEvents = "none"
                
                    function GetStyleClass(className)
                    {
                       for (var i=0; i< document.styleSheets.length; i++) {
                          var styleSheet = document.styleSheets[i]
                
                          var rules = styleSheet.cssRules || styleSheet.rules
                
                          for (var j=0; j<rules.length; j++) {
                             var rule = rules[j]
                
                             if (rule.selectorText === className) {
                                return(rule.style)
                             }
                          }
                       }
                
                       return 0
                    }
                

                注意:CSS 规则名称在某些浏览器中会转换为小写,并且此代码区分大小写,因此最好使用小写的类名

                重新激活链接:

                GetStyleClass('a').pointerEvents = ""
                

                查看此页面http://caniuse.com/pointer-events 了解有关浏览器兼容性的信息

                我认为这是最好的方法,但遗憾的是 IE 像往常一样不允许这样做:) 无论如何我都会发布这个,因为我认为这包含可能有用的信息,并且因为某些项目使用已知的浏览器,例如当您在移动设备上使用网络视图时。

                如果您只想停用一个链接(我只意识到这是问题所在),我会使用一个函数来手动设置当前页面的 url,或者不根据该条件设置。 (就像你接受的解决方案)

                这个问题比我想象的要容易得多:)

                【讨论】:

                • 必须感谢 pointer-events:none; 我从来不知道那个标签,非常方便!
                • 这太棒了,但值得注意的是,IE 11 之前的版本不支持指针事件。caniuse.com/#feat=pointer-events
                • 我在此页面上通过编辑全局样式进行了尝试,但后来我无法为您投票 :)
                • 太棒了!在没有 jquery 的情况下很难找到一种方法。
                • 我比其他人更喜欢 css 答案,因为它不需要改变链接的 href,在我的情况下,它是动态的。
                【解决方案13】:
                anchor.href = null;
                

                【讨论】:

                • chrome 现在尝试导航到此答案的名为 null 的页面
                【解决方案14】:

                因此,上述解决方案使链接不起作用,但不要使其可见(AFAICT)链接不再有效。我遇到了一种情况,我有一系列页面并且想要禁用(并使其明显被禁用)指向当前页面的链接。

                所以:

                window.onload = function() {
                    var topics = document.getElementsByClassName("topics");
                    for (var i = topics.length-1; i > -1; i-- ) {
                        for (var j = topics[i].childNodes.length-1; j > -1; j--) {
                             if (topics[i].childNodes[j].nodeType == 1) {
                                if (topics[i].childNodes[j].firstChild.attributes[0].nodeValue == this.n_root3) {
                                    topics[i].childNodes[j].innerHTML = topics[i].childNodes[j].firstChild.innerHTML;
                                }
                            }
                        }
                    }
                }
                

                这会遍历链接列表,找到指向当前页面的链接(n_root3 可能是本地的东西,但我想document 必须有类似的东西),并用链接文本内容替换链接.

                HTH

                【讨论】:

                  【解决方案15】:

                  这也是可能的:

                  <a href="javascript:void(0)" onclick="myfunction()">
                  

                  链接不会去任何地方,你的函数将被执行。

                  【讨论】:

                  • 请查看现有答案
                  【解决方案16】:

                  禁用链接的最简单方法就是不显示它。每当您想测试是否满足您的条件时运行此函数以隐藏上一个按钮(将if (true) 替换为您的条件):

                  var testHideNav = function() {
                      var aTags = document.getElementsByTagName('a'),
                          atl = aTags.length,
                          i;
                  
                      for (i = 0; i < atl; i++) {
                          if (aTags[i].innerText == "Previous") {
                              if (true) { // your condition to disable previous
                                  aTags[i].style.visibility = "hidden";
                              } else {
                                  aTags[i].style.visibility = "visible";
                              }
                          } else if (aTags[i].innerText == "Next") {
                              if (false) { // your condition to disable next
                                  aTags[i].style.visibility = "hidden";
                              } else {
                                  aTags[i].style.visibility = "visible";
                              }
                          }
                      }
                  };
                  

                  然后在需要检查您的情况是否发生变化时运行testHideNav()

                  【讨论】:

                    【解决方案17】:

                    谢谢大家...

                    以下代码解决了我的问题:

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

                    【讨论】:

                    【解决方案18】:

                    为jquery安装这个插件并使用它

                    http://plugins.jquery.com/project/jqueryenabledisable

                    它允许您禁用/启用页面中几乎任何字段。

                    如果你想在某些情况下打开一个页面,编写一个 java 脚本函数并从 href 调用它。如果条件满足你打开页面,否则什么都不做。

                    代码如下:

                    <a href="javascript: openPage()" >Click here</a>
                    
                    and function:
                    function openPage()
                    {
                    if(some conditon)
                    opener.document.location = "http://www.google.com";
                    }
                    }
                    

                    您也可以将链接放在一个 div 中,并将 Style 属性的 display 属性设置为 none。这将隐藏 div。 例如,

                    <div id="divid" style="display:none">
                    <a href="Hiding Link" />
                    </div>
                    

                    这将隐藏链接。通过在 onclick 中调用此函数,使用按钮或图像使该 div 现在可见:

                    <a href="Visible Link" onclick="showDiv()">
                    
                    and write the js code as:
                    
                    function showDiv(){
                    document.getElememtById("divid").style.display="block";
                    }
                    

                    你也可以给html标签加一个id标签,这样就可以了

                    <a id="myATag" href="whatever"></a>
                    

                    并通过使用在您的 javascript 上获取此 id

                    document.getElementById("myATag").value="#"; 
                    

                    其中一个必须肯定有效,哈哈

                    【讨论】:

                      【解决方案19】:

                      你可以简单地给它一个空哈希:

                      anchor.href = "#";
                      

                      或者如果“禁用”还不够好,请使用事件处理程序:

                      anchor.href = "javascript:void(0)";
                      

                      【讨论】:

                      • # 不推荐,为什么?考虑到这一点,您的禁用链接出现在冗长页面的底部/页脚中,单击该链接会将您带到顶部,“javascript:;”够了
                      • #1 不会滚动回顶部
                      • @Bixi,如果稍后添加,它将滚动到 id 为 1 的元素。
                      • 嗯,很明显。知道永远不会创建 id=1。这只是一种可能的解决方法
                      • 如果您的 与当前页面不同,这将不起作用
                      【解决方案20】:

                      当你不希望用户点击重定向时试试这个

                      <a href="javascript: void(0)">I am a useless link</a>
                      

                      【讨论】:

                      • &lt;a href='javascript:;'&gt;I am a shorter useless link&lt;/a&gt; 怎么样?
                      • 甚至不需要分号。
                      • 你们 Web 开发人员放置了数百万个标签\t、换行符\n 和空格,只是为了看到代码折叠得很好(对于谁?浏览器),现在担心 7 个字节 void(0)和/或;,上帝啊。
                      • 我有点不同意上面的评论。有时事情需要描述性,而在其他情况下,需要更简单、更容易记住。我更喜欢“javascript:”。
                      • 在我看来 - Millions millions of tabs\t, line feeds\n and spaces - 是的,这使代码易于理解,而 void(0) 则不然。这就是为什么它应该被删除或必须尽可能短的原因。例如。这里更短 - 是为了理解(阅读)而不是为了“压缩”或字节经济。 :)
                      【解决方案21】:

                      改用 span 和 javascript onclick。如果您有链接和“#”href,某些浏览器会“跳转”。

                      【讨论】:

                      • 你能举个例子吗? 某些浏览器“跳转” 是真的.. :)
                      • 很高兴见到你,@ArupRakshit =) 接受的答案是 javascript: void(0);javascript:; 。如果您从 Rails 渲染,只需渲染一个跨度而不是您希望禁用它的位置。
                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-04-21
                      • 2014-03-13
                      • 1970-01-01
                      • 2010-11-27
                      • 2015-04-23
                      • 1970-01-01
                      相关资源
                      最近更新 更多