¿Cómo puedo verificar si un botón de opción está seleccionado con JavaScript?

271

Tengo dos botones de radio dentro de un formulario HTML. Aparece un cuadro de diálogo cuando uno de los campos es nulo. ¿Cómo puedo verificar si se ha seleccionado un botón de opción?

novato
fuente
este enlace puede ayudarle a stackoverflow.com/questions/6654601/…
Ahmed Elbendary

Respuestas:

330

Supongamos que tienes HTML como este

<input type="radio" name="gender" id="gender_Male" value="Male" />
<input type="radio" name="gender" id="gender_Female" value="Female" />

Para la validación del lado del cliente, aquí hay algunos Javascript para verificar cuál está seleccionado:

if(document.getElementById('gender_Male').checked) {
  //Male radio button is checked
}else if(document.getElementById('gender_Female').checked) {
  //Female radio button is checked
}

Lo anterior podría hacerse más eficiente dependiendo de la naturaleza exacta de su marcado, pero eso debería ser suficiente para comenzar.


Si solo está buscando ver si se ha seleccionado algún botón de radio en cualquier lugar de la página, PrototypeJS lo hace muy fácil.

Aquí hay una función que devolverá verdadero si se selecciona al menos un botón de radio en algún lugar de la página. Una vez más, es posible que esto deba modificarse según su HTML específico.

function atLeastOneRadio() {
    return ($('input[type=radio]:checked').size() > 0);
}

Para la validación del lado del servidor (recuerde, ¡no puede depender completamente de Javascript para la validación!) , Dependería de su idioma de elección, pero solo verificaría el gendervalor de la cadena de solicitud.

Mark Biek
fuente
1
pero lo que quiero comprobar si se selecciona un botón de opción independientemente de lo que esté seleccionado.
noob
1
¿Realmente no entiendo lo que estás diciendo? ¿Está interesado en saber si CUALQUIER botón de radio está seleccionado o no?
Mark Biek
si. porque el formulario no se puede enviar si no se completan todos los campos, incluidos los botones de opción.
noob
if (document.getElementById ('gender_Male'). marcado || document.getElementById ('gender_Female'). marcado) alerta ('algunos de mis radioboxes están marcados');
Havenard
Modifiqué mi ejemplo de prototipo para aprovechar la lección del selector CSS que acabo de aprender de R. Bemrose.
Mark Biek
111

Con jQuery , sería algo así como

if ($('input[name=gender]:checked').length > 0) {
    // do something here
}

Déjame dividirlo en pedazos para cubrirlo más claramente. jQuery procesa cosas de izquierda a derecha.

input[name=gender]:checked
  1. input lo limita a las etiquetas de entrada.
  2. [name=gender] lo limita a etiquetas con el nombre género dentro del grupo anterior.
  3. :checked lo limita a casillas de verificación / botones de radio que están seleccionados dentro del grupo anterior.

Si desea evitar esto por completo, marque uno de los botones de opción como marcado ( checked="checked") en el código HTML, lo que garantizaría que siempre se seleccione un botón de opción .

Powerlord
fuente
17
-1 por proponer una biblioteca cuando no se la solicita. De esta forma podríamos responder todo con "incluir biblioteca x, usar x.doWhatYouNeed ()". Sin intención de llama, realmente creo que esta pregunta debería responderse con javascript puro (y luego eventualmente señalar lo fácil que es con una biblioteca)
Riccardo Galli
23
@RiccardoGalli: Mucha gente ya usa jQuery, por eso la respuesta comienza con "Con jQuery, sería algo así" en caso de que ya lo estuvieran usando.
Powerlord
1
¿Alguien sabe si es posible encadenar selectores como este? input [name = gender] [type = radio] o input [name = gender, type = radio] solo para una validación adicional?
Ty_
@ EW-CodeMonkey La primera forma que mencionaste debería funcionar .
Powerlord
81

Una manera vainilla de JavaScript

