¿Cómo obtener el valor del botón de opción seleccionado?

265

Tengo un problema extraño con mi programa JS. Tenía esto funcionando correctamente, pero por alguna razón ya no funciona. Solo quiero encontrar el valor del botón de opción (cuál está seleccionado) y devolverlo a una variable. Por alguna razón, sigue regresando undefined.

Aquí está mi código:

function findSelection(field) {
    var test = 'document.theForm.' + field;
    var sizes = test;

    alert(sizes);
        for (i=0; i < sizes.length; i++) {
            if (sizes[i].checked==true) {
            alert(sizes[i].value + ' you got a value');     
            return sizes[i].value;
        }
    }
}

submitForm:

function submitForm() {

    var genderS =  findSelection("genderS");
    alert(genderS);
}

HTML:

<form action="#n" name="theForm">

    <label for="gender">Gender: </label>
    <input type="radio" name="genderS" value="1" checked> Male
    <input type="radio" name="genderS" value="0" > Female<br><br>
    <a href="javascript: submitForm()">Search</A>
</form>
mkyong
fuente

Respuestas:

395

Puedes hacer algo como esto:

var radios = document.getElementsByName('genderS');

for (var i = 0, length = radios.length; i < length; i++) {
  if (radios[i].checked) {
    // do whatever you want with the checked radio
    alert(radios[i].value);

    // only one radio can be logically checked, don't check the rest
    break;
  }
}
<label for="gender">Gender: </label>
<input type="radio" name="genderS" value="1" checked="checked">Male</input>
<input type="radio" name="genderS" value="0">Female</input>

jsfiddle

Editar: Gracias HATCHA y jpsetung por sus sugerencias de edición.

jbabey
fuente
55
Eso funcionaba para jquery 1.7 pero ahora la sintaxis correcta para jQuery 1.9 es $ ('input [name = "genderS"]: check'). Val (); (eliminar el @)
jptsetung
1
Creo que la @sintaxis fue obsoleta incluso antes (jquery 1.2)
Tom Pietrosanti
@TomPietrosanti la documentación parece estar un poco apagada, jsfiddle.net/Xxxd3/608 funciona en <1.7.2 pero no en> 1.8.3. De todos modos, @definitivamente debería eliminarse
jbabey
Sí, parece que dejaron cierta compatibilidad con versiones anteriores, pero no actualizaron los documentos para que coincidan. Recuerdo un alboroto cuando dejaron caer algunas características obsoletas que todavía se usaban ampliamente, por lo que agregaron soporte nuevamente. Tal vez por eso ...
Tom Pietrosanti
2
document.querySelector()probablemente debería ser el enfoque recomendado en JavaScript directo ahora.
Dave
338

Esto funciona con cualquier explorador.

document.querySelector('input[name="genderS"]:checked').value;

Esta es una manera simple de obtener el valor de cualquier tipo de entrada. Usted también no necesita incluir el trazado de jQuery.

Giorgos Tsakonas
fuente
23
El uso de document.querySelector () es una respuesta pura de JavaScript: developer.mozilla.org/en-US/docs/Web/API/document.querySelector
AdamJonR
8
Si lo almacena en una variable y no se selecciona ningún botón de radio, hará que el navegador se detenga. La consola dice: TypeError document.querySelector(...)es null.
llámame
14
Eso solo funciona si se selecciona uno. Entonces deberías comprobarlo antes. var selector = document.querySelector('input[name="genderS"]:checked'); if(selector) console.log(selector.value);
Markus Zeller
Estoy trabajando con las plantillas en Meteor, y ese :checkedtruco lo logró para mí ... para mí, la solución para leer los botones de radio de un formulario de plantilla de Meteor fueaccountType = template.find("[name='optradio']:checked").value;
zipzit
Tengo un entorno empresarial en el que no funciona de manera consistente en IE11, algún tipo de modo de compatibilidad con versiones anteriores.
Steve Black,
35
document.forms.your-form-name.elements.radio-button-name.value
imran ansari
fuente
55
Esto también funciona:document.forms.your-form-name.name-shared-by-radio-buttons.value
Web_Designer
77
Creo que la mayoría de la gente pasa por alto esto. La respuesta aceptada funciona. La respuesta de Giorgos Tsakonas es mejor. Pero esta es la respuesta fundamentalmente correcta. Así es como funcionan realmente los botones de radio. Tenga en cuenta que si no se ha seleccionado nada, devuelve una cadena vacía.
Mark Goldfain
@Web_Designer ¿Su comentario no debería ser también una respuesta real?
Ideograma
Esto no funciona si su entrada de radio no está en un formulario, así que no creo que esta sea una mejor respuesta que la de querySelector, quizás estos dos deberían fusionarse.
Tomáš Hübelbauer
de esta manera no funciona si sus radios están dentro de las etiquetas
Igor Fomenko
19

