.prop ('diperiksa', salah) atau .removeAttr ('diperiksa')?

115

Dengan pengenalan metode prop, sekarang saya perlu mengetahui cara yang diterima untuk menghapus centang pada kotak centang. Apakah itu:

$('input').filter(':checkbox').removeAttr('checked');

atau

$('input').filter(':checkbox').prop('checked',false);
Phillip Senn
sumber
4
Sudahkah Anda membaca postingan John Resig? ejohn.org/blog/jquery-16-and-attr
Jared

Jawaban:

130

jQuery 3

Mulai jQuery 3, removeAttrtidak lagi menyetel properti terkait ke false:

Sebelum jQuery 3.0, menggunakan .removeAttr()pada atribut boolean seperti checked, selected, atau readonlyjuga akan mengatur bernama properti yang sesuai dengan false. Perilaku ini diperlukan untuk versi Internet Explorer kuno tetapi tidak benar untuk browser modern karena atribut mewakili nilai awal dan properti mewakili nilai saat ini (dinamis).

Hampir selalu merupakan kesalahan jika digunakan .removeAttr( "checked" )pada elemen DOM. Satu-satunya waktu yang mungkin berguna adalah jika DOM nanti akan diserialkan kembali ke string HTML. Dalam semua kasus lain, .prop( "checked", false )sebaiknya digunakan sebagai gantinya.

Changelog

Karenanya hanya .prop('checked',false)cara yang benar saat menggunakan versi ini.


Jawaban asli (dari 2011):

Untuk atribut yang memiliki properti boolean yang mendasari ( checkedsalah satunya), removeAttrotomatis menyetel properti yang mendasarinya ke false. (Perhatikan bahwa ini adalah salah satu "perbaikan" kompatibilitas mundur yang ditambahkan di jQuery 1.6.1).

Jadi, keduanya akan berhasil ... tetapi contoh kedua yang Anda berikan (menggunakan prop) adalah yang lebih benar dari keduanya. Jika tujuan Anda adalah menghapus centang pada kotak, Anda benar-benar ingin memengaruhi properti , bukan atributnya, dan Anda tidak perlu removeAttrmelakukannya.

John Flatness
sumber
36
@tandu: Bisa , tapi tidak boleh. Dari dokumen: " Catatan: Jangan gunakan [ removeProp()] untuk menghapus properti asli seperti dicentang, dinonaktifkan, atau dipilih. Ini akan menghapus properti sepenuhnya dan, setelah dihapus, tidak dapat ditambahkan lagi ke elemen. Gunakan .prop()untuk menyetel properti ini ke salah sebagai gantinya." removePropbenar-benar dimaksudkan untuk digunakan dengan properti khusus saja.
John Flatness
17

menggunakan checked : true, false properti dari kotak centang.

jQuery:

if($('input[type=checkbox]').is(':checked')) {
    $(this).prop('checked',true);
} else {
    $(this).prop('checked',false);
}
suraj rawat
sumber
Kita bisa menghilangkan if, else menggunakan satu liner, $ (this) .prop ('check', $ ('input [type = checkbox]'). Is (': check'));
Yousaf Hassan
8

Saya merekomendasikan untuk menggunakan keduanya, prop dan attr karena saya memiliki masalah dengan Chrome dan saya menyelesaikannya menggunakan kedua fungsi tersebut.

if ($(':checkbox').is(':checked')){
    $(':checkbox').prop('checked', true).attr('checked', 'checked');
}
else {
    $(':checkbox').prop('checked', false).removeAttr('checked');
}
Ragnar
sumber
Ya, untuk chrome, gunakan: $("input[type='checkbox'], input[type='radio']").prop("checked", false).attr("checked", false).removeAttr("checked");
Rod
Saya menggunakan komponen khusus (CSS + JS) untuk mengganti radio input dan kotak centang. Ini adalah satu-satunya cara yang berhasil untuk saya. Terima kasih!
Silvio Delgado
3

Alternatif lain untuk melakukan hal yang sama adalah dengan memfilter atribut type = checkbox :

$('input[type="checkbox"]').removeAttr('checked');

atau

$('input[type="checkbox"]').prop('checked' , false);

Ingatlah bahwa Perbedaan antara atribut dan properti dapat menjadi penting dalam situasi tertentu. Sebelum jQuery 1.6 , metode .attr () terkadang memperhitungkan nilai properti saat mengambil beberapa atribut, yang dapat menyebabkan perilaku tidak konsisten. Mulai jQuery 1.6, metode .prop () menyediakan cara untuk mengambil nilai properti secara eksplisit, sementara .attr () mengambil atribut.

Tahu lebih banyak ...

tonnoz
sumber
2
Pertanyaannya adalah "Manakah dari ini yang lebih benar", bukan "Apakah ada cara lain untuk melakukan ini?". Anda tampaknya tidak berusaha menjawab pertanyaan
Andrew Stubbs