题 使用jQuery禁用/启用输入?


$input.disabled = true;

要么

$input.disabled = "disabled";

哪种标准方式?而且,相反,如何启用禁用输入?


1913
2017-09-12 05:21


起源


可能重复 使用JQuery删除disabled属性? - user2381114
我找到了 依赖于取决于 你可能会发现有用的插件 - Ben


答案:


jQuery 1.6+

要改变 disabled 您应该使用的财产 .prop() 功能。

$("input").prop('disabled', true);
$("input").prop('disabled', false);

jQuery 1.5及以下版本

.prop() 功能不存在,但是 .attr() 类似的:

设置disabled属性。

$("input").attr('disabled','disabled');

要再次启用,请使用正确的方法 .removeAttr()

$("input").removeAttr('disabled');

在任何版本的jQuery中

你总是可以依赖实际的DOM对象,如果你只处理一个元素,它可能比其他两个选项快一点:

// assuming an event handler thus 'this'
this.disabled = true;

使用的好处 .prop() 要么 .attr() 方法是您可以为一堆选定项设置属性。


注意: 1.6中有一个 .removeProp() 听起来很像的方法 removeAttr(), 但它 不应该被使用 在本机属性上 'disabled'  摘自文档:

注意:请勿使用此方法删除本机属性,例如已选中,已禁用或已选中。这将完全删除属性,一旦删除,就不能再次添加到元素。使用.prop()将这些属性设置为false。

事实上,我怀疑这个方法有很多合法的用途,布尔道具是以这样的方式完成的,你应该将它们设置为假,而不是像1.5中的“属性”对应物一样“删除”它们。


3293
2017-09-12 05:23



顺便说一句,请记住,如果要禁用所有表单输入控件 - 包括。复选框,收音机,textareas等 - 你必须选择 ':input', 不只是 'input'。后者仅选择实际的<input>元素。 - Cornel Masson
@CornelMasson input,textarea,select,button 比使用更好一点 :input  - :input 作为一个选择器是非常低效的,因为它必须选择 * 然后循环遍历每个元素并按标记名过滤 - 如果直接传递4个标记名选择器,则速度要快得多。也, :input 不是标准的CSS选择器,因此可以获得任何性能提升 querySelectorAll 迷路了 - gnarf
这是否只是阻止用户访问它,还是实际将其从Web请求中删除? - OneChillDude
使用 .removeProp("disabled") 正如@ThomasDavidBaker指出的那样,导致“财产被彻底删除而不再被添加”的问题,对于像Chrome这样的浏览器,它在Firefox等一些浏览器上运行良好。我们在这里要小心。一直用 .prop("disabled",false) 代替 - Sandeepan Nath
.prop或.attr都不足以禁用锚元素; .prop甚至不会使'控制'变灰(.attr确实如此,但是href仍处于活动状态)。您还必须添加一个调用preventDefault()的单击事件处理程序。 - Jeff Lowery


