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


2291
$input.disabled = true;

или

$input.disabled = "disabled";

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



1
Я нашел плагин DependsOn, который вы могли бы найти полезным
— Onshop

Ответы:


3810

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()or .attr()заключается в том, что вы можете установить свойство для нескольких выбранных элементов.


Примечание: в 1.6 есть .removeProp()метод, который звучит очень похоже removeAttr(), но он НЕ ДОЛЖЕН ИСПОЛЬЗОВАТЬСЯ для нативных свойств, таких как 'disabled' Excerpt из документации:

Примечание. Не используйте этот метод для удаления собственных свойств, таких как отмеченные, отключенные или выбранные. Это полностью удалит свойство и после удаления не может быть снова добавлено к элементу. Используйте .prop (), чтобы вместо этих свойств установить false.

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


9
Кроме того, помните, что если вы хотите отключить ВСЕ элементы управления вводом формы - вкл. флажки, радио, текстовые и т. д. - вы должны выбрать ':input', а не только 'input'. Последний выбирает только актуальные элементы <input>.
— Корнел Массон

35
@CornelMasson input,textarea,select,buttonнемного лучше использовать, чем :input- :inputпоскольку селектор довольно неэффективен, потому что он должен *затем выбирать циклы по каждому элементу и фильтровать по тэгам - если вы передаете 4 селектора тэгов напрямую, это НАМНОГО быстрее. Кроме того, :inputон не является стандартным селектором CSS, поэтому возможное увеличение querySelectorAllпроизводительности потеряно
— gnarf

3
Это только мешает пользователю получить к нему доступ, или он фактически удаляет его из веб-запроса?
— OneChillDude

4
Использование .removeProp("disabled")было причиной проблемы «свойство полностью удалялось и не добавлялось снова», как указывалось @ThomasDavidBaker, в случае некоторых браузеров, таких как Chrome, тогда как на некоторых, как Firefox, оно работало нормально. Мы действительно должны быть осторожны здесь. Всегда используйте .prop("disabled",false)вместо этого
— Sandeepan Nath

6
Ни .prop, ни .attr не достаточно для отключения якорных элементов; .prop даже не выделит «контроль» серым цветом (.attr делает, но href все еще активен). Вы также должны добавить обработчик события щелчка, который вызывает предотвратительный вызов ().
— Джефф Лоури

61

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

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

а также

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

12
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

23
Первый работает для элементов, вставленных в DOM в любой момент, второй - только для тех, которые существуют в данный момент.
— crazymykl

1
@crazymykl Правильно, но вы не должны добавлять элементы с идентификатором, уже присутствующим на вашей странице.
— SepehrM

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

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

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


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

или

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

2
Конечно, вопрос задан для jQuery, и это меняет состояние в простом JavaScript, но это работает.
— basic6

1
Это изменяет состояние в JavaScript, но все еще использует селектор jQuery для получения первого ввода.
— cjsimon

3
Но я не думаю, что мы делаем энциклопедию jquery здесь, если ответ работает, это хорошо
— Саджад Ширази

8

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

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

3
Хотя упаковка функциональности удобно, вы должны были использовать propи не attr с disabledсобственностью для того , чтобы правильно работать (при условии , JQuery 1.6 или выше).
— Ушел кодирование

1
@TrueBlueAussie Каковы недостатки использования attr? Я использую приведенный выше код в некоторых проектах и, насколько я помню, он работает нормально
— Нику Сурду

1
Очевидными исключениями являются элементы управления со свойствами за сценой. Самым известным является checkedсвойство флажков. Использование attrне даст тот же результат.
— Ушел кодирование

7

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

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

1
спасибо, у меня есть то же самое для переключения; $ ("input"). prop ('disabled', function (i, v) {return! v;});
— Floww

5

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

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


2

Обновление для 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);

1
вопрос, в частности, задается о jQuery ... но в равной степени ваше утверждение верно, и стоит знать, что jQuery не нужно использовать для этого, когда больше элементов.
— ADyson

2

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

1

Отключить:

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

1

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

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

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

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

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

1
Спасибо, это помогло мне изолировать имя входа. $("input[name=method]").prop('disabled', true);
— Гарри Бош

1

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

$("#values:input").attr("disabled",true);
$("#values:input").attr("disabled",false);

0

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

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

Тогда используйте как это

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

0

2018, без JQuery (ES6)

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

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

Отключить inputсid="my-input"

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

Вопрос с JQuery, это просто FYI.




-1
<html>
<body>

Name: <input type="text" id="myText">



<button onclick="disable()">Disable Text field</button>
<button onclick="enable()">Enable Text field</button>

<script>
function disable() {
    document.getElementById("myText").disabled = true;
}
function enable() {
    document.getElementById("myText").disabled = false;
}
</script>

</body>
</html>

1
Из очереди отзывов : Могу ли я попросить вас добавить больше контекста вокруг вашего ответа. Ответы только на код трудно понять. Это поможет вам и будущим читателям, если вы сможете добавить больше информации в свой пост.
— RBT

-1

В jQuery Mobile:

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

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

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

$('#someselectElement').selectmenu().selectmenu('enable').selectmenu('refresh', true);
$('#someTextElement').textinput('enable');
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.