【问题标题】:What is the easiest way to disable/enable buttons and links (jQuery + Bootstrap)禁用/启用按钮和链接的最简单方法是什么(jQuery + Bootstrap)
【发布时间】:2013-05-22 12:52:03
【问题描述】:

有时我使用样式为按钮的锚点,有时我只使用按钮。我想禁用特定的 clicky-things 以便:

  • 他们看起来很残疾
  • 它们不再被点击

我该怎么做?

【问题讨论】:

  • 在底部查看我的帖子,但这里描述性较差 $("yourSelector").button("enable"); //启用按钮或 $("yourSelector").button("disable"); //如果使用来自jqueryUI的按钮小部件,则禁用按钮。
  • BS3 文档说使用role="button" 链接,但这似乎不会影响这个问题。 getbootstrap.com/css/#buttons
  • a.btn[disabled] 显示为已禁用但仍可点击是 Bootstrap IMO 中的一个错误。属性 [disabled] 应该只对 buttoninput 显示为禁用。

标签: jquery html css twitter-bootstrap


【解决方案1】:

按钮

按钮很容易禁用,因为disabled 是一个由浏览器处理的按钮属性:

<input type="submit" class="btn" value="My Input Submit" disabled/>
<input type="button" class="btn" value="My Input Button" disabled/>
<button class="btn" disabled>My Button</button>

要使用自定义 jQuery 函数禁用这些,您只需使用 fn.extend()

// Disable function
jQuery.fn.extend({
    disable: function(state) {
        return this.each(function() {
            this.disabled = state;
        });
    }
});

// Disabled with:
$('input[type="submit"], input[type="button"], button').disable(true);

// Enabled with:
$('input[type="submit"], input[type="button"], button').disable(false);

JSFiddle disabled button and input demo.

否则你会使用 jQuery 的 prop() 方法:

$('button').prop('disabled', true);
$('button').prop('disabled', false);

锚标记

值得注意的是,disabled 不是用于锚标记的 valid property。因此,Bootstrap 在其 .btn 元素上使用以下样式:

.btn.disabled, .btn[disabled] {
    cursor: default;
    background-image: none;
    opacity: 0.65;
    filter: alpha(opacity=65);
    -webkit-box-shadow: none;
    -moz-box-shadow: none;
    box-shadow: none;
    color: #333;
    background-color: #E6E6E6;
}

注意[disabled] 属性和.disabled 类是如何定位的。 .disabled 类是使锚标记显示为禁用所需要的。

<a href="http://example.com" class="btn">My Link</a>

当然,这不会阻止链接在单击时起作用。以上链接将带我们到http://example.com。为了防止这种情况,我们可以添加一段简单的 jQuery 代码来定位锚标签,使用 disabled 类调用 event.preventDefault()

$('body').on('click', 'a.disabled', function(event) {
    event.preventDefault();
});

我们可以使用toggleClass() 切换disabled 类:

jQuery.fn.extend({
    disable: function(state) {
        return this.each(function() {
            var $this = $(this);
            $this.toggleClass('disabled', state);
        });
    }
});

// Disabled with:
$('a').disable(true);

// Enabled with:
$('a').disable(false);

JSFiddle disabled link demo.


结合

然后我们可以扩展前面的禁用函数来检查我们尝试使用is() 禁用的元素类型。这样,如果它不是inputbutton 元素,我们可以toggleClass(),如果是,则切换disabled 属性:

// Extended disable function
jQuery.fn.extend({
    disable: function(state) {
        return this.each(function() {
            var $this = $(this);
            if($this.is('input, button, textarea, select'))
              this.disabled = state;
            else
              $this.toggleClass('disabled', state);
        });
    }
});

// Disabled on all:
$('input, button, a').disable(true);

// Enabled on all:
$('input, button, a').disable(false);

Full combined JSFiddle demo.

值得注意的是,上述函数也适用于所有输入类型。

