Отключить / включить ввод с помощью jQuery?

$input.disabled = true;

or

$input.disabled = "disabled";

Какой стандартный способ? И, наоборот, как включить отключенный ввод?


person omg    schedule 12.09.2009    source источник
comment
возможный дубликат Удалить отключенный атрибут с помощью JQuery?   -  person user2381114    schedule 29.04.2014
comment
Я нашел плагин DependsOn, который может оказаться вам полезным   -  person Onshop    schedule 04.07.2014


Ответы (19)


jQuery 1.6+

Чтобы изменить свойство disabled, вы должны использовать функцию .prop().

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

jQuery 1.5 и ниже

Функция .prop() не существует, но .attr() делает то же самое:

Установите отключенный атрибут.

$("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.

На самом деле, я сомневаюсь, что у этого метода много законных применений, логические свойства сделаны таким образом, что вы должны установить их в false вместо того, чтобы «удалять» их, как их «атрибутные» аналоги в 1.5.

person gnarf    schedule 12.09.2009
comment
В стороне, помните, что если вы хотите отключить ВСЕ элементы управления вводом формы, включая. флажки, радио, текстовые поля и т. д. - вы должны выбрать ':input', а не только 'input'. Последний выбирает только актуальные ‹input› элементы. - person Cornel Masson; 16.08.2012
comment
@CornelMasson input,textarea,select,button немного лучше использовать, чем :input - :input, поскольку селектор довольно неэффективен, потому что он должен выбирать *, затем перебирать каждый элемент и фильтровать по тэгу - если вы передадите 4 селектора тэгов напрямую, это НАМНОГО быстрее. Кроме того, :input не является стандартным селектором CSS, поэтому любой прирост производительности, который возможен с querySelectorAll, теряется. - person gnarf; 16.09.2012
comment
Это просто мешает пользователю получить к нему доступ или действительно удаляет его из веб-запроса? - person OneChillDude; 02.05.2013
comment
@ bwheeler96 Он делает и то, и другое. Отключенный элемент input не будет отправлен, и пользователь не сможет изменить его значение. - person nullability; 20.08.2013
comment
Также не забудьте использовать логические значения true / false, а не строки для включения / отключения свойств. - person dbrin; 09.05.2014
comment
Использование .removeProp("disabled") приводило к тому, что свойство полностью удалялось и не добавлялось снова, как указано @ThomasDavidBaker, в случае некоторых браузеров, таких как Chrome, тогда как в некоторых, таких как Firefox, он работал нормально. Здесь действительно следует быть осторожными. Вместо этого всегда используйте .prop("disabled",false) - person Sandeepan Nath; 25.06.2014
comment
Для отключения якорных элементов недостаточно ни .prop, ни .attr; .prop даже не выделит серым «control» (.attr делает, но href все еще активен). Вы также должны добавить обработчик событий щелчка, который вызывает preventDefault (). - person Jeff Lowery; 25.09.2014
comment
Поскольку IE8 и более ранние версии не поддерживают псевдокласс :disabled, вы должны использовать селектор [disabled=disabled] для стилизации отключенных объектов - это означает, что вы должны следовать приведенному ниже ответу geekbuntu, если вам нужна кроссбраузерная поддержка. По сути, несмотря на большое количество голосов, этот ответ неверен, и attr / removeAttr - правильный путь. - person Ola Tuvesson; 23.11.2014
comment
@JeffLowery Вы правы. Я должен использовать их оба, чтобы отключить элемент привязки. - person wings; 17.11.2016
comment
var o = $ (# elem); o.disabled = true; здесь не работает. Было бы неплохо, если бы это было, есть мысли? - person Henrik Erlandsson; 06.04.2018
comment
Самая забавная часть этого ответа - использование одинарных и двойных кавычек в одной строке JavaScript. - person quemeful; 26.09.2018
comment
Это немного связано с проблемой включения или отключения входа. Если вы используете это в собственном событии input .click, он будет работать, чтобы отключить, но тогда сам элемент input станет неактивным после его отключения. Рассмотрите возможность использования этого в контейнере для ввода, таком как div, span или даже li, если в форме стиля списка. - person Mike; 27.01.2019
comment
что нужно сделать для динамического добавления элементов.?! - person Jerry King; 07.05.2021

Просто ради новых соглашений &&, чтобы сделать его адаптируемым в будущем (если только что-то кардинально не изменится с ECMA6 (????):

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

а также

$(document).off('event_name', '#your_id', function() {
    $(this).attr('disabled','disabled');   
});
person geekbuntu    schedule 18.07.2012
comment
Джайки! Почему $(document).on('event_name', '#your_id', function() {...}) вместо $('#your_id').on('event_name', function() {...}). Как описано в документации jQuery .on (), первый использует делегирование и прослушивает все event_name события, которые всплывают до document и проверяют их на соответствие #your_id. Последний специально прислушивается только к $('#your_id') событиям, и это лучше масштабируется. - person Peter V. Mørch; 01.08.2013
comment
Первый работает для элементов, вставленных в DOM в любой момент, второй - только для существующих на данный момент. - person crazymykl; 10.10.2013
comment
@crazymykl Верно, но вам не следует добавлять элементы с идентификатором, уже присутствующим на вашей странице. - person SepehrM; 07.04.2016

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

Иногда вам нужно отключить / включить элемент формы, такой как ввод или текстовое поле. JQuery поможет вам легко сделать это, установив для атрибута disabled значение «disabled». Например:

  //To disable 
  $('.someElement').attr('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

person Harini Sekar    schedule 07.04.2014

Вы можете поместить это где-нибудь глобально в свой код:

$.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();
person Nicu Surdu    schedule 18.10.2014
comment
Хотя упаковка функциональности удобна, вы должны были использовать prop и не attr со свойством disabled для правильной работы (при условии jQuery 1.6 или выше). - person Gone Coding; 20.05.2015
comment
@TrueBlueAussie В чем обратная сторона использования attr? Я использую приведенный выше код в некоторых проектах и, насколько я помню, работает нормально. - person Nicu Surdu; 20.05.2015
comment
Очевидные исключения - это элементы управления со скрытыми за кулисами свойствами. Самым известным из них является свойство флажков checked. Использование attr не даст такого же результата. - person Gone Coding; 20.05.2015

Если вы просто хотите инвертировать текущее состояние (например, поведение кнопки-переключателя):

$("input").prop('disabled', ! $("input").prop('disabled') );
person daVe    schedule 12.09.2014
comment
спасибо, у меня то же самое для тумблера; $ (вход) .prop ('отключено', функция (я, v) {return! v;}); - person Floww; 30.04.2020

Есть много способов, с помощью которых вы можете включить / отключить любой элемент :

Подход 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.

person wild coder    schedule 02.08.2018

Обновление на 2018 год:

Теперь нет необходимости в jQuery, и прошло некоторое время с тех пор, как document.querySelector или document.querySelectorAll (для нескольких элементов) выполняют почти ту же работу, что и $, плюс более явные getElementById, getElementsByClassName, getElementsByTagName

Отключение одного поля класса "input-checkbox"

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

или несколько элементов

document.querySelectorAll('.input-checkbox').forEach(el => el.disabled = true);
person Pawel    schedule 11.02.2018
comment
вопрос конкретно касается jQuery ... но в равной степени ваше утверждение правильное, и стоит знать, что jQuery не нуждается в использовании для этого, когда больше есть несколько элементов. - person ADyson; 02.03.2018

Вы можете использовать метод 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>
person SPARTAN    schedule 02.08.2018

это работает для меня

$("#values:input").attr("disabled",true);
$("#values:input").attr("disabled",false);
person Siddhartha    schedule 22.02.2019

Запрещать:

$('input').attr('readonly', true); // Disable it.
$('input').addClass('text-muted'); // Gray it out with bootstrap.

Давать возможность:

$('input').attr('readonly', false); // Enable it.
$('input').removeClass('text-muted'); // Back to normal color with bootstrap.
person Tomer Ben David    schedule 21.09.2018

Отключить значение true для типа ввода:

В случае определенного типа ввода (Пример ввода типа текста)

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

Для всех типов ввода

$("input").attr('disabled', true);
person Hasib Kamal    schedule 19.12.2017
comment
Спасибо, это помогло мне определиться с именем входа. $("input[name=method]").prop('disabled', true); - person Harry Bosh; 24.04.2019

Используйте вот так,

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

 $( "#id" ).prop( "disabled", false );
person Abdus Salam Azad    schedule 31.10.2018

Я использовал ответ @gnarf и добавил его как функцию

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

Затем используйте это

$('#myElement').disable(true);
person Imants Volkovs    schedule 16.11.2017

2018, без JQuery (ES6)

Отключить все input:

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

Отключить input с помощью id="my-input"

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

Вопрос в том, с JQuery, это просто к сведению.

person rap-2-h    schedule 04.06.2018

Подход 4 (это расширение ответа дикого программиста)

txtName.disabled=1     // 0 for enable
<input id="txtName">

person Kamil Kiełczewski    schedule 09.01.2020

Альтернативный способ отключить поле ввода - использовать jQuery и css следующим образом:

jQuery("#inputFieldId").css({"pointer-events":"none"})

и для включения того же ввода код выглядит следующим образом:

jQuery("#inputFieldId").css({"pointer-events":""})
person mukhtar alam    schedule 02.03.2021

В jQuery Mobile:

Для отключения

$('#someselectElement').selectmenu().selectmenu('disable').selectmenu('refresh', true);
$('#someTextElement').textinput().textinput('disable');

Для включения

$('#someselectElement').selectmenu().selectmenu('enable').selectmenu('refresh', true);
$('#someTextElement').textinput('enable');
person Atif Hussain    schedule 14.06.2016

person    schedule
comment
Конечно, вопрос задан для jQuery, и это меняет состояние в простом JavaScript, но это работает. - person basic6; 21.10.2014
comment
Это изменяет состояние в JavaScript, но по-прежнему использует селектор jQuery для получения первого ввода. - person cjsimon; 02.05.2018
comment
Но я не думаю, что мы делаем здесь энциклопедию jquery, если ответ работает - хорошо - person Sajjad Shirazy; 02.05.2018

person    schedule
comment
Из очереди на рассмотрение: Прошу вас добавить дополнительный контекст к вашему ответу. Ответы, состоящие только из кода, трудно понять. Если вы добавите больше информации в свой пост, это поможет как спрашивающему, так и будущим читателям. - person RBT; 11.05.2017