Cara mengatur ulang tombol radio di jQuery sehingga tidak ada yang dicentang

136

Saya memiliki tombol radio dalam HTML seperti ini:

<td>
    <input id="radio1" type="radio" name="correctAnswer" value="1">1</input>
    <input id="radio2" type="radio" name="correctAnswer" value="2">2</input>
    <input id="radio3" type="radio" name="correctAnswer" value="3">3</input>
    <input id="radio4" type="radio" name="correctAnswer" value="4">4</input>
</td>

Ini ada dalam tag formulir, dan ketika pengguna mengirimkan formulir, saya ingin membuat semua tombol radio kembali ke default. Artinya tidak ada yang diperiksa.

Saya memiliki kode ini tetapi memberikan kesalahan mengatakan [0] is null or not an object

$('input[@name="correctAnswer"]')[0].checked = false;
$('input[@name="correctAnswer"]')[1].checked = false;
$('input[@name="correctAnswer"]')[2].checked = false;
$('input[@name="correctAnswer"]')[3].checked = false;

Saya melakukan ini di IE 6.

Eric Leschinski
sumber
Jika jawaban @ lambacck tidak berhasil untuk Anda, lihat pelacak bug di situs JQuery [ bugs.jquery.com/ticket/10910] . Jika Anda (seperti saya ...) melakukan perulangan melalui serangkaian tombol radio untuk mencoba mengatur ulang semuanya ke nilai default, #(selector).prop('checked',true);gagal saat diikuti dengan mencoba menyetel tombol radio berikutnya dalam grup yang sama ke status yang tidak dicentang. Triknya adalah dengan hanya menyetel tombol radio ke status yang dicentang dan membiarkan grup tombol radio melakukan apa yang dilakukannya (hapus centang yang lain ...) . Selain itu, panggilan $(selector).click();berfungsi, dan akan mengaktifkan acara asosiasi apa pun.
Cos Callis

Jawaban:

270

Dalam versi jQuery sebelum 1.6 digunakan:

$('input[name="correctAnswer"]').attr('checked', false);

Dalam versi jQuery setelah 1.6, Anda harus menggunakan:

$('input[name="correctAnswer"]').prop('checked', false);

tetapi jika Anda menggunakan 1.6.1+ Anda dapat menggunakan formulir pertama (lihat catatan 2 di bawah).

Catatan 1: Penting bahwa argumen kedua salah dan bukan "salah" karena "salah" bukanlah nilai yang salah. yaitu

if ("false") {
    alert("Truthy value. You will see an alert");
}

Catatan 2: Pada jQuery 1.6.0, sekarang ada dua metode serupa, .attrdan .propitu melakukan dua hal yang terkait tetapi sedikit berbeda. Jika dalam kasus khusus ini, saran yang diberikan di atas berfungsi jika Anda menggunakan 1.6.1+. Di atas tidak akan berfungsi dengan 1.6.0, jika Anda menggunakan 1.6.0, Anda harus meningkatkan. Jika Anda menginginkan detailnya, teruslah membaca.

Rincian: Ketika bekerja dengan elemen HTML DOM lurus, ada sifat yang melekat pada elemen DOM ( checked, type, value, dll) yang menyediakan sebuah antarmuka untuk negara berjalan dari halaman HTML. Ada juga .getAttribute/ .setAttributeinterface yang menyediakan akses ke nilai Atribut HTML seperti yang disediakan di HTML. Sebelum 1.6 jQuery mengaburkan perbedaan dengan menyediakan satu metode .attr,, untuk mengakses kedua jenis nilai. jQuery 1.6+ menyediakan dua metode, .attrdan .propuntuk membedakan antara situasi ini.

.propmemungkinkan Anda menyetel properti pada elemen DOM, sementara .attrmemungkinkan Anda menyetel nilai atribut HTML. Jika Anda bekerja dengan DOM biasa dan menyetel properti yang dicentang elem.checked,, ke trueatau falseAnda mengubah nilai yang berjalan (apa yang dilihat pengguna) dan nilai yang dikembalikan melacak status di laman. elem.getAttribute('checked')namun hanya mengembalikan status awal (dan mengembalikan 'checked'atau undefinedbergantung pada status awal dari HTML). Di 1.6.1+, penggunaan .attr('checked', false)melakukan keduanya elem.removeAttribute('checked')dan elem.checked = falsekarena perubahan tersebut menyebabkan banyak masalah kompatibilitas mundur dan tidak dapat benar-benar mengetahui apakah Anda ingin menyetel atribut HTML atau properti DOM. Lihat informasi lebih lanjut dalam dokumentasi untuk .prop .

lambacck
sumber
Penting untuk memberikan false daripada "false" untuk argumen kedua.
Casebash
"Salah" untuk argumen kedua penting karena argumen kedua adalah nilai yang akan ditetapkan. Jika argumen kedua kosong, itu berarti beri saya nilai elemen pertama yang cocok dengan selektor.
lambacck
1
@Noldorin - "Truthy" adalah kata yang sangat romantis. (Dapatkah Anda menyarankan cara yang lebih baik untuk mengungkapkan konsep "kebenaran" - hanya menggunakan satu kata?)
nnnnnn
Heh, mungkin cukup adil. Kita semua mungkin mengerti maksudnya, meskipun saya pribadi lebih suka yang lebih formal "jujur" atau "jujur ​​secara semantik".
Noldorin
3
@Noldorin "Truthy" dan "falsy" adalah istilah yang digunakan banyak pakar Javascript, termasuk Brendan Eich dan Douglass Crockford . Istilah kuncinya salah karena evaluasi boolean ditentukan oleh 6 nilai yang salah . Truthy adalah nama logis untuk kebalikan dari falsy. Saya pikir penggunaan falsy sengaja digunakan untuk membuat Anda berpikir bahwa ini mungkin bukan yang biasa Anda gunakan (terutama jika berasal dari bahasa sintaks gaya C lain di mana 0 salah).
lambacck
53