【讨论】:

  • 感谢您的全面回答。请参阅我的 Edit 1 以获取咖啡脚本版本。我仍在努力获取链接以防止点击。您的意思是让我将return false if $(@).prop('disabled') 保留在自定义点击处理程序中吗?没有那条线,这些处理程序无论如何都会运行。
  • @biofractal 正如我所提到的,disabled 不是有效的锚标记属性,因此不应使用。我给出的点击事件是基于.disabled 类,但你可以使用hasClass('disabled') - 如果是这样,preventDefault
  • 啊,好的。谢谢。那么我为什么不应该在锚上创建和使用disabled 属性。它是一个动态对象,所以我可以设置它并使用它,就像我扩展锚的功能集一样?我在下面更新了我的答案以显示这一点。你怎么看?是邪恶的吗?另外,当你重新启用一个链接时,你必须.off()preventDefault点击事件吗?
  • 它违反了规范并且不会通过验证测试。如果你想要一个自定义的disabled 属性,你可以使用data-* attributes。由于 Bootstrap 已经将相同的 disabled 属性样式应用于 class="disabled",因此您不妨改用该类。
  • 知道了 - 我已经调整了我的答案以反映您的 cmets。我仍然担心如果我将preventDefault 连接到所有锚点点击事件,那么在重新启用链接时我将需要分离它们。还是我误会了什么?
【解决方案2】:

我想不出更简单/更容易的方法! ;-)


使用锚标签(链接):

<a href="#delete-modal" class="btn btn-danger" id="delete">Delete</a>

启用锚标签:

 $('#delete').removeClass('disabled');
 $('#delete').attr("data-toggle", "modal");


要禁用 Anchor 标签:

 $('#delete').addClass('disabled');
 $('#delete').removeAttr('data-toggle');

