Jak zresetować radiobuttons w jQuery, aby żaden nie był zaznaczony


136

Mam przyciski radiowe w HTML w ten sposób:

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

Znajduje się w tagu formularza, a gdy użytkownik przesyła formularz, chcę przywrócić domyślne ustawienia wszystkich przycisków opcji. To znaczy, że żaden z nich nie sprawdził.

Mam ten kod, ale wyświetla błąd mówiąc [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;

Robię to w IE 6.


Jeśli odpowiedź @ lambacck nie działa, zobacz narzędzie do śledzenia błędów na stronie JQuery [ bugs.jquery.com/ticket/10910] . Jeśli (tak jak ja ...) przeglądasz zestaw przycisków radiowych, aby spróbować zresetować je wszystkie do wartości domyślnych, błąd #(selector).prop('checked',true);kończy się niepowodzeniem, gdy następuje próba ustawienia kolejnego przycisku opcji w tej samej grupie na stan niezaznaczony. Sztuczka polega na tym, aby ustawić przycisk radiowy w stanie zaznaczonym i pozwolić grupie przycisków radiowych robić to, co robi (odznacz pozostałe ...) . Również dzwonienie $(selector).click();działa i wyzwala wszelkie zdarzenia towarzyszące.
Cos Callis

Odpowiedzi:


270

W wersjach jQuery przed 1.6 użycia:

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

W wersjach jQuery po 1.6 powinieneś używać:

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

ale jeśli używasz wersji 1.6.1+, możesz użyć pierwszego formularza (patrz uwaga 2 poniżej).

Uwaga 1: ważne jest, aby drugi argument był fałszywy, a nie „fałsz”, ponieważ „fałsz” nie jest wartością fałszywą. to znaczy

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

Uwaga 2: W jQuery 1.6.0, istnieją obecnie dwa podobne metody, .attra .propktóre robią dwa podobne, ale nieco różne rzeczy. Jeśli w tym konkretnym przypadku powyższa rada zadziała, jeśli używasz wersji 1.6.1+. Powyższe nie będzie działać z 1.6.0, jeśli używasz 1.6.0, powinieneś zaktualizować. Jeśli chcesz poznać szczegóły, czytaj dalej.

Szczegóły: Podczas pracy z prostych elementów HTML DOM, istnieją właściwości związane z elementu DOM ( checked, type, value, etc), które stanowią interfejs do uruchomionego stanu strony HTML. Istnieje również interfejs .getAttribute/ .setAttribute, który zapewnia dostęp do wartości atrybutów HTML, jak podano w kodzie HTML. Przed wersją 1.6 jQuery zatarło to rozróżnienie, udostępniając jedną metodę .attr, aby uzyskać dostęp do obu typów wartości. jQuery 1.6+ udostępnia dwie metody .attri .propumożliwia rozróżnienie między tymi sytuacjami.

.propumożliwia ustawienie właściwości elementu DOM, a jednocześnie .attrumożliwia ustawienie wartości atrybutu HTML. Jeśli pracujesz ze zwykłym DOM i ustawiasz sprawdzoną właściwość elem.checkedna truelub falsezmieniasz bieżącą wartość (co widzi użytkownik), a zwrócona wartość śledzi stan na stronie. elem.getAttribute('checked')jednak zwraca tylko stan początkowy (i zwraca 'checked'lub w undefinedzależności od stanu początkowego z HTML). W wersji 1.6.1+ używanie .attr('checked', false)robi jedno elem.removeAttribute('checked')i drugie, a elem.checked = falseponieważ zmiana spowodowała wiele problemów ze zgodnością wsteczną i nie jest w stanie stwierdzić, czy chcesz ustawić atrybut HTML, czy właściwość DOM. Zobacz więcej informacji w dokumentacji .prop .


Ważne jest, aby jako drugi argument podać fałsz zamiast „fałsz”.
Casebash

Wartość „fałsz” drugiego argumentu jest ważna, ponieważ drugi argument to wartość do ustawienia. Jeśli drugi argument jest pusty, oznacza to, że podaj mi wartość pierwszego elementu, który pasuje do selektora.
lambacck

1
@Noldorin - „Truthy” to perfekcyjnie okropne słowo. (Czy możesz zasugerować lepszy sposób wyrażenia pojęcia „prawda” - używając tylko jednego słowa?)
nnnnnn

Hej, może wystarczy. Prawdopodobnie wszyscy rozumiemy, o co chodzi, chociaż osobiście wolałbym nawet bardziej formalne „prawdziwe” lub „semantycznie prawdziwe”.
Noldorin

3
@Noldorin „Prawda” i „fałsz” to terminy używane przez wielu ekspertów od Javascript, w tym Brendan Eich i Douglass Crockford . Kluczowy termin jest fałszywy, ponieważ wartości logiczne są definiowane przez 6 fałszywych wartości . Prawda to logiczna nazwa przeciwieństwa fałszu. Myślę, że użycie falsy zostało celowo użyte, abyś pomyślał, że może to nie być to, do czego jesteś przyzwyczajony (szczególnie jeśli pochodzi z innych języków składni w stylu C, gdzie 0 jest fałszywe).
lambacck

53

Najlepszy sposób na ustawienie stanu radiobuttons w 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

Kod JQuery (1.4+) do wstępnego wyboru jednego przycisku:

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

W kodzie Jquery 1.6+ preferowana jest metoda .prop ():

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

Aby odznaczyć przyciski:

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

10

Twój problem polega na tym, że selektor atrybutu nie zaczyna się od @.

Spróbuj tego:

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

4
$('#radio1').removeAttr('checked');
$('#radio2').removeAttr('checked');
$('#radio3').removeAttr('checked');
$('#radio4').removeAttr('checked');

Or

$('input[name="correctAnswer"]').removeAttr('checked');

4

Wreszcie po wielu testach myślę, że najwygodniejszym i najskuteczniejszym sposobem na ustawienie wstępne jest:

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

Odświeżanie jest wymagane w przypadku obiektu JQueryUI.

Pobieranie wartości jest łatwe:

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

Testowane z JQuery 1.6.1, JQuery UI 1.8.


2

Wiem, że to jest stare i trochę nie na temat, ale przypuśćmy, że chcesz odznaczyć tylko określone przyciski opcji w kolekcji:

$("#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">

A jeśli masz do czynienia z listą radiobutton, możesz użyć selektora: selected, aby uzyskać tylko ten, który chcesz.

$("#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">

0

Zestaw przycisków radiowych sprawdzony przez 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>

kod jQuery:

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

0

Jeśli chcesz wyczyścić wszystkie przyciski opcji w DOM:

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


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

0

Chociaż prop zmienił stan zaznaczenia, ale zmiana również pokazuje to w formularzu.

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

-1

Gdzie masz: <input type="radio" name="enddate" value="1" />

Po wartości = „1” możesz również po prostu dodać unchecked =" false" />

Linia będzie wtedy:

<input type="radio" name="enddate" value="1" unchecked =" false" />

1
Hej, myślę, że zostawiłeś niekompletną odpowiedź.
Amar

-2

Przywróć domyślne ustawienia wszystkich przycisków opcji:

$("input[name='correctAnswer']").checkboxradio( "refresh" );

Funkcja checkboxradio () nie jest zdefiniowana w jQuery 2.x. Czy to rozszerzenie, którego używasz?
justdan23

-3

Dlaczego nie robisz:

$("#radio1, #radio2, #radio3, #radio4").checked = false;

1
Nie możesz po prostu ustawić sprawdzonej właściwości w tablicy zwróconej przez wywołanie jQuery, musisz użyć funkcji attr (), aby ustawić tę właściwość na elementach tablicy.
bdukes

to nie robi się wtedy „niesprawdzone”
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.