【问题标题】:How do you make an anchor link non-clickable or disabled?如何使锚链接不可点击或禁用?
【发布时间】:2011-12-01 01:53:18
【问题描述】:

我有一个锚链接,一旦用户点击它,我想禁用它。或者,从文本周围删除锚标记,但绝对保留文本。

<a href='' id='ThisLink'>some text</a>

我可以通过添加 .attr("disabled", "disabled"); 的按钮轻松完成此操作
我成功添加了 disabled 属性,但链接仍然可以点击。
我真的不在乎文本是否带下划线。

有什么线索吗?

当您点击错误的音乐家时,它应该只添加“错误”,然后变得无法点击。
当您点击并正确时,它应该添加“Awesome”,然后禁用所有&lt;a&gt;标签。

【问题讨论】:

  • 删除 href 部分并添加到您的 CSS 中:“cursor:pointer”,我假设您有 $('#ThisLink').click 或类似的东西?
  • $("#ThisLink").parent().find("a").remove();
  • 亚当,这个解决方案几乎可以工作。它虽然去掉了 a 标签中的所有文本。
  • How to disable HTML links的可能重复

标签: jquery


【解决方案1】:

当你想禁用点击时,最简洁的方法是添加一个带有 pointer-events:none 的类。它的功能就像一个普通的标签。

.disableClick{
    pointer-events: none;
}

【讨论】:

  • 使用这个想法,更简单的方法是使用 a[disabled] 作为 css 的选择器,这样您就不需要将 .disableClick 类添加到锚点
  • 要小心,因为您仍然可以使用指针事件禁用选项卡:无
  • 这个解决方案在现代浏览器中对我有好处。我有可用的锚标签,这些标签绑定到点击事件,并阻止在他们的进程做他们的事情时向他们发送垃圾邮件,我以编程方式添加它,然后在进程完成时将其删除。在我的情况下,标签到禁用的锚标签也不是问题,但可能是其他人。 YMMV
  • 使用pointer-events:none 也会禁用cursor、标题文本和其他鼠标悬停事件。
  • 将此与tabindex="-1" 配对似乎可以满足所有用例,但在 JavaScript 中生成的点击事件除外。
【解决方案2】:
<a href='javascript:void(0);'>some text</a>

【讨论】:

  • 请解释您的解决方案,以便未来访问此问题的人了解它如何解决手头的问题。
  • 发件人:MDN: The void Operator。当浏览器跟随javascript: URI 时,它会评估URI 中的代码,然后用返回值替换页面内容,除非返回值是undefinedvoid 运算符可用于返回 undefined。例如:&lt;a href="javascript:void(0);"&gt; Click here to do nothing &lt;/a&gt; 但是请注意,javascript: 伪协议不鼓励使用其他替代方案,例如不显眼的事件处理程序。
【解决方案3】:

使用 pointer-events CSS 样式。 (正如杰森麦克唐纳所建议的)

请参阅 MDN https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events。 大多数浏览器都支持它。

如果你有如下的全局 CSS 规则,简单地添加“禁用”属性到锚点就可以了:

a[disabled], a[disabled]:hover {
   pointer-events: none;
   color: #e1e1e1;
}

【讨论】:

  • +1 用于通过 [disabled] 属性而不是类添加样式。需要注意的是 pointer-events: none;但在 IE11 之前的版本中不起作用。
  • 所有 IE 都有自己的专有逻辑,默认禁用锚点、按钮甚至其他元素。非 IE 浏览器需要这种解决方法。
  • +1。这样我下次就不必再查找它了:所需的 javascript(使用 jQuery)将是 $("#elementid").attr("disabled", "disabled");。在 CSS 中包含 cursor: default 也可能会有所帮助(如 Muhammad Nasir 所建议的那样)。
  • A 元素没有 disabled 属性,将其用作选择器可能有效,也可能无效。
  • 直观 - 很好的解决方案。我惊讶地发现 &lt;a /&gt; 元素没有禁用属性 - 看起来很奇怪。
【解决方案4】:

我刚刚意识到您的要求(我希望)。这是一个丑陋的解决方案

var preventClick = false;

$('#ThisLink').click(function(e) {
    $(this)
       .css('cursor', 'default')
       .css('text-decoration', 'none')

    if (!preventClick) {
        $(this).html($(this).html() + ' lalala');
    }

    preventClick = true;

    return false;
});

【讨论】:

  • 这实际上可以真正解决问题,有点...代替.click,在主体上使用.on 并委托给'a[disabled]'。然后使用相同的选择器将 css 代码放入实际的 css 中。然后,防止点击就像 event.preventDefault() 一样简单并返回 false
  • 不同意,使用 CSS "pointer-events: none;"相反,就像其他答案一样。
【解决方案5】:
$('a').removeAttr('href')

$('a').click(function(){ return false})

视情况而定

【讨论】:

【解决方案6】:

Bootstrap 为我们提供了.disabled 类。请使用它。

.disabled 类仅在“a”标签已包含“btn”类时才有效。它不适用于任何旧的“a”标签。 btn 类在某些情况下可能不合适,因为它具有样式内涵。在幕后,.disabled 类将 pointer-events 设置为 none,因此您可以让 CSS 做与 Saroj Aryal 和 Vitrilo 建议的事情相同的事情。 (感谢 Les Nightingill 的建议)。