var radios = document.getElementsByTagName('input');
var value;
for (var i = 0; i < radios.length; i++) {
    if (radios[i].type === 'radio' && radios[i].checked) {
        // get value, set checked flag or do whatever you need to
        value = radios[i].value;       
    }
}
Russ Cam
fuente
2
Bueno, ahora tengo casi el mismo problema y su código fue muy útil
MoreThanChaos
2
Esto le daría el valor del último botón de radio marcado. Si tiene múltiples grupos de radio, entonces esto probablemente no le dará el valor correcto.
styfle
@styfle Esto funciona bien para la pregunta del OP donde dice que solo hay dos botones de opción en un formulario en la página. La solución sería diferente para un escenario de problema diferente, como más de dos botones de radio, múltiples grupos de radio, etc. :)
Russ Cam
2
@RussCam Sí, esto funciona para una página pequeña con solo 2 botones de opción, pero agregué mi comentario para completar la respuesta. La mejor manera de obtener los elementos del botón de radio sería mediante name.
styfle
Una mejor manera sería seleccionar elementos de radio por una clase particular, y luego agrupar diferentes grupos de elementos de radio en diferentes clases. De lo contrario, esta solución solo funcionaría para un grupo de elementos de radio sin otros elementos de formulario de entrada.
Oliver
15

Solo trato de mejorar la solución de Russ Cam con un poco de azúcar selector de CSS incluido con el JavaScript de vainilla.

var radios = document.querySelectorAll('input[type="radio"]:checked');
var value = radios.length>0? radios[0].value: null;

No hay una necesidad real de jQuery aquí, querySelectorAll es ampliamente compatible ahora.

Editar: solucioné un error con el selector css, he incluido las comillas, aunque puede omitirlas, en algunos casos no puede, por lo que es mejor dejarlas.

Matt McCabe
fuente
puede ser var radios = document.querySelectorAll ('input [type = "radio"]: check');
Md. Shafiqur Rahman
@ShafiqurRahman tienes toda la razón, actualizaré mi respuesta, no creo que necesites las citas en la radio.
Matt McCabe
3
+1 para JavaScript de vainilla. Siempre usaría las comillas alrededor de los valores de los atributos, ya que para algunos otros valores de atributos, (como a[href^="http://"]) serían necesarios, y la consistencia es más fácil de mantener. Además, esto permite que la declaración de atributo coincida con el HTML correspondiente.
Manngo
11

código HTML

<input type="radio" name="offline_payment_method" value="Cheque" >
<input type="radio" name="offline_payment_method" value="Wire Transfer" >

Código Javascript:

var off_payment_method = document.getElementsByName('offline_payment_method');
var ischecked_method = false;
for ( var i = 0; i < off_payment_method.length; i++) {
    if(off_payment_method[i].checked) {
        ischecked_method = true;
        break;
    }
}
if(!ischecked_method)   { //payment method button is not checked
    alert("Please choose Offline Payment Method");
}
Amit Sharma
fuente
2
Advertencia: este código devuelve la advertencia emergente tan pronto como se carga la página.
samthebrand
11

Puedes usar este sencillo script. Puede tener varios botones de opción con los mismos nombres y valores diferentes.

var checked_gender = document.querySelector('input[name = "gender"]:checked');

if(checked_gender != null){  //Test if something was checked
alert(checked_gender.value); //Alert the value of the checked.
} else {
alert('Nothing checked'); //Alert, nothing was checked.
}
Neri
fuente
+1. Esta es la solución Vanilla JS más corta para obtener el elemento de radio verificado, lo que necesitamos en algunos casos. Creo que tienes la mejor respuesta debido a esto. Y por solo obtener valor que podríamos usardocument.forms[0].elements['nameOfRadioList'].value
Bharata hace
9

Los guiones de esta página me ayudaron a encontrar el guión a continuación, que creo que es más completo y universal. Básicamente, validará cualquier número de botones de radio en un formulario, lo que significa que se asegurará de que se haya seleccionado una opción de radio para cada uno de los diferentes grupos de radio dentro del formulario. Por ejemplo, en el formulario de prueba a continuación:

   <form id="FormID">

    Yes <input type="radio" name="test1" value="Yes">
    No <input type="radio" name="test1" value="No">

    <br><br>

    Yes <input type="radio" name="test2" value="Yes">
    No <input type="radio" name="test2" value="No">

   <input type="submit" onclick="return RadioValidator();">

El script RadioValidator se asegurará de que se haya dado una respuesta tanto para 'test1' como para 'test2' antes de enviar. Puede tener tantos grupos de radio en el formulario e ignorará cualquier otro elemento del formulario. Todas las respuestas de radio faltantes se mostrarán dentro de una sola ventana emergente de alerta. Aquí va, espero que ayude a la gente. Cualquier corrección de errores o modificaciones útiles son bienvenidas :)