Desde jQuery 1.8, la sintaxis correcta para la consulta es

$('input[name="genderS"]:checked').val();

$('input[@name="genderS"]:checked').val();Ya no , que funcionaba en jQuery 1.7 (con la @ ).

jptsetung
fuente
16

Versión ECMAScript 6

let genderS = Array.from(document.getElementsByName("genderS")).find(r => r.checked).value;
Pañal
fuente
16

La solución más simple:

 document.querySelector('input[name=genderS]:checked').value
Bobur Saidov
fuente
1
Votado por dos razones: 1. funciona. 2. No fue una respuesta jquery lamentable.
John
21
Esta es una copia exacta de la respuesta anterior de @Giorgos Tsakonas que se dio un año antes.
T Nguyen
7

Prueba esto

function findSelection(field) {
    var test = document.getElementsByName(field);
    var sizes = test.length;
    alert(sizes);
    for (i=0; i < sizes; i++) {
            if (test[i].checked==true) {
            alert(test[i].value + ' you got a value');     
            return test[i].value;
        }
    }
}


function submitForm() {

    var genderS =  findSelection("genderS");
    alert(genderS);
    return false;
}

Un violín aquí .

El alfa
fuente
6

Editar: como dijo Chips_100, debe usar:

var sizes = document.theForm[field];

directamente sin usar la variable de prueba.


Vieja respuesta:

¿No te debería evalgustar esto?

var sizes = eval(test);

No sé cómo funciona, pero para mí solo estás copiando una cadena.

Michael Laffargue
fuente
eval no es la mejor opción aquí ... es posible que desee decir var sizes = document.theForm[field];y eliminar la primera asignación, por lo que ya no usa la testvariable.
Dennis
Que yo sepa, ¿evaluaría el trabajo tal como está? ¿O funcionaría solo con eval('var sizes=document.theForm.' + field)?
Michael Laffargue
la declaración eval en su respuesta var sizes = eval(test);funcionaría de esa manera (solo la probé en firebug).
Dennis
Eso tiene más sentido, pero recibo un error "Token inesperado [" en esa línea donde pongo fieldentre paréntesis. ¿Alguna idea de por qué?
mkyong
4

Este es JavaScript puro, basado en la respuesta de @Fontas pero con código de seguridad para devolver una cadena vacía (y evitar a TypeError) si no hay un botón de radio seleccionado:

var genderSRadio = document.querySelector("input[name=genderS]:checked");
var genderSValue = genderSRadio ? genderSRadio.value : "";

El código se descompone así:

  • Línea 1: obtenga una referencia al control de que (a) es un <input>tipo, (b) tiene un nameatributo de genderSy (c) está marcado.
  • Línea 2: si existe dicho control, devuelva su valor. Si no lo hay, devuelva una cadena vacía. La genderSRadiovariable es verdadera si la línea 1 encuentra el control y nula / falsa si no lo encuentra.

Para JQuery, use la respuesta de @ jbabey y tenga en cuenta que si no hay un botón de radio seleccionado, volverá undefined.

Ed Gibbs
fuente
4

En caso de que alguien buscara una respuesta y aterrizara aquí como yo, desde Chrome 34 y Firefox 33 puede hacer lo siguiente:

var form = document.theForm;
var radios = form.elements['genderS'];
alert(radios.value);

o más simple:

alert(document.theForm.genderS.value);

referencia: https://developer.mozilla.org/en-US/docs/Web/API/RadioNodeList/value

