Como posso verificar se um botão de opção está selecionado com JavaScript?

271

Eu tenho dois botões de opção em um formulário HTML. Uma caixa de diálogo aparece quando um dos campos é nulo. Como posso verificar se um botão de opção está selecionado?

novato
fonte
este link pode ajudá-lo a stackoverflow.com/questions/6654601/…
Ahmed Elbendary

Respostas:

330

Vamos fingir que você tem HTML assim

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

Para validação do lado do cliente, veja alguns Javascript para verificar qual deles está selecionado:

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

O exposto acima pode ser mais eficiente, dependendo da natureza exata da sua marcação, mas isso deve ser suficiente para você começar.


Se você está apenas olhando para ver se algum botão de opção está selecionado em qualquer lugar da página, o PrototypeJS facilita muito.

Aqui está uma função que retornará true se pelo menos um botão de opção estiver selecionado em algum lugar da página. Novamente, isso pode precisar ser ajustado dependendo do seu HTML específico.

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

Para a validação no servidor (lembre-se, você não pode depender inteiramente do Javascript para validação!) , Isso dependeria do idioma de sua escolha, mas você apenas verificaria o gendervalor da sequência de solicitação.

Mark Biek
fonte
1
mas o que eu quero verificar se um botão de opção está selecionado independentemente do que está selecionado.
14/09/09
1
Eu realmente não sigo o que você está dizendo? Está interessado em selecionar QUALQUER botão de opção ou não?
Mark Biek 14/09/09
sim. porque o formulário não pode ser enviado se nem todos os campos forem preenchidos, incluindo os botões de opção.
214/09 noob
if (document.getElementById ('gender_Male'). verificado || document.getElementById ('gender_Female'). verificado) alert ('algumas das minhas caixas de rádio estão marcadas');
Havenard 14/09/09
Modifiquei meu exemplo de protótipo para aproveitar a lição do seletor de CSS que acabei de aprender com R. Bemrose.
Mark Biek 14/09/09
111

Com o jQuery , seria algo como

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

Deixe-me dividir isso em pedaços para cobrir mais claramente. O jQuery processa as coisas da esquerda para a direita.

input[name=gender]:checked
  1. input limita a entrada de tags.
  2. [name=gender] limita-o a tags com o nome gender no grupo anterior.
  3. :checked limita-o a caixas de seleção / botões de opção selecionados no grupo anterior.

Se você quiser evitar isso completamente, marque um dos botões de opção como marcado ( checked="checked") no código HTML, o que garantiria que um botão de opção esteja sempre selecionado.

Powerlord
fonte
17
-1 para propor uma biblioteca quando não solicitada. Dessa forma, poderíamos responder a tudo com "incluir biblioteca x, use x.doWhatYouNeed ()". Sem chama pretendida, eu realmente acho que essa questão deve ser respondida com javascript puro (e, eventualmente, apontar como que é mais fácil com uma biblioteca)
Riccardo Galli
23
@RiccardoGalli: Muitas pessoas já usam o jQuery, por isso a resposta começa com "Com o jQuery, seria algo parecido" no caso de eles já estarem usando.
Powerlord 21/09/12
1
Alguém sabe se é possível encadear seletores como este? input [name = gender] [type = radio] ou input [name = gender, type = radio] apenas para validação extra?
17773 Tyre
@ EW-CodeMonkey A primeira maneira que você mencionou deve funcionar .
Powerlord
81