<SCRIPT LANGUAGE="JAVASCRIPT">
function RadioValidator()
{
    var ShowAlert = '';
    var AllFormElements = window.document.getElementById("FormID").elements;
    for (i = 0; i < AllFormElements.length; i++) 
    {
        if (AllFormElements[i].type == 'radio') 
        {
            var ThisRadio = AllFormElements[i].name;
            var ThisChecked = 'No';
            var AllRadioOptions = document.getElementsByName(ThisRadio);
            for (x = 0; x < AllRadioOptions.length; x++)
            {
                 if (AllRadioOptions[x].checked && ThisChecked == 'No')
                 {
                     ThisChecked = 'Yes';
                     break;
                 } 
            }   
            var AlreadySearched = ShowAlert.indexOf(ThisRadio);
            if (ThisChecked == 'No' && AlreadySearched == -1)
            {
            ShowAlert = ShowAlert + ThisRadio + ' radio button must be answered\n';
            }     
        }
    }
    if (ShowAlert != '')
    {
    alert(ShowAlert);
    return false;
    }
    else
    {
    return true;
    }
}
</SCRIPT>
Trelamenos
fuente
6

Tenga en cuenta este comportamiento con jQuery al obtener valores de entrada de radio:

$('input[name="myRadio"]').change(function(e) { // Select the radio input group

    // This returns the value of the checked radio button
    // which triggered the event.
    console.log( $(this).val() ); 

    // but this will return the first radio button's value,
    // regardless of checked state of the radio group.
    console.log( $('input[name="myRadio"]').val() ); 

});

Por $('input[name="myRadio"]').val()lo tanto , no devuelve el valor verificado de la entrada de radio, como es de esperar, devuelve el valor del primer botón de radio.

Bradley Flood
fuente
4

Con mootools ( http://mootools.net/docs/core/Element/Element )

html:

<input type="radio" name="radiosname" value="1" />
<input type="radio" name="radiosname" value="2" id="radiowithval2"/>
<input type="radio" name="radiosname" value="3" />

js:

// Check if second radio is selected (by id)
if ($('radiowithval2').get("checked"))

// Check if third radio is selected (by name and value)
if ($$('input[name=radiosname][value=3]:checked').length == 1)


// Check if something in radio group is choosen
if ($$('input[name=radiosname]:checked').length > 0)


// Set second button selected (by id)
$("radiowithval2").set("checked", true)
marbel82
fuente
// Comprueba si algo en el grupo de radio se elige si ($$ ('input [name = radiosname]: check'). Length> 0) era exactamente lo que necesitaba
Steve Johnson
3

Esta es una función de utilidad que he creado para resolver este problema

    //define radio buttons, each with a common 'name' and distinct 'id'. 
    //       eg- <input type="radio" name="storageGroup" id="localStorage">
    //           <input type="radio" name="storageGroup" id="sessionStorage">
    //param-sGroupName: 'name' of the group. eg- "storageGroup"
    //return: 'id' of the checked radioButton. eg- "localStorage"
    //return: can be 'undefined'- be sure to check for that
    function checkedRadioBtn(sGroupName)
    {   
        var group = document.getElementsByName(sGroupName);

        for ( var i = 0; i < group.length; i++) {
            if (group.item(i).checked) {
                return group.item(i).id;
            } else if (group[0].type !== 'radio') {
                //if you find any in the group not a radio button return null
                return null;
            }
        }
    }
Gene Myers
fuente
1
Me gusta esto porque es (re) usabilidad y simplicidad. Además, el valor devuelto puede ser manejado por una buena declaración de cambio.
JGurtz
3

Esto sería válido para botones de radio que comparten el mismo nombre, no se necesita JQuery.

var x = Array.prototype.filter.call(document.getElementsByName('checkThing'), function(x) { return x.checked })[0];

Si estamos hablando de casillas de verificación y queremos una lista con las casillas marcadas compartiendo un nombre:

var x = Array.prototype.filter.call(document.getElementsByName('checkThing'), function(x) { return x.checked });
Uxio
fuente
3
if(document.querySelectorAll('input[type="radio"][name="name_of_radio"]:checked').length < 1)
MD Shafiqur Rahman
fuente
2

solo una pequeña modificación a Mark Biek;

CÓDIGO HTML

<form name="frm1" action="" method="post">
  <input type="radio" name="gender" id="gender_Male" value="Male" />
  <input type="radio" name="gender" id="gender_Female" value="Female" / >
  <input type="button" value="test"  onclick="check1();"/>
</form>

y código Javascript para verificar si el botón de radio está seleccionado

<script type="text/javascript">
    function check1() {            
        var radio_check_val = "";
        for (i = 0; i < document.getElementsByName('gender').length; i++) {
            if (document.getElementsByName('gender')[i].checked) {
                alert("this radio button was clicked: " + document.getElementsByName('gender')[i].value);
                radio_check_val = document.getElementsByName('gender')[i].value;        
            }        
        }
        if (radio_check_val === "")
        {
            alert("please select radio button");
        }        
    }
</script>
Parag
fuente
1
getElementsByName () devuelve una colección HTMLC, que no tendría una propiedad marcada, por lo que no creo que el fragmento de JavaScript que publicaste funcione como se esperaba. Tendría que recorrer los elementos en la colección HTMLC y ver si alguno de ellos está marcado, como lo han sugerido otros.
Rudi
Gracias. estás en lo correcto. :) actualicé mi respuesta, para que no más personas reciban información incorrecta.
Parag
2

