【问题标题】:Disabled button still listens to click event禁用按钮仍然监听点击事件
【发布时间】:2016-09-03 17:37:20
【问题描述】:

我在进行一些 jquery 验证的表单中遇到问题。如果未填写特定输入字段,则应通过添加禁用属性来禁用“前进”按钮:

if errors
  $('.btn-move-forward').attr("disabled", true)

这可行,但我在该按钮上也有一个点击事件: (咖啡稿)

$('.btn-move-forward').click ->
  $('#step2, #step3').toggle()

我希望.btn-move-forward 在按钮被禁用时不会触发点击事件,但它会触发!!

首先:我不明白为什么,因为每个浏览器规范都定义不应该发生这种情况。无论如何,我尝试通过执行以下操作来绕过它:

$('.btn-move-forward').click ->
  if !$(this).is(:disabled)
    $('#step2, #step3').toggle()

或者这个

$('.btn-move-forward').click ->
  if $(this).prop("disabled", false)
    $('#step2, #step3').toggle()

或者像这样组合事件监听器:

$('.btn-move-forward').on 'click', '.btn-move-forward:enabled', ->
   $('#step2, #step3').toggle()

不,所有这些都无法正常工作。该按钮仍用作向前移动按钮。

我想要的只是按钮不听onclick,如果它被禁用。

【问题讨论】:

  • .btn-move-forward 元素是button 还是input type="button"?如果没有,那么 disabled 属性将不起作用。如果它是其中一种类型,那么您的代码应该可以工作:jsfiddle.net/pcokf7d8。您需要检查控制台是否有错误,并确保 disabled 属性按照您的预期应用。
  • 做到了@RoryMcCrossan!之前它是一个简单的 div 并使其成为一个按钮元素。如果你回复它,我会接受你的回答。
  • 谢谢,很高兴为您提供帮助。我为你添加了答案。

标签: javascript jquery coffeescript


【解决方案1】:

disabled 属性仅适用于表单元素。这意味着除非.btn-move-forward 元素是<button><input type="button">,否则disabled 属性将无效。

您可以在此处查看使用button 的工作示例:

$('.btn-move-forward').prop("disabled", true).click(function() {
  console.log('Moving forward...');
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<button class="btn-move-forward">Move forward</button>

【讨论】:

  • P.S:.prop() 最好用于设置disabledchecked 元素属性
  • True :) 更新了这个旧答案以包含一个 sn-p
  • 非常感谢!我刚刚发现自己将“按钮”输入错误为“btn”
【解决方案2】:

改为使用prop()

$('.btn-move-forward').prop("disabled", true)

【讨论】:

  • 但是,不重新启用只是做 .prop("disabled", false)
【解决方案3】:

请关闭点击事件

$('.btn-move-forward').off('click');

【讨论】:

    【解决方案4】:

    禁用:

    $('.btn-move-forward').prop("disabled", true);
    

    重新启用:

    $('.btn-move-forward').removeClass('disabled'); // do this also.
    $('.btn-move-forward').prop("disabled", false);
    

    【讨论】:

    • 这对链接(A 标记)没有帮助。
    【解决方案5】:

    我认为,禁用click 事件不是一个好主意。因为你必须再次启用click事件,如果你启用按钮。

    对于disabled button,我只是check disabled state,如果是disabled return


    HTML 按钮:

    <span class="btn btn-sm btn-primary btn-move-forward">Book</span>
    

    如何禁用按钮:

    $('.btn-move-forward').addClass('disabled');
    

    点击事件:

    $('.btn-move-forward').on('click', function(){
      if($(this).hasClass('disabled')) { 
        console.log('-- Button is disabled. Return from here. --');
        return false;
      }
    
      // write code for click event here
      $('#step2, #step3').toggle()
    });
    

    【讨论】:

    • $('.btn-move-forward').addClass('disabled');这为我做到了。我正在使用带有引导程序的剃刀表单,这是唯一真正禁用按钮的方法。
    【解决方案6】:

    使用指针事件:无;不需要点击事件的地方

    .btn[disabled]{pointer-events:none;}
    

    document.querySelectorAll(".btn").forEach(btn=>{
        btn.addEventListener("click", e=>{
          alert(e.target.innerText)
        })
    })
    .btn{
      display:inline-block;
      background: #3f51b5;
      color: #fff;
      box-shadow: 0 2px 2px 0 rgba(0,0,0,.14),
       0 3px 1px -2px rgba(0,0,0,.2),
       0 1px 5px 0 rgba(0,0,0,.12);
        border: none;
        border-radius: 2px;
        position: relative;
        height: 36px;
        margin: 10px;
        min-width: 64px;
        padding: 0 16px;
        display: inline-block;
        font-family: "Roboto","Helvetica","Arial",sans-serif;
        font-size: 14px;
        font-weight: 500;
        text-transform: uppercase;
        letter-spacing: 0;
        overflow: hidden;
        will-change: box-shadow;
        transition: box-shadow .2s cubic-bezier(.4,0,1,1),background-color .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1);
        outline: none;
        cursor: pointer;
        text-decoration: none;
        text-align: center;
        line-height: 36px;
        vertical-align: middle;   
    }
    
    .btn[disabled]{pointer-events:none; opacity:0.5}
    <div class="btn">Clickable button</div>
    <div class="btn">Clickable 2 button</div>
    <div class="btn">Clickable 3 button</div>
    <hr />
    <div class="btn" disabled>Disabled button</div>
    <div class="btn" disabled>Disabled 2 button</div>
    <div class="btn" disabled>Disabled 3 button</div>

    【讨论】:

      【解决方案7】:

      你可以试试类似的标签:onclick="return false"

      【讨论】:

        【解决方案8】:

        我迟到了太多年 :P 如果有人能从我的回答中得到帮助: HTML:

        <button type="button" id="verifyBtn" class="disabled" onClick="submitForm(this);"></button>
        

        JS:

        • 启用

          $j('#verifyBtn').addClass('disabled');

          $j('#verifyBtn').attr('disabled','disabled');

        • 禁用

          $j('#verifyBtn').removeClass('disabled');

          $j('#verifyBtn').removeAttr('disabled','disabled');

        【讨论】:

        • 不要你有这个倒置...启用和禁用swop。
        猜你喜欢
        • 2012-06-06
        • 2016-10-02
        • 2022-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-29
        • 2022-06-25
        • 2021-03-03
        相关资源
        最近更新 更多