Uma maneira JavaScript baunilha

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
fonte
2
Bem, eu tenho quase o mesmo problema agora e seu código foi muito útil
MoreThanChaos
2
Isso forneceria o valor do último botão de opção marcado. Se você tiver vários grupos de rádio, provavelmente não obterá o valor correto.
Styfle 5/10
@styfle Isso funciona bem para a pergunta do OP, onde ele afirma que existem apenas dois botões de opção em um formulário na página. A solução seria diferente para um cenário problema diferente, como mais de dois botões de rádio, vários grupos de rádio, etc :)
Russ Cam
2
@RussCam Sim, isso funciona para uma pequena página com apenas 2 botões de opção, mas adicionei meu comentário para completar a resposta. A melhor maneira de obter os elementos do botão de opção seria name.
Styfle 9/10/12
Uma maneira melhor seria selecionar elementos de rádio por uma classe específica e depois agrupar diferentes grupos de elementos de rádio em classes diferentes. Caso contrário, essa solução funcionaria apenas para um grupo de elementos de rádio sem outros elementos de formulário de entrada.
Oliver
15

Apenas tentando melhorar a solução de Russ Cam com um pouco de açúcar seletor de CSS inserido no JavaScript baunilha.

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

Não há necessidade real de jQuery aqui, o querySelectorAll é amplamente suportado agora.

Edit: corrigido um bug com o seletor css, eu incluí as aspas, embora você possa omiti-las, em alguns casos você não pode, por isso é melhor deixá-las.

Matt McCabe
fonte
pode ser que deva ser var radios = document.querySelectorAll ('input [type = "radio"]: selected');
Md. Shafiqur Rahman
@ ShafiqurRahman você está absolutamente certo, vou atualizar minha resposta, acho que você não precisa de citações sobre rádio.
22816 Matt McCabe
3
+1 para o Vanilla JavaScript. Eu sempre usaria aspas em torno dos valores dos atributos, pois para alguns outros valores de atributos (como a[href^="http://"]) eles seriam necessários e a consistência é mais sustentável. Além disso, isso permite que a declaração do atributo corresponda ao HTML correspondente.
Manngo 22/07
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
fonte
2
Aviso: esse código retorna o aviso pop-up assim que a página é carregada.
samthebrand
11

Você pode usar esse script simples. Você pode ter vários botões de opção com os mesmos nomes e 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
fonte
+1. Esta é a solução Vanilla JS mais curta para obter o elemento de rádio verificado, o que precisamos em alguns casos. Eu acho que você tem a melhor resposta por causa disso. E por apenas obter valor que poderíamos usardocument.forms[0].elements['nameOfRadioList'].value
Bharata
9

Os scripts desta página me ajudaram a criar o script abaixo, que eu acho mais completo e universal. Basicamente, ele validará qualquer número de botões de opção em um formulário, o que significa que garantirá que uma opção de opção tenha sido selecionada para cada um dos diferentes grupos de opções do formulário. por exemplo, no formulário de teste abaixo:

   <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();">

O script RadioValidator garantirá que uma resposta seja dada para 'test1' e 'test2' antes de ser enviada. Você pode ter tantos grupos de rádio no formulário e ele ignorará quaisquer outros elementos do formulário. Todas as respostas de rádio ausentes serão exibidas dentro de um único pop-up de alerta. Aqui vai, espero que ajude as pessoas. Quaisquer correções de erros ou modificações úteis são bem-vindas :)

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

Observe esse comportamento com o jQuery ao obter valores de entrada de rádio:

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

});

Portanto $('input[name="myRadio"]').val(), não retorna o valor verificado da entrada de rádio, como seria de esperar - ele retorna o valor do primeiro botão de opção.

Bradley Flood
fonte
4

Com 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
fonte
// Verifique se há algo no grupo de rádio é escolhido if ($$ ( 'input [name = radiosname]: verificada') comprimento> 0.) Foi exatamente o que eu precisava
Steve Johnson
3

esta é uma função utilitária que eu criei 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
fonte
1
Assim porque é (re) usabilidade e simplicidade. Além disso, o valor retornado pode ser tratado por uma boa declaração switch.
JGurtz
3

Isso seria válido para botões de opção que compartilham o mesmo nome, não é necessário JQuery.

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

Se estamos falando de caixas de seleção e queremos uma lista com as caixas de seleção marcadas, compartilhando um nome:

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

apenas uma pequena modificação em 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>