Hay una forma muy sofisticada de validar si alguno de los botones de radio está marcado con ECMA6 y el método .some().

HTML:

<input type="radio" name="status" id="marriedId" value="Married" />
<input type="radio" name="status" id="divorcedId" value="Divorced" />

Y javascript:

let htmlNodes = document.getElementsByName('status');

let radioButtonsArray = Array.from(htmlNodes);

let isAnyRadioButtonChecked = radioButtonsArray.some(element => element.checked);

isAnyRadioButtonCheckedserá truesi alguno de los botones de radio está marcado y falsesi ninguno de ellos está marcado.

OlegI
fuente
2

Devuelve todos los elementos marcados en el botón de radio

  Array.from(document.getElementsByClassName("className")).filter(x=>x['checked']);
Ashish
fuente
1

http://www.somacon.com/p143.php/

function getCheckedValue(radioObj) {
    if(!radioObj)
        return "";
    var radioLength = radioObj.length;
    if(radioLength == undefined)
        if(radioObj.checked)
            return radioObj.value;
        else
            return "";
    for(var i = 0; i < radioLength; i++) {
        if(radioObj[i].checked) {
            return radioObj[i].value;
        }
    }
    return "";
}
keithics
fuente
1

Con JQuery, otra forma de verificar el estado actual de los botones de opción es obtener el atributo 'verificado'.

Por ejemplo:

<input type="radio" name="gender_male" value="Male" />
<input type="radio" name="gender_female" value="Female" />

En este caso, puede verificar los botones usando:

if ($("#gender_male").attr("checked") == true) {
...
}
Claudio Query
fuente
1
En mi caso, el valor de $("#gender_male").attr("checked")es una cadena "checked"y no un booleano.
Koks_rs
1

Este código alertará al botón de radio seleccionado cuando se envíe el formulario. Usó jQuery para obtener el valor seleccionado.

