Alihkan input atribut yang dinonaktifkan menggunakan jQuery


191

Ini kode saya:

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

Bagaimana cara beralih .attr('disabled',false);?

Sepertinya saya tidak dapat menemukannya di Google.


Ada alasan mengapa Anda tidak dapat menggunakan properti bidang yang dinonaktifkan? $("input").get(0).disabled = isFalse;// jsfiddle.net/uAfhj
Shanimal

Saya menemukan plugin DependsOn yang mungkin berguna bagi Anda
Onshop

Jawaban:


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

The .prop()Metode menerima dua argumen:

  • Nama properti (dinonaktifkan, dicentang, dipilih) apa pun yang benar atau salah
  • Nilai properti , dapat:
    • ( kosong ) - mengembalikan nilai saat ini.
    • boolean (true / false) - mengatur nilai properti.
    • function - Dieksekusi untuk setiap elemen yang ditemukan, nilai yang dikembalikan digunakan untuk mengatur properti. Ada dua argumen yang disampaikan; argumen pertama adalah indeks (0, 1, 2, meningkat untuk setiap elemen yang ditemukan). Argumen kedua adalah nilai elemen saat ini (benar / salah).

Jadi dalam hal ini, saya menggunakan fungsi yang memasok saya indeks (i) dan nilai saat ini (v), kemudian saya mengembalikan kebalikan dari nilai saat ini, sehingga keadaan properti terbalik.


2
Diputakhirkan sebagai (saya percaya) .prop () adalah cara yang tepat untuk melakukan ini dan ditambahkan dengan tepat untuk tujuan mengatur hal-hal seperti cacat = "dinonaktifkan" + anggunnya
Morvael

5
Apa idan v?
Matt R

@MattR Saya telah menambahkan penjelasan singkat.
Arne

ini jawaban yang bagus!
LeBlaireau

6
Sebagai pembaruan, ini terlihat sangat rapi menggunakan fungsi panah:$('#el').prop('disabled', (i, v) => !v);
igneosaur

101

Saya kira untuk mendapatkan komparabilitas browser lengkap disabledharus ditetapkan oleh nilai disabledatau dihapus!
Ini adalah plugin kecil yang baru saja saya buat:

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

Tautan contoh .

SUNTING: perbarui tautan / kode contoh untuk mempertahankan keterkaitan!
EDIT 2:
Berdasarkan komentar @lonesomeday, ini versi yang disempurnakan:

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

28
Ini mungkin berhasil, tetapi ini akan lambat, karena Anda terus-menerus membuat objek jQuery baru. $.fn.toggleDisabled = function(){ return this.each(function(){ this.disabled = !this.disabled; });}itu yang kamu butuhkan.
lonesomeday

@lonesomeday: Saya akan memposting ini tetapi saya cenderung berpikir bahwa ini bukan cara yang benar untuk mengatur / membatalkan set disabledatribut. Lagi pula, jika Anda dapat mengonfirmasi bahwa ini adalah solusi lintas-peramban..Saya akan memperbarui jawaban saya.
ifaour

2
Untuk googler di masa mendatang, solusi ini berfungsi sama baiknya untuk atribut 'wajib'.
skybondsor

propadalah metode yang lebih baik sejak 1.6 seperti yang dikatakan oleh Arne.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功


5

Opsi sederhana lain yang diperbarui pada klik kotak centang.

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

Dalam aksi: tautan


7
Singkirkan ifblok dengan$('#item').prop('disabled', this.checked);
Naeem Sarfraz

2

Beberapa saat kemudian, dan terima kasih kepada @arne, saya membuat fungsi kecil yang serupa ini untuk menangani di mana input harus dinonaktifkan DAN disembunyikan, atau diaktifkan DAN ditampilkan:

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

Kemudian objek jQuery (seperti $ ('input [name = "something"]')) hanya diaktifkan menggunakan:

toggleInputState(myElement, myBoolean)

1

Ini cukup sederhana dengan sintaks callback dari 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
});
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.