Cara terbaik untuk menyetel status radiobuttons di jquery:

HTML:

<input type="radio" name="color" value="orange" /> Orange 
<input type="radio" name="color" value="pink" /> Pink 
<input type="radio" name="color" value="black" /> Black
<input type="radio" name="color" value="pinkish purple" /> Pinkish Purple

Kode Jquery (1.4+) untuk memilih satu tombol sebelumnya:

var presetValue = "black";
$("[name=color]").filter("[value='"+presetValue+"']").attr("checked","checked");

Dalam kode Jquery 1.6+, metode .prop () lebih disukai:

var presetValue = "black";
$("[name=color]").filter("[value='"+presetValue+"']").prop("checked",true);

Untuk membatalkan pilihan tombol:

$("[name=color]").removeAttr("checked");
Benjk
sumber
10

Masalah Anda adalah bahwa pemilih atribut tidak dimulai dengan @.

Coba ini:

$('input[name="correctAnswer"]').attr('checked', false);
bdukes
sumber
4
$('#radio1').removeAttr('checked');
$('#radio2').removeAttr('checked');
$('#radio3').removeAttr('checked');
$('#radio4').removeAttr('checked');

Or

$('input[name="correctAnswer"]').removeAttr('checked');
Waqas Ali Khan Puar
sumber
4

Akhirnya setelah banyak pengujian, menurut saya cara yang paling nyaman dan efisien untuk melakukan preset adalah:

var presetValue = "black";
$("input[name=correctAnswer]").filter("[value=" + presetValue + "]").prop("checked",true);
$("input[name=correctAnswer]").button( "refresh" );//JQuery UI only

Penyegaran diperlukan dengan objek JQueryUI.

Mengambil nilai itu mudah:

alert($('input[name=correctAnswer]:checked').val())

Diuji dengan JQuery 1.6.1, JQuery UI 1.8.

vv-reflex
sumber
2

Saya tahu ini sudah tua dan ini sedikit di luar topik, tetapi Andaikan Anda ingin menghapus centang hanya tombol radio tertentu dalam koleksi:

$("#go").click(function(){
    $("input[name='correctAnswer']").each(function(){
      if($(this).val() !== "1"){
        $(this).prop("checked",false);
      }
    });
  });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<input id="radio1" type="radio" name="correctAnswer" value="1">1</input>
<input id="radio2" type="radio" name="correctAnswer" value="2">2</input>
<input id="radio3" type="radio" name="correctAnswer" value="3">3</input>
<input id="radio4" type="radio" name="correctAnswer" value="4">4</input>
<input type="button" id="go" value="go">

Dan jika Anda berurusan dengan daftar tombol radio, Anda dapat menggunakan: check selector untuk mendapatkan yang Anda inginkan.

$("#go").click(function(){
  $("input[name='correctAnswer']:checked").prop("checked",false);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<input id="radio1" type="radio" name="correctAnswer" value="1">1</input>
<input id="radio2" type="radio" name="correctAnswer" value="2">2</input>
<input id="radio3" type="radio" name="correctAnswer" value="3">3</input>
<input id="radio4" type="radio" name="correctAnswer" value="4">4</input>
<input type="button" id="go" value="go">
Nielsvh
sumber
0

Set tombol radio diperiksa melalui jquery:

<div id="somediv" >
 <input type="radio" name="enddate" value="1"  />
 <input type="radio" name="enddate" value="2"  />
 <input type="radio" name="enddate" value="3"  />
</div>

kode jquery:

$('div#somediv input:radio:nth(0)').attr("checked","checked");
sonali
sumber
0

Jika Anda ingin menghapus semua tombol radio di DOM:

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

elzaer
sumber
0
<div id="radio">
<input type="radio" id="radio1" name="radio"/><label for="radio1">Bar Chart</label>
<input type="radio" id="radio2" name="radio"/><label for="radio2">Pie Chart</label>
<input type="radio" id="radio3" name="radio"/><label for="radio3">Datapoint Chart</label>
</div>

$('#radio input').removeAttr('checked');
// Refresh the jQuery UI buttonset.                  
$( "#radio" ).buttonset('refresh');
Lakshmana Kumar D
sumber
0

Meskipun prop mengubah status yang dicentang tetapi perubahan juga menunjukkannya dalam bentuk.

$('input[name="correctAnswer"]').prop('checked', false).change();
Adeel Raza Azeemi
sumber
-1

Dimana Anda memiliki: <input type="radio" name="enddate" value="1" />

Setelah nilai = "1" Anda juga bisa menambahkan unchecked =" false" />

Garis tersebut kemudian akan menjadi:

<input type="radio" name="enddate" value="1" unchecked =" false" />
Okee Dokee
sumber
1
Hei, saya pikir Anda membiarkan jawaban Anda tidak lengkap.
Amar
-2

Setel semua tombol radio kembali ke default:

$("input[name='correctAnswer']").checkboxradio( "refresh" );
RDD
sumber
Fungsi checkboxradio () tidak ditentukan di jQuery 2.x. Apakah ini ekstensi yang Anda gunakan?
justdan23
-3

Mengapa Anda tidak melakukannya:

$("#radio1, #radio2, #radio3, #radio4").checked = false;
cloudhead
sumber
1
Anda tidak bisa begitu saja menyetel properti yang dicentang pada larik yang dikembalikan dari panggilan jQuery, Anda harus menggunakan fungsi attr () untuk menyetel properti itu pada item di dalam larik.
bdukes
ini tidak membuat maka 'tidak dicentang'