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.

Tommy Arnold
sumber
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.

Arne
sumber
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);
ifaour
sumber
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 郝海东 冠状 病 六四 事件 法轮功
19
    $ ('# checkbox'). klik (function () {
        $ ('# submit'). attr ('dinonaktifkan',! $ (ini) .attr ('dicentang'));
    });

Присяжный Дмитрий
sumber
2
Catatan: hanya berfungsi di bawah jQuery 1.6. Gunakan .prop () alih-alih attr () pada kedua kejadian untuk mendapatkan kembali nilai boolean. Lihat api.jquery.com/prop
Manuel Arwed Schmidt
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

tidak setara
sumber
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)
keabadian
sumber
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
});
lonesomeday
sumber