7

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

外部资源

<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

4

6 回答 6

2

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

$(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);
    });
});

小提琴

于 2013-07-31T11:19:21.003 回答
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

于 2014-07-06T05:16:38.747 回答
1

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

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

jsFiddle

于 2014-01-02T21:42:03.487 回答
1

最好的解决方案是:

$(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 
于 2018-07-31T12:13:59.950 回答
0

使用.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 演示

于 2013-07-31T11:06:22.223 回答
0

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

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;
}
于 2019-11-06T21:19:29.467 回答