Cómo restablecer botones de radio en jQuery para que ninguno esté marcado

136

Tengo botones de radio en HTML como este:

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

Esto está en una etiqueta de formulario, y cuando el usuario envía un formulario, quiero que todos los botones de radio vuelvan al valor predeterminado. Lo que significa que ninguno de ellos lo comprobó.

Tengo este código pero da un error que dice [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;

Estoy haciendo esto en IE 6.

Eric Leschinski
fuente
Si la respuesta de @ lambacck no funciona para usted, vea el rastreador de errores en el sitio JQuery [ bugs.jquery.com/ticket/10910] . Si está (como lo estaba ...) recorriendo un conjunto de botones de radio para intentar restablecerlos a sus valores predeterminados, #(selector).prop('checked',true);falla cuando se intenta establecer un botón de radio posterior en el mismo grupo en un estado sin marcar. El truco consiste en configurar el botón de radio en un estado marcado y dejar que el grupo de botones de radio haga lo que hace (desmarque los demás ...) . Además, llamar $(selector).click();funciona y activará cualquier evento asociado.
Cos Callis

Respuestas:

270

En versiones de jQuery anteriores a 1.6 use:

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

En las versiones de jQuery posteriores a 1.6, debe usar:

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

pero si está utilizando 1.6.1+ puede usar el primer formulario (vea la nota 2 a continuación).

Nota 1: es importante que el segundo argumento sea falso y no "falso" ya que "falso" no es un valor falso. es decir

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

Nota 2: A partir de jQuery 1.6.0, ahora hay dos métodos similares, .attry .propeso hace dos cosas relacionadas pero ligeramente diferentes. Si en este caso particular, el consejo que se proporciona arriba funciona si usa 1.6.1+. Lo anterior no funcionará con 1.6.0, si está utilizando 1.6.0, debe actualizar. Si quieres los detalles, sigue leyendo.

Detalles: Cuando se trabaja con elementos DOM HTML rectas, hay propiedades unidos al elemento DOM ( checked, type, value, etc.) que proporcionan una interfaz para el estado de ejecución de la página HTML. También existe la interfaz .getAttribute/ .setAttributeque proporciona acceso a los valores del Atributo HTML tal como se proporcionan en el HTML. Antes de 1.6 jQuery difuminaba la distinción al proporcionar un método .attrpara acceder a ambos tipos de valores. jQuery 1.6+ proporciona dos métodos, .attry .proppara distinguir entre estas situaciones.

.prople permite establecer una propiedad en un elemento DOM, mientras le .attrpermite establecer un valor de atributo HTML. Si está trabajando con DOM simple y establecer la propiedad marcada, elem.checked, a true, o falsese cambia el valor de funcionamiento (lo que ve el usuario) y las pistas de valor devuelto los de estado de la página. elem.getAttribute('checked')sin embargo, solo devuelve el estado inicial (y devuelve 'checked'o undefineddepende del estado inicial del HTML). En 1.6.1+, el uso .attr('checked', false)hace ambas cosas, elem.removeAttribute('checked')y elem.checked = falsedado que el cambio causó muchos problemas de compatibilidad con versiones anteriores y realmente no se puede saber si desea establecer el atributo HTML o la propiedad DOM. Ver más información en la documentación de .prop .

lambacck
fuente
Es importante pasar falso en lugar de "falso" para el segundo argumento.
Casebash
El "falso" para el segundo argumento es importante porque el segundo argumento es el valor a establecer. Si el segundo argumento está vacío, significa darme el valor del primer elemento que coincide con el selector.
lambacck
1
@Noldorin - "Verdad" es una palabra perfectamente cromulenta. (¿Puede sugerir una mejor manera de expresar el concepto de "verdad" - usando solo una palabra?)
nnnnnn
Je, bastante justo tal vez. Probablemente todos entendamos el punto, aunque personalmente hubiera preferido incluso el más formal "veraz" o "semánticamente veraz".
Noldorin
3
@Noldorin "Verdad" y "falsedad" son los términos que usan muchos expertos en Javascript, incluidos Brendan Eich y Douglass Crockford . El término clave es falso ya que las evaluaciones booleanas están definidas por los 6 valores falsos . La verdad es el nombre lógico para lo contrario de la falsedad. Creo que el uso de falsedad se usó a propósito para hacerte pensar que esto puede no ser lo que estás acostumbrado (especialmente si proviene de otros lenguajes de sintaxis de estilo C donde 0 es falso).
lambacck
53

La mejor manera de configurar el estado de los botones de radio en 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 preseleccionar un botón:

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

En el código Jquery 1.6+ se prefiere el método .prop ():

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

Para anular la selección de los botones:

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

Su problema es que el selector de atributos no comienza con a @.

Prueba esto:

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

Or

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

Finalmente, después de muchas pruebas, creo que la forma más conveniente y eficiente de preestablecer es:

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

La actualización es necesaria con el objeto JQueryUI.

Recuperar el valor es fácil:

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

Probado con JQuery 1.6.1, JQuery UI 1.8.

vv-reflex
fuente
2

Sé que esto es antiguo y que está un poco fuera de tema, pero suponiendo que quisieras desmarcar solo botones de radio específicos en una colección:

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

Y si se trata de una lista de botones de radio, puede usar el selector: marcado para obtener exactamente el que desea.

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

Conjunto de botones de radio verificado a través de 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
fuente
0

Si desea borrar todos los botones de radio en el DOM:

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

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

Aunque el accesorio cambió el estado marcado, pero el cambio también lo muestra en el formulario.

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

Donde tienes: <input type="radio" name="enddate" value="1" />

Después de value = "1" también puede simplemente agregar unchecked =" false" />

La línea será entonces:

<input type="radio" name="enddate" value="1" unchecked =" false" />
Okee Dokee
fuente
1
Oye, creo que dejaste tu respuesta incompleta.
Amar el
-2

Establezca todos los botones de radio al valor predeterminado:

$("input[name='correctAnswer']").checkboxradio( "refresh" );
RDD
fuente
La función checkboxradio () no está definida en jQuery 2.x. ¿Era esta una extensión que estabas usando?
justdan23
-3

¿Por qué no lo haces?

$("#radio1, #radio2, #radio3, #radio4").checked = false;
cabeza de nube
fuente
1
No puede simplemente establecer la propiedad marcada en la matriz devuelta por la llamada jQuery, debe usar la función attr () para establecer esa propiedad en los elementos dentro de la matriz.
bdukes
esto no es hacer a continuación, 'sin control'