【讨论】:

    【解决方案3】:

    假设您有文本字段和提交按钮,

    <input type="text" id="text-field" />
    <input type="submit" class="btn" value="Submit"/>
    

    禁用:

    要禁用任何按钮,例如提交按钮,您只需添加 disabled 属性为,

    $('input[type="submit"]').attr('disabled','disabled');
    

    执行上述行后,您的提交按钮 html 标记将如下所示:

    <input type="submit" class="btn" value="Submit" disabled/>
    

    请注意已添加“禁用”属性

    启用:

    用于启用按钮,例如当您在文本字段中有一些文本时。您需要删除 disable 属性以启用按钮,

     if ($('#text-field').val() != '') {
         $('input[type="submit"]').removeAttr('disabled');
     }
    

    现在上面的代码将删除'disabled'属性。

    【讨论】:

      【解决方案4】:

      我知道我迟到了,但要专门回答这两个问题:

      “我只想禁用特定的点击功能,以便:

      • 他们停止点击
      • 他们看起来很残疾

      这有多难?”

      他们停止点击

      1。对于&lt;button&gt;&lt;input type="button"&gt; 之类的按钮,请添加属性:disabled

      <button type="submit" disabled>Register</button>
      <input type="button" value="Register" disabled>
      

      2。对于链接,任何链接...实际上,任何 HTML 元素,您都可以使用 CSS3 指针事件

      .selector { pointer-events:none; }
      

      浏览器对指针事件的支持以当今最先进的技术(2014 年 5 月 12 日)来说非常棒。但是我们通常要支持IE领域的旧版浏览器,所以IE10及以下不支持指针事件:http://caniuse.com/pointer-events。因此,使用此处其他人提到的其中一种 JavaScript 解决方案可能是旧版浏览器的最佳选择。

      关于指针事件的更多信息:

      他们看起来很残疾

      显然这是一个 CSS 答案,所以:

      1。对于&lt;button&gt;&lt;input type="button"&gt; 等按钮,请使用[attribute] 选择器:

      button[disabled] { ... }
      
      input[type=button][disabled] { ... }
      

      --

      这是一个基本演示,其中包含我在此处提到的内容:http://jsfiddle.net/bXm5B/4/

      希望这会有所帮助。

      【讨论】:

        【解决方案5】:

        如果像我一样,你只是想禁用一个按钮,不要错过这个长线程中巧妙地隐藏的简单答案:

         $("#button").prop('disabled', true);
        

        【讨论】:

        • 真正的英雄,这就是我所需要的。
        【解决方案6】:

        @James Donnelly 提供了一个全面的答案,该答案依赖于使用新函数扩展 jQuery。这是一个好主意,所以我将调整他的代码,让它按照我需要的方式工作。

        扩展 jQuery

        $.fn.disable=-> setState $(@), true
        $.fn.enable =-> setState $(@), false
        $.fn.isDisabled =-> $(@).hasClass 'disabled'
        
        setState=($el, state) ->
            $el.each ->
                $(@).prop('disabled', state) if $(@).is 'button, input'
                if state then $(@).addClass('disabled') else $(@).removeClass('disabled')
        
            $('body').on('click', 'a.disabled', -> false)
        

        用法

        $('.btn-stateful').disable()
        $('#my-anchor').enable()
        

        代码将处理单个元素或元素列表。

        按钮和输入支持disabled 属性,如果设置为true,它们将看起来被禁用(感谢引导程序)并且在单击时不会触发。

        锚点不支持 disabled 属性,因此我们将依赖 .disabled 类使它们看起来被禁用(再次感谢引导程序)并连接一个默认单击事件,通过返回 false (不需要preventDefaulthere)。

        注意:重新启用锚点时,您不需要取消挂钩此事件。只需删除 .disabled 类就可以了。

        当然,如果您已将自定义单击处理程序附加到链接,这将无济于事,这在使用引导程序和 jQuery 时很常见。因此,为了解决这个问题,我们将使用 isDisabled() 扩展来测试 .disabled 类,如下所示:

        $('#my-anchor').click -> 
            return false if $(@).isDisabled()
            # do something useful
        

        我希望这有助于简化一些事情。

        【讨论】:

          【解决方案7】:

          请注意,如果您使用的是 Bootstrap 的 JS 按钮和“正在加载”状态,则会出现一个奇怪的问题。我不知道为什么会发生这种情况,但这里是如何解决它。

          假设您有一个按钮并将其设置为加载状态:

          var myButton = $('#myBootstrapButton');
          myButton.button('loading');
          

          现在您想将其从加载状态中移除,但也要禁用它(例如,该按钮是一个保存按钮,加载状态表示正在进行验证并且验证失败)。这看起来像是合理的 Bootstrap JS:

          myButton.button('reset').prop('disabled', true); // DOES NOT WORK
          

          不幸的是,这将重置按钮,但不会禁用它。显然,button() 执行了一些延迟的任务。因此,您还必须推迟禁用:

          myButton.button('reset');
          setTimeout(function() { myButton.prop('disabled', true); }, 0);
          

          有点烦人,但这是我经常使用的模式。

          【讨论】:

            【解决方案8】:

            所有人的回答和贡献都很好!我不得不稍微扩展这个功能以包括禁用选择元素:

            jQuery.fn.extend({
            disable: function (state) {
                return this.each(function () {
                    var $this = jQuery(this);
                    if ($this.is('input, button'))
                        this.disabled = state;
                    else if ($this.is('select') && state)
                        $this.attr('disabled', 'disabled');
                    else if ($this.is('select') && !state)
                        $this.removeAttr('disabled');
                    else
                        $this.toggleClass('disabled', state);
                });
            }});
            

            似乎对我有用。谢谢大家!

            【讨论】:

              【解决方案9】:

              对于这种行为,我总是使用 jQueryUI button 小部件,我将它用于链接和按钮。

              在 HTML 中定义标签:

              <button id="sampleButton">Sample Button</button>
              <a id="linkButton" href="yourHttpReferenceHere">Link Button</a>
              

              使用jQuery初始化按钮:

              $("#sampleButton").button();
              $("#linkButton").button();
              

              使用button 小部件方法来禁用/启用它们:

              $("#sampleButton").button("enable"); //enable the button
              $("#linkButton").button("disable"); //disable the button
              

              这将处理按钮和光标的行为,但如果您需要更深入并在禁用时更改按钮样式,请覆盖页面 CSS 样式文件中的以下 CSS 类。

              .ui-state-disabled,
              .ui-widget-content .ui-state-disabled,
              .ui-widget-header .ui-state-disabled {
                    background-color:aqua;
                    color:black;
               }
              

              但请记住:那些 CSS 类(如果已更改)也会更改其他小部件的样式。

              【讨论】:

              • 很确定这个答案适用于 jQuery UI buttonsnot 用于 Bootstrap buttons 与普通 jQuery 一起使用,后者是 OP 的内容使用。顺便说一句,在对该问题的评论中给出答案并不是传播的首选方法。 ;^)
              【解决方案10】:

              以下内容对我很有效:

              $("#button").attr('disabled', 'disabled');
              

              【讨论】:

                【解决方案11】:

                我知道我的回答迟了,但 IMO 这是切换按钮“启用”和按钮“禁用”的最简单方法

                function toggleButtonState(button){
                
                  //If button is enabled, -> Disable
                  if (button.disabled === false) {
                    button.disabled = true;
                
                  //If button is disabled, -> Enable
                  } else if (button.disabled === true) {
                    button.disabled = false;
                  }
                }
                

                【讨论】:

                  【解决方案12】:

                  这是一个相当晚的答案,但是我在寻找一种在单击后禁用 boostrap 按钮并可能添加一个不错的效果(例如微调器)的方法时偶然发现了这个问题。我找到了一个很棒的库,可以做到这一点:

                  http://msurguy.github.io/ladda-bootstrap/

                  您只需包含所需的 css 和 js,为您的按钮添加一些属性并使用 javascript 启用 lada... Presto !您的按钮有了新的生命(请查看演示,看看它有多漂亮)!

                  【讨论】:

                    【解决方案13】:

                    上面的这个不起作用,因为有时

                    $(this).attr('checked') == undefined
                    

                    调整你的代码

                    if(!$(this).attr('checked') || $(this).attr('checked') == false){
                    

                    【讨论】:

                      【解决方案14】:

                      假设您在页面上有这些按钮,例如:

                      <input type="submit" class="byBtn" disabled="disabled" value="Change"/>
                      <input type="submit" class="byBtn" disabled="disabled" value="Change"/>
                      <input type="submit" class="byBtn" disabled="disabled" value="Change"/>
                      <input type="submit" class="byBtn" disabled="disabled" value="Change"/>
                      <input type="submit" class="byBtn" disabled="disabled" value="Change"/>
                      <input type="submit"value="Enable All" onclick="change()"/>
                      

                      js代码:

                      function change(){
                         var toenable = document.querySelectorAll(".byBtn");        
                          for (var k in toenable){
                               toenable[k].removeAttribute("disabled");
                          }
                      }
                      

                      【讨论】:

                        【解决方案15】:

                        假设你有一个看起来像这样的当前启用。

                        <button id="btnSave" class="btn btn-info">Save</button>
                        

                        只需添加:

                        $("#btnSave").prop('disabled', true);
                        

                        你会得到这个将禁用按钮

                        <button id="btnSave" class="btn btn-primary" disabled>Save</button>
                        

                        【讨论】:

                        • 关于按钮 锚点的问题。 disabled 属性不是锚标记的有效属性。
                        【解决方案16】:

                        如果你想禁用可点击,你也可以在html中添加inline this

                        style="cursor: not-allowed;"
                        

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 2014-05-04
                          • 1970-01-01
                          • 2017-04-24
                          • 2012-02-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2016-04-13
                          相关资源
                          最近更新 更多