【讨论】:

  • .disabled 类仅在“a”标签已包含“btn”类时才有效。它不适用于任何旧的“a”标签。 'btn' 类在某些情况下可能不合适,因为它具有风格内涵。在幕后,.disabled 类将指针事件设置为无,因此您可以让 css 做与 Saroj Aryal 和 Vitrilo 所建议的相同的事情。
  • 感谢您的详细评论。它为许多用户澄清了很多。我可以使用您评论中的一些文字来扩展我的答案吗?
【解决方案7】:

添加一个css 类:

.disable_a_href{
    pointer-events: none;
}

添加这个jquery:

$("#ThisLink").addClass("disable_a_href"); 

【讨论】:

    【解决方案8】:

    只需从锚标记中删除href 属性即可。

    【讨论】:

    • 在某些浏览器中删除 href 只是将 href 设置为 / 或当前页面。
    • 我认为这应该是第一种方法
    【解决方案9】:

    最好的办法是阻止默认动作。对于锚标签,默认行为是重定向到href指定地址。

    所以下面的 javascript 在这种情况下效果最好:

    $('#ThisLink').click(function(e)
    {
        e.preventDefault();
    });
    

    【讨论】:

      【解决方案10】:

      您可以使用 onclick 事件来禁用点击操作:

      <a href='' id='ThisLink' onclick='return false'>some text</a>
      

      或者你可以只使用&lt;a&gt;标签以外的东西。

      【讨论】:

      • 您可以将其与text-decoration: none.disabledLink { color: #000 !important; } 结合使用,使其看起来像普通文本。
      • 突兀的 javascript 是一个糟糕的解决方案。
      【解决方案11】:

      Jason MacDonald cmets 为我工作,在 Chrome、Mozila 和 IE 中进行了测试。

      添加灰色以显示禁用效果。

      .disable_a_href{
          pointer-events: none;
          **color:#c0c0c0 !important;**
      }
      

      Jquery 只选择了锚列表中的第一个元素,添加了元字符 (*) 来选择和禁用 ID 为 #ThisLink 的所有元素。

      $("#ThisLink*").addClass("disable_a_href"); 
      

      【讨论】:

        【解决方案12】:

        只写一行 jQuery 代码

        $('.hyperlink').css('pointer-events','none');
        

        如果你想写在css文件中

        .hyperlink{
            pointer-events: none;
        }
        

        【讨论】:

          【解决方案13】:

          在样式表中创建以下类:

            .ThisLink{
                     pointer-events: none;
                     cursor: default;
              }
          

          将此类动态添加到您的链接中,如下所示。

           <a href='' id='elemID'>some text</a>
          
              //   or using jquery
          <script>
              $('#elemID').addClass('ThisLink');
           </script>
          

          【讨论】:

          • 这与 Jason MacDonald 的 answer 有何不同?
          【解决方案14】:

          这是我用来禁用的方法。希望对你有帮助。

          $("#ThisLink").attr("href","javascript:;");
          

          【讨论】:

          • 这是简单易行的解决方案,应该接受!
          【解决方案15】:

          试试这个:

          $('a').contents().unwrap();
          

          【讨论】:

          • 什么是锚包含对其程序至关重要的样式规则,这是一个无视 css 的修复
          【解决方案16】:

          只需在 SASS 中:

          .some_class{
               // styles...
          
               &.active {
                 pointer-events:none;
               }
          }
          

          【讨论】:

          • 虽然此代码可能会回答问题,但提供有关 why 和/或 如何 回答问题的额外上下文将显着改善其长期价值。请edit你的答案添加一些解释。
          【解决方案17】:

          永远不要信任浏览器,因为用户可以在服务器不知情的情况下以任何方式更改页面。

          如果一个链接只能工作一次,您需要做的第一件事是确保服务器端的点击只被接受一次(例如,使用一次性令牌指定为查询字符串),因为 href 属性中存在的 URL 可以被用户复制并插入到浏览器的导航栏中并多次运行。

          在 javascript 方面,您可以做的最安全的事情是用另一个标签完全替换 &lt;a&gt; 链接,保留内容:

          /** Replace element, preserving attributes and moving descendant nodes from the previous one.
           *
           * @param {HTMLElement} element Element to be replaced changing tag.
           * @param {String} new_tag New element tag.
           * @return {HTMLElement} New created element.
           */
          function rename_element_tag(element, new_tag) {
              let new_block = document.createElement(new_tag);
              for (let j = 0; j < element.attributes.length; ++j)
                  new_block.setAttribute(element.attributes[j].name, element.attributes[j].value);
          
              $(new_block).insertAfter(element);
              while (element.childNodes.length > 0)
                  new_block.appendChild(element.childNodes[0]);
          
              $(element).remove();
          
              return new_block;
          }
          

          此函数通过“修改”标签来替换传递的元素,并通过使用 vanilla javascript 而不是 jQuery 迭代所有子节点来保留属性和内容以处理文本节点。

          在您的情况下,您必须跳过 href 属性。

          【讨论】:

            【解决方案18】:
            $('#ThisLink').one('click',function(){
              $(this).bind('click',function(){
                return false;
              });
            });
            

            这将是另一种方法,带有return false 的处理程序将禁用链接,将在单击后添加。

            【讨论】:

              【解决方案19】:

              最简单的方法

              在您的 html 中:

              <a id="foo" disabled="true">xxxxx<a>
              

              在你的 js 中:

              $('#foo').attr("disabled", false);
              

              如果你把它当成属性使用就完美了

              【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-12-06
              • 2015-03-06
              • 1970-01-01
              • 2019-02-01
              • 1970-01-01
              • 2019-06-02
              • 1970-01-01
              • 2011-10-07
              相关资源
              最近更新 更多