$("form").submit(function(e) {
  e.preventDefault();
  $this = $(this);

  var value = $this.find('input:radio[name=COLOR]:checked').val();
  alert(value);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form>
  <input name="COLOR" id="Rojo" type="radio" value="red">
  <input name="COLOR" id="Azul" type="radio" value="blue">
  <input name="COLOR" id="Amarillo" type="radio" value="yellow">
  <br>
  <input type="submit" value="Submit">
</form>

Christian Juth
fuente
1

Solía operador propagación y algunos para comprobar menos un elemento de la matriz pasa la prueba.

Comparto por quien se preocupe.

var checked = [...document.getElementsByName("gender")].some(c=>c.checked);
console.log(checked);
<input type="radio" name="gender" checked value="Male" />
<input type="radio" name="gender"  value="Female" / >

Hien Nguyen
fuente
0

Aquí está la solución que se amplía para no seguir adelante con el envío y enviar una alerta si los botones de opción no están marcados. ¡Por supuesto, esto significaría que tienes que desmarcarlos para empezar!

if(document.getElementById('radio1').checked) {
} else if(document.getElementById('radio2').checked) {
} else {
  alert ("You must select a button");
  return false;
}

Solo recuerde configurar la identificación ('radio1', 'radio2' o como se llame) en el formulario para cada uno de los botones de radio o el script no funcionará.

Steve
fuente
Usted simplemente puede hacer: if (!document.getElementById('radio1').checked && !document.getElementById('radio2').checked) { alert(); }.
insertusernamehere
0

Un ejemplo:

if (!checkRadioArray(document.ExamEntry.level)) { 
    msg+="What is your level of entry? \n"; 
    document.getElementById('entry').style.color="red"; 
    result = false; 
} 

if(msg==""){ 
    return result;  
} 
else{ 
    alert(msg) 
    return result;
} 

function Radio() { 
    var level = radio.value; 
    alert("Your level is: " + level + " \nIf this is not the level your taking then please choose another.") 
} 

function checkRadioArray(radioButtons) { 
    for(var r=0;r < radioButtons.length; r++) { 
        if (radioButtons[r].checked) { 
            return true; 
        } 
    } 
    return false; 
} 
usuario2194064
fuente
0

La forma

<form name="teenageMutant">
  <input type="radio" name="ninjaTurtles"/>
</form>

La secuencia de comandos

if(!document.teenageMutant.ninjaTurtles.checked){
  alert('get down');
}

El violín: http://jsfiddle.net/PNpUS/

gaby de wilde
fuente
0

Solo quiero asegurarme de que algo se seleccione (usando jQuery):

// html
<input name="gender" type="radio" value="M" /> Male <input name="gender" type="radio" value="F" /> Female

// gender (required)
var gender_check = $('input:radio[name=gender]:checked').val();
if ( !gender_check ) {
    alert("Please select your gender.");
    return false;
}

fuente
0

Si desea JavaScript vainilla, no desea saturar su marcado agregando ID en cada botón de opción , y solo se preocupa por los navegadores modernos , el siguiente enfoque funcional me resulta un poco más sabroso que un bucle for:

<form id="myForm">
<label>Who will be left?
  <label><input type="radio" name="output" value="knight" />Kurgan</label>
  <label><input type="radio" name="output" value="highlander" checked />Connor</label>
</label>
</form>

<script>
function getSelectedRadioValue (formElement, radioName) {
    return ([].slice.call(formElement[radioName]).filter(function (radio) {
        return radio.checked;
    }).pop() || {}).value;
}

var formEl = document.getElementById('myForm');
alert(
   getSelectedRadioValue(formEl, 'output') // 'highlander'
)
</script>

Si ninguna de las dos está marcada, volverá undefined(aunque podría cambiar la línea de arriba para devolver otra cosa, por ejemplo, para que se falsedevuelva, podría cambiar la línea relevante de arriba a:) }).pop() || {value:false}).value;.

También existe el enfoque prospectivo de polyfill ya que la interfaz RadioNodeList debería facilitar el uso de una valuepropiedad en la lista de elementos de radio secundarios de formulario (que se encuentra en el código anterior como formElement[radioName]), pero eso tiene sus propios problemas: cómo polyfill RadioNodeList ?

Brett Zamir
fuente
0

Esto también está funcionando, evitando llamar a una identificación de elemento pero llamándolo usando como un elemento de matriz.

El siguiente código se basa en el hecho de que una matriz, denominada grupo de botones de radio, está compuesta por elementos de botones de radio en el mismo orden en que se declararon en el documento html:

if(!document.yourformname.yourradioname[0].checked 
   && !document.yourformname.yourradioname[1].checked){
    alert('is this working for all?');
    return false;
}
Pietro Di Mascio
fuente
0

HTML:

<label class="block"><input type="radio" name="calculation" value="add">+</label>
<label class="block"><input type="radio" name="calculation" value="sub">-</label>
<label class="block"><input type="radio" name="calculation" value="mul">*</label>
<label class="block"><input type="radio" name="calculation" value="div">/</label>

<p id="result"></p>

JAVAScript:

var options = document.getElementsByName("calculation");

for (var i = 0; i < options.length; i++) {
    if (options[i].checked) {
        // do whatever you want with the checked radio
        var calc = options[i].value;
        }
    }
    if(typeof calc == "undefined"){
        document.getElementById("result").innerHTML = " select the operation you want to perform";
        return false;
}
vijay rami
fuente
-3

Proporcione botones de radio, el mismo nombre pero diferentes ID.

var verified1 = $('#SOME_ELEMENT1').val();
var verified2 = $('#SOME_ELEMENT2').val();
var final_answer = null;
if( $('#SOME_ELEMENT1').attr('checked') == 'checked' ){
  //condition
  final_answer = verified1;
}
else
{
  if($('#SOME_ELEMENT2').attr('checked') == 'checked'){
    //condition
    final_answer = verified2;
   }
   else
   {
     return false;
   }
}
CG_DEV
fuente