Como redefinir os botões de opção no jQuery para que nenhum seja verificado

136

Eu tenho botões de opção em HTML assim:

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

Isso está em uma tag de formulário e, quando o usuário envia um formulário, quero fazer com que todos os botões de opção retornem ao padrão. Significando que nenhum deles foi verificado.

Eu tenho esse código, mas dá um erro dizendo [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;

Estou fazendo isso no IE 6.

Eric Leschinski
fonte
Se a resposta do @ lambacck não funcionar, você verá o rastreador de erros no site JQuery [ bugs.jquery.com/ticket/10910] . Se você estiver (como eu estava ...) percorrendo um conjunto de botões de opção para tentar redefinir todos eles para os valores padrão, #(selector).prop('checked',true);ocorrerá uma falha quando seguido pela tentativa de definir um botão de opção subsequente no mesmo grupo para um status não verificado. O truque é definir apenas o botão de opção para um estado verificado e deixar o grupo de botões de opção fazer o que faz (desmarque os outros ...) . Além disso, a chamada $(selector).click();funciona e dispara todos os eventos associados.
Cos Callis

Respostas:

270

Nas versões do jQuery anteriores à 1.6, use:

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

Nas versões do jQuery após a versão 1.6, você deve usar:

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

mas se você estiver usando 1.6.1+, poderá usar o primeiro formulário (consulte a nota 2 abaixo).

Nota 1: é importante que o segundo argumento seja falso e não "falso", pois "falso" não é um valor falso. ie

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

Nota 2: A partir do jQuery 1.6.0, agora existem dois métodos semelhantes, .attre .propque fazer duas coisas relacionadas, mas ligeiramente diferentes. Se, nesse caso em particular, as recomendações fornecidas acima funcionarem se você usar o 1.6.1+. O acima não funcionará com o 1.6.0, se você estiver usando o 1.6.0, atualize. Se você quiser os detalhes, continue lendo.

Detalhes: Ao trabalhar com elementos DOM HTML normal, há propriedades ligados ao elemento DOM ( checked, type, value, etc), que fornece uma interface para o estado de execução da página HTML. Há também a interface .getAttribute/ .setAttributeque fornece acesso aos valores de atributo HTML, conforme fornecido no HTML. Antes da versão 1.6, o jQuery embaçava a distinção fornecendo um método,, .attrpara acessar os dois tipos de valores. O jQuery 1.6+ fornece dois métodos .attre .propé possível distinguir entre essas situações.

.proppermite definir uma propriedade em um elemento DOM, enquanto .attrpermite definir um valor de atributo HTML. Se você estiver trabalhando com o DOM simples e definir a propriedade marcada,, elem.checkedpara trueou falsealtere o valor em execução (o que o usuário vê) e o valor retornado rastreia o estado da página. elem.getAttribute('checked')no entanto, retorna apenas o estado inicial (e retorna 'checked'ou undefineddepende do estado inicial do HTML). No 1.6.1+, o uso de .attr('checked', false)ambos elem.removeAttribute('checked')e elem.checked = falseuma vez que a alteração causou muitos problemas de compatibilidade com versões anteriores, não é possível saber se você deseja definir o atributo HTML ou a propriedade DOM. Veja mais informações na documentação para .prop .

lambacck
fonte
É importante passar falso em vez de "falso" para o segundo argumento.
Casebash
O "falso" para o segundo argumento é importante porque o segundo argumento é o valor a ser definido. Se o segundo argumento estiver vazio, significa fornecer o valor do primeiro elemento que corresponde ao seletor.
lambacck
1
@Noldorin - "Truthy" é uma palavra perfeitamente cromulenta. (Você pode sugerir uma maneira melhor de expressar o conceito de "truthy?" - usando apenas uma palavra)
nnnnnn
Heh, talvez seja justo. Todos nós provavelmente entendemos o argumento, embora eu pessoalmente tivesse preferido o mais formal "verdadeiro" ou "semanticamente verdadeiro" mesmo.
Noldorin
3
@Noldorin "Truthy" e "falsy" são os termos usados ​​por muitos especialistas em Javascript, incluindo Brendan Eich e Douglass Crockford . O termo-chave é falso, pois as avaliações booleanas são definidas pelos 6 valores de falsidade . Verdade é o nome lógico para o oposto de falsidade. Eu acho que o uso de falsy foi propositalmente usado para fazer você pensar que isso pode não ser o que você está acostumado (esp, se vier de outras linguagens de sintaxe no estilo C, onde 0 é falso).
lambacck
53

A melhor maneira de definir o estado dos botões de opção no 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

Código Jquery (1.4+) para pré-selecionar um botão:

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

No código do Jquery 1.6+, o método .prop () é preferido:

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

Para desmarcar os botões:

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

Seu problema é que o seletor de atributos não inicia com a @.

Tente o seguinte:

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

Or

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

Finalmente, depois de muitos testes, acho que a maneira mais conveniente e eficiente de predefinir é:

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

A atualização é necessária com o objeto JQueryUI.

Recuperar o valor é fácil:

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

Testado com o JQuery 1.6.1, JQuery UI 1.8.

reflexo vv
fonte
2

Sei que isso é antigo e que isso é um pouco fora de tópico, mas suponha que você deseje desmarcar apenas botões de opção específicos em uma coleção:

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

E se você estiver lidando com uma lista de botões de opção, poderá usar o seletor: selected para obter exatamente o que deseja.

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

Conjunto de botões de opção verificado no 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>

código jquery:

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

Se você deseja limpar todos os botões de opção no DOM:

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

elzaer
fonte
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
fonte
0

Embora prop tenha alterado o status verificado, a alteração também mostra isso no formulário.

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

Onde você tem: <input type="radio" name="enddate" value="1" />

Após o valor = "1", você também pode adicionar unchecked =" false" />

A linha será então:

<input type="radio" name="enddate" value="1" unchecked =" false" />
Okee Dokee
fonte
1
Ei, acho que você deixou sua resposta incompleta.
Amar
-2

Defina todos os botões de opção de volta ao padrão:

$("input[name='correctAnswer']").checkboxradio( "refresh" );
RDD
fonte
A função checkboxradio () não está definida no jQuery 2.x. Esta extensão você estava usando?
justdan23 27/02
-3

Por que você não faz:

$("#radio1, #radio2, #radio3, #radio4").checked = false;
cloudhead
fonte
1
Você não pode simplesmente definir a propriedade marcada na matriz retornada da chamada do jQuery, é necessário usar a função attr () para definir essa propriedade nos itens da matriz.
bdukes
isto não está fazendo, em seguida, 'desmarcada'