使用jQuery禁用/启用输入?

omg*_*omg 2216 javascript jquery html-input

$input.disabled = true;
Run Code Online (Sandbox Code Playgroud)

要么

$input.disabled = "disabled";
Run Code Online (Sandbox Code Playgroud)

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

gna*_*arf 3724

jQuery 1.6+

要更改disabled属性,您应该使用该.prop()功能.

$("input").prop('disabled', true);
$("input").prop('disabled', false);
Run Code Online (Sandbox Code Playgroud)

jQuery 1.5及以下版本

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

设置disabled属性.

$("input").attr('disabled','disabled');
Run Code Online (Sandbox Code Playgroud)

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

$("input").removeAttr('disabled');
Run Code Online (Sandbox Code Playgroud)

在任何版本的jQuery中

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

// assuming an event handler thus 'this'
this.disabled = true;
Run Code Online (Sandbox Code Playgroud)

使用.prop().attr()方法的优点是您可以为一堆选定项设置属性.


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

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

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

  • @CornelMasson`input,textarea,select,button`比使用`:input` - `:input`更好用作选择器是非常低效的,因为它必须选择`*`然后遍历每个元素并过滤tagname - 如果直接传递4个标记名选择器,它会更快.此外,`:input`不是标准的CSS选择器,因此`querySelectorAll`可能带来的任何性能提升都会丢失 (33认同)
  • 顺便说一句,请记住,如果要禁用所有表单输入控件 - 包括.复选框,无线电,textareas等 - 你必须选择`':input',而不仅仅是''input'.后者仅选择实际的<input>元素. (9认同)
  • .prop或.attr都不足以禁用锚元素; .prop甚至不会使'控制'变灰(.attr确实如此,但是href仍处于活动状态).您还必须添加一个调用preventDefault()的单击事件处理程序. (6认同)
  • 正如@ThomasDavidBaker指出的那样,使用`.removeProp("disabled")`会导致"属性被完全删除而不会再次添加"的问题,对于像Chrome这样的浏览器,如果它在某些类似的工作Firefox浏览器.我们在这里要小心.总是使用`.prop("disabled",false)` (4认同)
  • 这是否只是阻止用户访问它,还是实际上将其从Web请求中删除? (3认同)
  • 这个答案最有趣的部分是在同一行 JavaScript 中使用单引号和双引号 (2认同)

小智 56

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

$(document).on('event_name', '#your_id', function() {
    $(this).removeAttr('disabled');
});
Run Code Online (Sandbox Code Playgroud)

$(document).off('event_name', '#your_id', function() {
    $(this).attr('disabled','disabled');   
});
Run Code Online (Sandbox Code Playgroud)

  • 前者适用于在任何时候插入DOM的元素,后者仅适用于当时存在的元素. (23认同)
  • 的Jikes!为什么`$(document).on('event_name','#your_id',function(){...})`而不是'$('#your_id').on('event_name',function(){. ..})`.正如[jQuery .on()文档](http://api.jquery.com/on/)中所述,前者使用委托并侦听_all_`event_name`事件,这些事件冒泡到`document`并检查它们是否为匹配`#your_id`.后者专门监听'$('#your_id')`事件,并且可以更好地扩展. (12认同)
  • @crazymykl 正确,但您不应该添加页面上已存在 id 的元素。 (2认同)

小智 31

    // Disable #x
    $( "#x" ).prop( "disabled", true );
    // Enable #x
    $( "#x" ).prop( "disabled", false );
Run Code Online (Sandbox Code Playgroud)

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

  //To disable 
  $('.someElement').attr('disabled', 'disabled');
Run Code Online (Sandbox Code Playgroud)

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

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

// OR you can set attr to "" 
$('.someElement').attr('disabled', '');
Run Code Online (Sandbox Code Playgroud)

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


Saj*_*azy 13

$("input")[0].disabled = true;
Run Code Online (Sandbox Code Playgroud)

要么

$("input")[0].disabled = false;
Run Code Online (Sandbox Code Playgroud)

  • 当然,问题是jQuery,这是在简单的JavaScript中改变状态,但它的工作原理. (2认同)
  • 这会改变 JavaScript 中的状态,但它仍然使用 jQuery 选择器来获取第一个输入。 (2认同)
  • 但是我不认为我们在这里制作jquery的百科全书,如果答案可行,那很好 (2认同)

Abd*_*zad 13

像这样使用,

 $( "#id" ).prop( "disabled", true );

 $( "#id" ).prop( "disabled", false );
Run Code Online (Sandbox Code Playgroud)


Nic*_*rdu 8

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

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

$.prototype.disable = function () {
    $.each(this, function (index, el) {
        $(el).attr('disabled', 'disabled');
    });
}
Run Code Online (Sandbox Code Playgroud)

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

$(".myInputs").enable();
$("#otherInput").disable();
Run Code Online (Sandbox Code Playgroud)

  • 虽然包装功能很方便,但你应该使用`prop`和*not*`attr`和`disabled`属性才能正常工作(假设jQuery 1.6或更高版本). (3认同)
  • @TrueBlueAussie 使用 `attr` 的缺点是什么?我在一些项目中使用了上面的代码,据我记得它工作正常 (2认同)
  • 明显的例外是具有幕后属性的控件。最著名的是复选框的“checked”属性。使用“attr”不会给出相同的结果。 (2认同)

daV*_*aVe 6

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

$("input").prop('disabled', ! $("input").prop('disabled') );
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我的切换开关也有同样的东西;$("input").prop('disabled', function(i, v) { return !v; }); (2认同)

wil*_*der 5

使用它们的方法有很多,您可以启用/禁用任何元素

方法1

$("#txtName").attr("disabled", true);
Run Code Online (Sandbox Code Playgroud)

方法2

$("#txtName").attr("disabled", "disabled");
Run Code Online (Sandbox Code Playgroud)

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

$("#txtName").prop("disabled", "disabled");
Run Code Online (Sandbox Code Playgroud)

如果您希望启用任何元素,则只需做与禁用它相反的操作即可。但是,jQuery提供了另一种删除任何属性的方法。

方法1

$("#txtName").attr("disabled", false);
Run Code Online (Sandbox Code Playgroud)

方法2

$("#txtName").attr("disabled", "");
Run Code Online (Sandbox Code Playgroud)

方法3

$("#txtName").removeAttr("disabled");
Run Code Online (Sandbox Code Playgroud)

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