Переключить атрибут отключенного ввода с помощью jQuery

191

Вот мой код:

$("#product1 :checkbox").click(function(){
    $(this)
        .closest('tr') // Find the parent row.
            .find(":input[type='text']") // Find text elements in that row.
                .attr('disabled',false).toggleClass('disabled') // Enable them.
                .end() // Go back to the row.
            .siblings() // Get its siblings
                .find(":input[type='text']") // Find text elements in those rows.
                .attr('disabled',true).removeClass('disabled'); // Disable them.
});

Как мне переключиться .attr('disabled',false);?

Я не могу найти его в Google.

Томми Арнольд
источник
Любая причина, почему вы не можете использовать отключенное свойство поля? $("input").get(0).disabled = isFalse;// jsfiddle.net/uAfhj
Shanimal
Я нашел плагин DependsOn, который вам может пригодиться
Onshop

Ответы:

447
$('#el').prop('disabled', function(i, v) { return !v; });

.prop()Метод принимает два аргумента:

  • Имя свойства (отключено, проверено, выбрано) все, что имеет значение true или false
  • Значение свойства , может быть:
    • ( пусто ) - возвращает текущее значение.
    • boolean (true / false) - устанавливает значение свойства.
    • функция - выполняется для каждого найденного элемента, возвращаемое значение используется для установки свойства. Передано два аргумента; первый аргумент - индекс (0, 1, 2, увеличивается для каждого найденного элемента). Второй аргумент - это текущее значение элемента (true / false).

Так что в этом случае я использовал функцию, которая предоставила мне индекс (i) и текущее значение (v), затем я возвратил противоположное текущее значение, поэтому состояние свойства меняется на противоположное.

Arne
источник
2
Выраженный как (я полагаю) .prop () является правильным способом сделать это и был добавлен именно с целью установки таких вещей, как disabled = "disabled" + его элегантный
Morvael
5
Что есть iи v?
Мэтт Р
@MattR Я добавил краткое объяснение.
Арне
это отличный ответ!
LeBlaireau
6
Как обновление, это выглядит очень аккуратно, используя функции стрелок:$('#el').prop('disabled', (i, v) => !v);
igneosaur
101

Я думаю, чтобы получить полную сопоставимость браузера, disabledследует установить значение disabledили удалить!
Вот небольшой плагин, который я только что сделал:

(function($) {
    $.fn.toggleDisabled = function() {
        return this.each(function() {
            var $this = $(this);
            if ($this.attr('disabled')) $this.removeAttr('disabled');
            else $this.attr('disabled', 'disabled');
        });
    };
})(jQuery);

Пример ссылки .

РЕДАКТИРОВАТЬ: обновил пример ссылку / код для поддержания цепочки!
РЕДАКТИРОВАТЬ 2:
На основе комментария @lonesomeday, вот расширенная версия:

(function($) {
    $.fn.toggleDisabled = function(){
        return this.each(function(){
            this.disabled = !this.disabled;
        });
    };
})(jQuery);
ifaour
источник
28
Это может работать, но это будет медленно, потому что вы постоянно создаете новые объекты jQuery. $.fn.toggleDisabled = function(){ return this.each(function(){ this.disabled = !this.disabled; });}это все, что тебе нужно.
одинокий
@ lonesomeday: я собирался опубликовать это, но я склонен думать, что это неправильный способ установки / сброса disabledатрибута. Во всяком случае, если вы можете подтвердить, что это кросс-браузерное решение .. Я обновлю свой ответ.
ifaour
2
Для любого будущего гуглера это решение одинаково хорошо работает для атрибута «требуется».
skybondsor
propлучший метод с 1.6, как сказал Арне.
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
19
    $ ( '# Флажок'). Нажмите (функция () {
        $ ('# submit'). attr ('disabled',! $ (this) .attr ('флажок'));
    });

Присяжный Дмитрий
источник
2
Примечание: работает только ниже JQuery 1.6. Используйте .prop () вместо attr () в обоих случаях, чтобы вернуть логические значения. См. Api.jquery.com/prop
Мануэль Арвед Шмидт
5

Еще один простой вариант, который обновляется по щелчку флажка.

HTML:

<input type="checkbox" id="checkbox/>
<input disabled type="submit" id="item"/>

JQuery:

$('#checkbox').click(function() {
    if (this.checked) {
        $('#item').prop('disabled', false); // If checked enable item       
    } else {
        $('#item').prop('disabled', true); // If checked disable item                   
    }
});

В действии: ссылка

unequalsine
источник
7
Избавьтесь от ifблока с$('#item').prop('disabled', this.checked);
Наим
2

Некоторое время спустя, благодаря @arne, я создал похожую маленькую функцию для обработки, где ввод должен быть отключен, И скрыт, или включен, и показано:

function toggleInputState(el, on) {
  // 'on' = true(visible) or false(hidden)
  // If a field is to be shown, enable it; if hidden, disable it.
  // Disabling will prevent the field's value from being submitted
  $(el).prop('disabled', !on).toggle(on);
}

Затем объект jQuery (такой как $ ('input [name = "нечто"]')) просто переключается с помощью:

toggleInputState(myElement, myBoolean)
вечность
источник
1

Это довольно просто с синтаксисом обратного вызова attr:

$("#product1 :checkbox").click(function(){
  $(this)
   .closest('tr') // find the parent row
       .find(":input[type='text']") // find text elements in that row
           .attr('disabled',function(idx, oldAttr) {
               return !oldAttr; // invert disabled value
           })
           .toggleClass('disabled') // enable them
       .end() // go back to the row
       .siblings() // get its siblings
           .find(":input[type='text']") // find text elements in those rows
               .attr('disabled',function(idx, oldAttr) {
                   return !oldAttr; // invert disabled value
               })
               .removeClass('disabled'); // disable them
});
lonesomeday
источник