ashraf aaref
fuente
3

Aquí hay un ejemplo para radios donde no se utiliza el atributo Comprobado = "verificado"

function test() {
var radios = document.getElementsByName("radiotest");
var found = 1;
for (var i = 0; i < radios.length; i++) {       
    if (radios[i].checked) {
        alert(radios[i].value);
        found = 0;
        break;
    }
}
   if(found == 1)
   {
     alert("Please Select Radio");
   }    
}

DEMO : http://jsfiddle.net/ipsjolly/hgdWp/2/ [ Haga clic en Buscar sin seleccionar ninguna Radio ]

Fuente: http://bloggerplugnplay.blogspot.in/2013/01/validateget-checked-radio-value-in.html

Code Spy
fuente
2

Aquí hay una buena manera de obtener el valor del botón de opción marcado con JavaScript simple:

const form = document.forms.demo;
const checked = form.querySelector('input[name=characters]:checked');

// log out the value from the :checked radio
console.log(checked.value);

Fuente: https://ultimatecourses.com/blog/get-value-checked-radio-buttons

Usando este HTML:

<form name="demo">
  <label>
    Mario
    <input type="radio" value="mario" name="characters" checked>
  </label>
  <label>
    Luigi
    <input type="radio" value="luigi" name="characters">
  </label>
  <label>
    Toad
    <input type="radio" value="toad" name="characters">
  </label>
</form>

También puede usar Array Buscar la checkedpropiedad para buscar el elemento marcado:

Array.from(form.elements.characters).find(radio => radio.checked);
Rachie M
fuente
1

Usando un javascript puro, puede manejar la referencia al objeto que despachó el evento.

function (event) {
    console.log(event.target.value);
}
antonjs
fuente
1

supongamos que necesita colocar diferentes filas de botones de opción en un formulario, cada uno con nombres de atributos separados ('opción1', 'opción2', etc.) pero con el mismo nombre de clase. Quizás los necesite en varias filas donde cada uno enviará un valor basado en una escala de 1 a 5 correspondiente a una pregunta. puedes escribir tu javascript así:

<script type="text/javascript">

    var ratings = document.getElementsByClassName('ratings'); // we access all our radio buttons elements by class name     
    var radios="";

    var i;
    for(i=0;i<ratings.length;i++){
        ratings[i].onclick=function(){
            var result = 0;
            radios = document.querySelectorAll("input[class=ratings]:checked");
            for(j=0;j<radios.length;j++){
                result =  result + + radios[j].value;
            }
            console.log(result);
            document.getElementById('overall-average-rating').innerHTML = result; // this row displays your total rating
        }
    }
</script>

También insertaría el resultado final en un elemento de formulario oculto para enviar junto con el formulario.

Bruce Tong
fuente
1
 document.querySelector('input[name=genderS]:checked').value
alluma
fuente
0

Si es posible que asigne un Id para su elemento de formulario (), esta forma puede considerarse como una alternativa segura (especialmente cuando el nombre del elemento del grupo de radio no es único en el documento):

function findSelection(field) {
    var formInputElements = document.getElementById("yourFormId").getElementsByTagName("input");
    alert(formInputElements);
        for (i=0; i < formInputElements.length; i++) {
        if ((formInputElements[i].type == "radio") && (formInputElements[i].name == field) && (formInputElements[i].checked)) {
            alert(formInputElements[i].value + ' you got a value');     
            return formInputElements[i].value;
        }
    }
}

HTML:

<form action="#n" name="theForm" id="yourFormId">
MMKarami
fuente
-3
 <input type=radio name=rdbExampleInfo id=rdbExamples value="select 1">
 <input type=radio name=rdbExampleInfo id=rdbExamples value="select 2">
 <input type=radio name=rdbExampleInfo id=rdbExamples value="select 3">
 <input type=radio name=rdbExampleInfo id=rdbExamples value="select 4"> 

etc, entonces use solo

  $("#rdbExamples:checked").val()

O

   $('input[name="rdbExampleInfo"]:checked').val();
Jom George
fuente
-5
    var value = $('input:radio[name="radiogroupname"]:checked').val();
Ninad Nagwekar
fuente