只是为了新的约定&&使它适应未来(除非事情随着ECMA6(????)发生剧烈变化:

$(document).on('event_name', '#your_id', function() {
    $(this).removeAttr('disabled');
});

$(document).off('event_name', '#your_id', function() {
    $(this).attr('disabled','disabled');   
});

51
2017-07-18 11:51



的Jikes!为什么 $(document).on('event_name', '#your_id', function() {...}) 代替 $('#your_id').on('event_name', function() {...})。如中描述的那样 jQuery .on()文档 前者使用授权并听取 所有  event_name 冒泡的事件 document 并检查他们是否匹配 #your_id。后者专门听 $('#your_id') 只有事件和更好的扩展。 - Peter V. Mørch
前者适用于在任何时候插入DOM的元素,后者仅适用于当时存在的元素。 - crazymykl
@crazymykl正确但您不应添加页面上已存在ID的元素。 - SepehrM


    // Disable #x
    $( "#x" ).prop( "disabled", true );
    // Enable #x
    $( "#x" ).prop( "disabled", false );

有时您需要禁用/启用表单元素,如input或textarea。 Jquery通过将disabled属性设置为“disabled”来帮助您轻松完成此操作。 例如:

  //To disable 
  $('.someElement').attr('disabled', 'disabled');

要启用disabled元素,您需要从此元素中删除“disabled”属性或清空它的字符串。例如:

//To enable 
$('.someElement').removeAttr('disabled');

// OR you can set attr to "" 
$('.someElement').attr('disabled', '');

参考:http://garmoncheg.blogspot.fr/2011/07/how-to-disableenable-element-with.html


25
2018-04-07 10:27





$("input")[0].disabled = true;

要么

$("input")[0].disabled = false;

12
2017-09-06 14:53



当然,问题是jQuery,这是在简单的JavaScript中改变状态,但它的工作原理。 - basic6
这会改变JavaScript中的状态,但它仍然使用jQuery选择器来获取第一个输入。 - cjsimon
但我不认为我们在这里制作jquery百科全书,如果答案有效,那就好了 - Sajjad Shirazy
这是一个很好的答案,谢谢。 - Ali Karaca


你可以将它放在代码中的全局:

$.prototype.enable = function () {
    $.each(this, function (index, el) {
        $(el).removeAttr('disabled');
    });
}

$.prototype.disable = function () {
    $.each(this, function (index, el) {
        $(el).attr('disabled', 'disabled');
    });
}

然后你可以写下这样的东西:

$(".myInputs").enable();
$("#otherInput").disable();

7
2017-10-18 13:42



虽然包装功能很方便,但您应该使用它 prop 和 不  attr 随着 disabled 它正常工作的属性(假设jQuery 1.6或更高版本)。 - Gone Coding
@TrueBlueAussie使用的缺点是什么 attr?我在一些项目中使用上面的代码,据我记得它工作正常 - Nicolae Surdu
显而易见的例外是具有幕后属性的控件。最着名的是 checked 复选框的属性。运用 attr 不会给出相同的结果。 - Gone Coding
这个“$(”。myInputs“)。enable();”不适合我,但这个“$(el).removeAttr('禁用');”非常好,谢谢 - CrsCaballero


如果您只想反转当前状态(如切换按钮行为):

$("input").prop('disabled', ! $("input").prop('disabled') );

4
2017-09-12 16:28





2018年更新:

现在没有必要使用jQuery,从那以后就已经有一段时间了 document.querySelector  要么 document.querySelectorAll (对于多个元素)与$几乎完全相同的工作,加上更明确的工作 getElementByIdgetElementsByClassNamegetElementsByTagName

禁用“input-checkbox”类的一个字段

document.querySelector('.input-checkbox').disabled = true;

或多个元素

document.querySelectorAll('.input-checkbox').forEach(el => el.disabled = true);

2
2018-02-11 18:29



这个问题专门询问jQuery ...但同样你的陈述是正确的,值得知道jQuery没有 需要 当有多个元素时再用它。 - ADyson


您可以使用jQuery prop()方法使用jQuery动态禁用或启用表单元素或控件。 prop()方法需要jQuery 1.6及更高版本。

例:

<script type="text/javascript">
        $(document).ready(function(){
            $('form input[type="submit"]').prop("disabled", true);
            $(".agree").click(function(){
                if($(this).prop("checked") == true){
                    $('form input[type="submit"]').prop("disabled", false);
                }
                else if($(this).prop("checked") == false){
                    $('form input[type="submit"]').prop("disabled", true);
                }
            });
        });
    </script>

2
2017-08-02 10:26



生命保护......谢谢@SPARTAN - wild coder


使用它们有几种方法可以启用/禁用任何元素

方法1

$("#txtName").attr("disabled", true);

方法2

$("#txtName").attr("disabled", "disabled");

如果您使用的是jQuery 1.7或更高版本,则使用prop()而不是attr()。

$("#txtName").prop("disabled", "disabled");

如果你想启用任何元素,那么你只需要做与禁用它相反的操作。但是jQuery提供了另一种删除任何属性的方法。

方法1

$("#txtName").attr("disabled", false);

方法2

$("#txtName").attr("disabled", "");

方法3

$("#txtName").removeAttr("disabled");

同样,如果您使用的是jQuery 1.7或更高版本,则使用prop()而不是attr()。那是。这是使用jQuery启用或禁用任何元素的方法。


1
2017-08-02 10:59





我使用@gnarf回答并将其添加为函数

   $.fn.disabled = function (isDisabled) {
     if (isDisabled) {
       this.attr('disabled', 'disabled');
     } else {
       this.removeAttr('disabled');
     }
   };

然后像这样使用

$('#myElement').disable(true);

0
2017-11-16 10:24





2018年,没有JQuery(ES6)

禁用所有 input

[...document.querySelectorAll('input')].map(e => e.disabled = true);

禁用 input 同 id="my-input"

document.getElementById('my-input').disabled = true;

问题是  JQuery,这只是FYI。


0
2018-06-04 13:43