【问题标题】:jQuery attr() not working on Bootstrap button after reset重置后 jQuery attr() 在引导按钮上不起作用
【发布时间】:2013-07-31 11:04:13
【问题描述】:

我有一个非常简单的代码不起作用,我不明白我缺少什么。

外部资源

<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>

HTML

<p>
    <button id="btn-id" class="btn btn-large btn-primary" type="button" data-loading-text="loading stuff...">Click Me</button>
</p>

JavaScript

$(document).ready(function () {
    $("#btn-id").button();

    $("#btn-id").click(function () {
        //$("#btn-id").attr("disabled",true);
        $(this).button('loading');

        setTimeout(function () {
            //this desn't work. The button resets but it doesn't get disabled afterwards
            $("#btn-id").button('reset').attr("disabled", true);

            //the bellow line works as expected
            //$("#btn-id").button('reset').addClass("btn-success");
        }, 2000);
    });
});

看来button('reset')之后,我可以addClass('someclass'),但我不能再禁用按钮了。

为什么这不起作用,我该如何解决?

jsFiddle

【问题讨论】:

标签: jquery twitter-bootstrap


【解决方案1】:

不确定这是否正确,但您可以使用解决方法

$(document).ready(function () {
    $("#btn-id").button();

    $("#btn-id").click(function () {
        $(this).button('loading');
        setTimeout(function () {
            $("#btn-id").addClass('btn-success').data('loading-text', 'OK').button('loading')
        }, 2000);
    });
});

FIDDLE

【讨论】:

  • 这是个好主意,而且很有效。只是在等待更多的想法。如果不是,我会将其标记为正确答案。
  • @AlexSutu 实际上你可以让它处于加载状态,你不需要在我的行尾使用.button('loading')。我刚刚看到了。加载状态已经是禁用状态所以问题不大
  • 你是对的。解决方法非常简单,但我为此浪费了几个小时。不知道为什么你不能在重置后重新添加禁用的属性。
【解决方案2】:

问题在于Button.prototype.setState()方法中使用的setTimeout:

https://github.com/twitter/bootstrap/blob/master/js/bootstrap-button.js#L46

这里有一个解决方法:

var $btn = $('.btn-save');
$btn.button('reset');
setTimetout(function() {
    $btn.attr('disabled', 'disabled'); // Disables the button correctly.
}, 0);

(小提琴:http://jsfiddle.net/f0t0n/BKXVA/


来源:https://github.com/twbs/bootstrap/issues/6242
归功于:https://github.com/f0t0n

【讨论】:

    【解决方案3】:

    您必须在禁用属性之上添加一个“禁用”类(它在引导程序 3 中的工作方式相同):

    $("#btn-id").addClass('btn-success').attr('disabled', 'disabled').addClass('disabled').html('OK');
    

    jsFiddle

    【讨论】:

      【解决方案4】:

      最好的解决方案是:

      $(document).ready(function () {
          $btn = $("#btn-id").button();
      
          $btn.click(function () {
              $(this).data('loading-text', 'Loading wait...');
              $(this).button('loading').delay(1000).queue(function() {
                  $(this).button('reset');
                  $(this).dequeue();
              });
          });
      
          // You can callback after completion, essential for those who need to add classes
          $('#reset-button').click(function () {
              $btn.button('reset');
              $btn.dequeue().delay(100).queue(function(){
                  console.log('Loading completed');
                  // This button
                  $(this).addClass('loading-completed');
      
                  // And very important for who callback function, examples:
                  /*
                  if (typeof callback === 'function') {
                      callback(this);
                  }
                  */
              });// enable button
          });
      
      });//ready 
      

      【讨论】:

        【解决方案5】:

        使用.prop() 而不是.attr()

        更新代码

        $(document).ready(function () {
            $("#btn-id").button();
            
            $("#btn-id").click(function () {
                $("#btn-id").prop("disabled",true);
                $(this).button('loading');
                
                setTimeout(function () {
                    //this desn't work. The button resets but it doesn't get disabled afterwards
                    $("#btn-id").button('reset').prop("disabled", true);
                    
                    //the bellow line works as expected
                    //$("#btn-id").button('reset').addClass("btn-success");
                }, 2000);
            });
        });
        

        jsFiddle demo

        【讨论】:

        • 感谢您的快速回答。使用 prop 而不是 attr 的结果相同。
        • 您提供的小提琴在重置后仍然没有禁用按钮。也许我做错了什么。
        【解决方案6】:

        不幸的是,here 提出的好的解决方案对我不起作用,所以我将其重写如下:

        function( element, status ) {        
            if ( status ) {
                element.removeClass( 'bs-disabled' );
            } else {
                element.addClass( 'bs-disabled' );
            }
        
            function setStatus() {
                if ( status ) {
                    element.removeProp( 'disabled' );
                } else {
                    element.prop( 'disabled', true );
                }
            };
        
            setTimeout( setStatus, 500 );
        }
        

        样式在哪里:

        .btn.bs-disabled {
            border: black 1px dotted;
            opacity: 0.1;
        }
        

        【讨论】:

          猜你喜欢
          • 2023-03-08
          • 1970-01-01
          • 1970-01-01
          • 2016-11-02
          • 2016-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-22
          相关资源
          最近更新 更多