Увімкніть атрибут відключення введення за допомогою 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()Метод приймає два аргументи:

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

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


2
Оновлений як (я вважаю) .prop () - це правильний спосіб зробити це і був доданий саме з метою встановлення таких речей, як
invalid

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);

Приклад посилання .

EDIT: оновлено приклад посилання / коду для підтримки ланцюга!
EDIT 2:
На основі коментаря @lonesomeday, ось покращена версія:

(function($) {
    $.fn.toggleDisabled = function(){
        return this.each(function(){
            this.disabled = !this.disabled;
        });
    };
})(jQuery);

28
Це може працювати, але це буде повільно, оскільки ви постійно створюєте нові об’єкти jQuery. $.fn.toggleDisabled = function(){ return this.each(function(){ this.disabled = !this.disabled; });}це все, що вам потрібно.
самотній день

@lonesomeday: Я збирався опублікувати це, але я схиляюся до думки, що це неправильний спосіб встановити / зняти disabledатрибут. У будь-якому випадку, якщо ви зможете підтвердити, що це рішення для веб-переглядачів. Я оновлю свою відповідь.
ifaour

2
Для будь-яких майбутніх googlers це рішення однаково добре працює для атрибута 'must'.
небосхил

propкращий метод з 1.6, як сказав Арн.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功


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                   
    }
});

У дії: посилання


7
Позбавтеся від ifблоку за допомогою$('#item').prop('disabled', this.checked);
Naeem Sarfraz

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 = "something"]')) просто перемикається за допомогою:

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
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.