e código Javascript para verificar se o botão de opção está selecionado

<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
fonte
1
getElementsByName () retorna um HTMLCollection, que não teria uma propriedade marcada, por isso não acredito que o snippet de JavaScript que você postou funcionaria como pretendido. Você precisaria fazer um loop sobre os elementos no HTMLCollection e ver se algum deles está marcado, como outros sugeriram.
Rudi
obrigado. você está correto. :) atualizou minha resposta, para que mais pessoas não consigam informações erradas.
Parag
2

Existe uma maneira muito sofisticada de validar se algum dos botões de opção é verificado com o ECMA6 e o ​​método .some().

Html:

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

E javascript:

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

let radioButtonsArray = Array.from(htmlNodes);

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

isAnyRadioButtonCheckedserá truese alguns dos botões de opção estiverem marcados e falsese nenhum deles estiver marcado.

OlegI
fonte
2

Retornar todos os elementos marcados no botão de opção

  Array.from(document.getElementsByClassName("className")).filter(x=>x['checked']);
Ashish
fonte
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
fonte
1

Com o JQuery, outra maneira de verificar o status atual dos botões de opção é obter o atributo 'verificado'.

Por exemplo:

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

Nesse caso, você pode verificar os botões usando:

if ($("#gender_male").attr("checked") == true) {
...
}
Claudio Query
fonte
1
No meu caso, o valor de $("#gender_male").attr("checked")é uma string "checked"e não um booleano.
Koks_rs
1

Este código alertará o botão de opção selecionado quando o formulário for enviado. Ele usou o jQuery para obter o valor selecionado.

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

Eu usei o operador spread e alguns para verificar pelo menos um elemento na matriz passa no teste.

Eu compartilho para quem preocupação.

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

Aqui está a solução que é expandida para não prosseguir com o envio e enviar um alerta se os botões de opção não estiverem marcados. É claro que isso significa que você precisa desmarcá-las para começar!

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

Lembre-se de definir o ID ('radio1', 'radio2' ou o que você chamou) no formato de cada um dos botões de opção ou o script não funcionará.

Steve
fonte
Você poderia simplesmente fazer: if (!document.getElementById('radio1').checked && !document.getElementById('radio2').checked) { alert(); }.
insertusernamehere
0

Um exemplo:

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; 
} 
user2194064
fonte
0

A forma

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

O script

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

O violino: http://jsfiddle.net/PNpUS/

gaby de wilde
fonte
0

Eu só quero garantir que algo seja selecionado (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;
}

fonte
0

Se você deseja JavaScript de baunilha, não deseja confundir sua marcação adicionando IDs em cada botão de opção e se preocupando apenas com navegadores modernos , a seguinte abordagem funcional é um pouco mais agradável para mim do que um loop 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>

Se nenhum deles estiver marcado, ele retornará undefined(embora você possa alterar a linha acima para retornar outra coisa, por exemplo, para falseretornar, você pode alterar a linha relevante acima para }).pop() || {value:false}).value;:).

Há também a abordagem de polyfill de previsão, uma vez que a interface RadioNodeList deve facilitar o uso de uma valuepropriedade na lista de elementos de rádio filho de formulário (encontrados no código acima como formElement[radioName]), mas que possui seus próprios problemas: Como polifill RadioNodeList ?

Brett Zamir
fonte
0

Isso também está funcionando, evitando chamar um ID de elemento, mas chamando-o usando como um elemento de matriz.

O código a seguir baseia-se no fato de que uma matriz, denominada grupo de botões de opção, é composta por elementos de botões de opção na mesma ordem em que foram declarados no documento html:

if(!document.yourformname.yourradioname[0].checked 
   && !document.yourformname.yourradioname[1].checked){
    alert('is this working for all?');
    return false;
}
Pietro Di Mascio
fonte
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
fonte
-3

Dê botões de opção com o mesmo nome, mas com IDs diferentes.

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
fonte