Jak mogę sprawdzić, czy przycisk JavaScript jest zaznaczony w JavaScript?

271

Mam dwa przyciski opcji w formularzu HTML. Okno dialogowe pojawia się, gdy jedno z pól jest puste. Jak mogę sprawdzić, czy przycisk opcji jest wybrany?

Nowicjusz
źródło
ten link może ci pomóc stackoverflow.com/questions/6654601/…
Ahmed Elbendary

Odpowiedzi:

330

Udawajmy, że masz taki HTML

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

Aby sprawdzić poprawność po stronie klienta, oto JavaScript, aby sprawdzić, który jest wybrany:

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

Powyższe może być bardziej wydajne w zależności od dokładnej natury twojego znacznika, ale to powinno wystarczyć, aby zacząć.


Jeśli chcesz tylko sprawdzić, czy jakiś przycisk opcji jest zaznaczony w dowolnym miejscu na stronie, PrototypeJS to bardzo proste.

Oto funkcja, która zwróci wartość true, jeśli przynajmniej jeden przycisk opcji zostanie wybrany gdzieś na stronie. Ponownie może to wymagać dostosowania w zależności od konkretnego kodu HTML.

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

W przypadku sprawdzania poprawności po stronie serwera (pamiętaj, że sprawdzanie poprawności nie może polegać wyłącznie na JavaScript!) , Zależy to od wybranego języka, ale sprawdzasz tylko genderwartość ciągu żądania.

Mark Biek
źródło
1
ale co chcę sprawdzić, czy przycisk opcji jest zaznaczony niezależnie od tego, co zostało wybrane.
noob
1
Nie podążam za tym, co mówisz? Czy interesuje Cię, czy zostanie wybrany ŻADNY przycisk opcji?
Mark Biek
tak. ponieważ formularz nie może zostać przesłany, jeśli nie wszystkie pola są wypełnione, w tym przyciski opcji.
noob
if (document.getElementById („gender_Male”). zaznaczone || document.getElementById („gender_Female”). zaznaczone) alert („niektóre z moich radioboksów są zaznaczone”);
Havenard
Zmodyfikowałem mój prototypowy przykład, aby skorzystać z lekcji selektora CSS, której właśnie nauczyłem się od R. Bemrose'a.
Mark Biek
111

Z jQuery byłoby to coś w rodzaju

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

Pozwól, że podzielę to na kawałki, aby jaśniej to zakryć. jQuery przetwarza rzeczy od lewej do prawej.

input[name=gender]:checked
  1. input ogranicza to do tagów wejściowych.
  2. [name=gender] ogranicza go do tagów o nazwie płeć w poprzedniej grupie.
  3. :checked ogranicza to do pól wyboru / przycisków opcji, które są wybrane w poprzedniej grupie.

Jeśli chcesz całkowicie tego uniknąć, zaznacz jeden z przycisków opcji jako zaznaczony ( checked="checked") w kodzie HTML, co zagwarantuje, że zawsze zostanie wybrany jeden przycisk opcji.

Władca
źródło
17
-1 do zaproponowania biblioteki, gdy jest niezadawana. W ten sposób możemy odpowiedzieć na wszystko za pomocą „włącz bibliotekę x, użyj x.doWhatYouNeed ()”. Żaden płomień nie jest zamierzony, naprawdę uważam, że na to pytanie należy odpowiedzieć czystym javascript (a następnie w końcu wskazać, jak łatwiej jest z biblioteką)
Riccardo Galli
23
@RiccardoGalli: Wiele osób już korzysta z jQuery, dlatego odpowiedź zaczyna się od „Z jQuery byłoby to coś w rodzaju”, gdyby już go używali.
Władca
1
Czy ktoś wie, czy można tak połączyć selektory? input [name = gender] [type = radio] lub input [name = gender, type = radio] tylko w celu dodatkowej weryfikacji?
Ty_
@ EW-CodeMonkey Pierwszy wspomniany sposób powinien działać .
Powerlord,
81

Waniliowy sposób 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
źródło
2
Cóż, mam teraz prawie ten sam problem, a twój kod był bardzo pomocny
MoreThanChaos
2
To dostarczy ci wartość ostatnio zaznaczonego przycisku opcji. Jeśli masz wiele grup radiowych, prawdopodobnie nie uzyskasz prawidłowej wartości.
styfle,
@styfle Działa to dobrze w przypadku pytania PO, w którym stwierdza, że ​​na stronie są tylko dwa przyciski opcji w formularzu. Rozwiązanie byłoby inne w przypadku innego scenariusza problemu, takiego jak więcej niż dwa przyciski radiowe, wiele grup radiowych itp. :)
Russ Cam
2
@RussCam Tak, działa to na małej stronie z tylko 2 przyciskami opcji, ale dodałem swój komentarz, aby uzupełnić odpowiedź. Najlepszym sposobem na zdobycie elementów przycisku opcji byłby name.
styfle
Lepszym sposobem byłoby wybranie elementów radiowych według określonej klasy, a następnie pogrupowanie różnych grup elementów radiowych w różne klasy. W przeciwnym razie takie rozwiązanie działałoby tylko dla jednej grupy elementów radiowych bez innych elementów formularza wejściowego.
Oliver,
15

Próbuję ulepszyć rozwiązanie Russ Cam, dodając cukier selektorowy CSS z waniliowym JavaScript.

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

Nie ma tutaj potrzeby używania jQuery, querySelectorAll jest teraz wystarczająco obsługiwany.

Edycja: naprawiłem błąd w selektorze css, umieściłem cytaty, chociaż możesz je pominąć, w niektórych przypadkach nie możesz, więc lepiej je zostawić.

Matt McCabe
źródło
być może powinno być var ​​radios = document.querySelectorAll ('input [type = "radio”]: zaznaczone');
Md. Shafiqur Rahman
@ShafiqurRahman masz absolutną rację, zaktualizuję moją odpowiedź, nie sądzę, że potrzebujesz cytatów z radia.
Matt McCabe
3
+1 dla Vanilla JavaScript. Zawsze używałbym cudzysłowów wokół wartości atrybutów, ponieważ dla niektórych innych wartości atrybutów (takich jak a[href^="http://"]) byłyby one wymagane, a spójność jest łatwiejsza do utrzymania. Poza tym pozwala to deklaracji atrybutu dopasować odpowiedni HTML.
Manngo,
11

Kod HTML

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

Kod 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
źródło
2
Ostrzeżenie: ten kod zwraca ostrzeżenie wyskakujące, gdy tylko strona się załaduje.
samthebrand
11

Możesz użyć tego prostego skryptu. Możesz mieć wiele przycisków opcji o takich samych nazwach i różnych wartościach.

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
źródło
+1. Jest to najkrótsze rozwiązanie Vanilla JS, aby uzyskać sprawdzony element radiowy, czego w niektórych przypadkach potrzebujemy. Myślę, że dzięki temu masz najlepszą odpowiedź. I tylko dla uzyskania wartości, której moglibyśmy użyćdocument.forms[0].elements['nameOfRadioList'].value
Bharata
9

Skrypty na tej stronie pomogły mi wymyślić poniższy skrypt, który moim zdaniem jest bardziej kompletny i uniwersalny. Zasadniczo sprawdzi poprawność dowolnej liczby przycisków opcji w formularzu, co oznacza, że ​​upewni się, że wybrano opcję opcji dla każdej z różnych grup opcji w formularzu. np. w poniższym formularzu testu:

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

Skrypt RadioValidator upewni się, że udzielono odpowiedzi zarówno na „test1”, jak i „test2” przed przesłaniem. W formularzu możesz mieć tyle grup radiowych, co zignoruje wszelkie inne elementy formularza. Wszystkie brakujące odpowiedzi radiowe pojawią się w oknie podręcznym jednego ostrzeżenia. Mam nadzieję, że to pomoże ludziom. Wszelkie naprawy błędów i pomocne modyfikacje są mile widziane :)

<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
źródło
6

Zwróć uwagę na to zachowanie związane z jQuery podczas pobierania wartości wejściowych radia:

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

});

Tak $('input[name="myRadio"]').val()nie zwróci sprawdzenia wartości wejściowych radiowej, jak można się spodziewać - zwraca wartość pierwszego przycisku radiowego.

Bradley Flood
źródło
4

Z 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
źródło
// Sprawdź, czy wybrano coś w grupie radiowej, jeśli ($$ („input [name = radiosname]: selected”). Length> 0) było dokładnie tym, czego potrzebowałem
Steve Johnson
3

jest to funkcja narzędzia, którą stworzyłem, aby rozwiązać ten problem

    //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
źródło
1
Polub to, ponieważ jest (ponownie) użyteczna i prosta. Zwróconą wartość można również obsłużyć za pomocą ładnej instrukcji switch.
JGurtz
3

Dotyczy to przycisków radiowych o tej samej nazwie, nie wymaga JQuery.

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

Jeśli mówimy o polach wyboru i chcemy, aby lista z zaznaczonymi polami wyboru miała wspólną nazwę:

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

drobna modyfikacja Marka Bieka;

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

i kod Javascript, aby sprawdzić, czy wybrany jest przycisk opcji

<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
źródło
1
Metoda getElementsByName () zwraca wartość HTMLCollection, która nie miałaby sprawdzonej właściwości, więc nie sądzę, aby opublikowany fragment kodu JavaScript działał zgodnie z przeznaczeniem. Będziesz musiał zapętlić elementy w kolekcji HTMLCollection i sprawdzić, czy którykolwiek z nich jest zaznaczony, jak sugerują inni.
Rudi,
dzięki. masz rację. :) zaktualizowałem moją odpowiedź, aby więcej ludzi nie otrzymało błędnych informacji.
Parag
2

Istnieje bardzo wyrafinowany sposób na sprawdzenie, czy którykolwiek z przycisków opcji jest sprawdzany za pomocą ECMA6 i metody .some().

HTML:

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

I javascript:

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

let radioButtonsArray = Array.from(htmlNodes);

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

isAnyRadioButtonCheckedbędzie, truejeśli niektóre przyciski opcji są zaznaczone, a falseżaden z nich nie jest zaznaczony.

OlegI
źródło
2

Zwróć wszystkie zaznaczone elementy w przycisku opcji

  Array.from(document.getElementsByClassName("className")).filter(x=>x['checked']);
Ashish
źródło
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
źródło
1

W JQuery innym sposobem sprawdzenia aktualnego stanu przycisków opcji jest uzyskanie atrybutu „zaznaczone”.

Na przykład:

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

W takim przypadku możesz sprawdzić przyciski za pomocą:

if ($("#gender_male").attr("checked") == true) {
...
}
Claudio Query
źródło
1
W moim przypadku wartość $("#gender_male").attr("checked")jest łańcuchem, "checked"a nie wartością logiczną.
Koks_rs
1

Ten kod ostrzeże wybrany przycisk radiowy po przesłaniu formularza. Użył jQuery, aby uzyskać wybraną wartość.

$("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
źródło
1

Użyłem operatora rozkładania, a niektóre sprawdzają, czy przynajmniej jeden element w tablicy przechodzi test.

Podzielam się o kogo martwić.

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
źródło
0

Oto rozwiązanie, które zostało rozszerzone, aby nie kontynuować przesyłania i wysłać alert, jeśli przyciski radiowe nie są zaznaczone. Oczywiście oznaczałoby to, że musisz je odznaczyć na początek!

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

Pamiętaj tylko, aby ustawić identyfikator („radio1”, „radio2” lub jakkolwiek to nazwałeś) w formularzu dla każdego przycisku opcji, w przeciwnym razie skrypt nie będzie działał.

Steve
źródło
Można po prostu zrobić: if (!document.getElementById('radio1').checked && !document.getElementById('radio2').checked) { alert(); }.
inserttusernamehere
0

Przykład:

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; 
} 
użytkownik2194064
źródło
0

Formularz

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

Scenariusz

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

Skrzypce: http://jsfiddle.net/PNpUS/

gaby de wilde
źródło
0

Chcę tylko upewnić się, że coś zostanie wybrane (przy użyciu 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;
}

źródło
0

Jeśli chcesz waniliowy JavaScript, nie zaśmiecaj znaczników, dodając identyfikatory na każdym przycisku opcji, i dbasz tylko o nowoczesne przeglądarki , poniższe funkcjonalne podejście jest dla mnie trochę bardziej gustowne niż pętla 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>

Jeśli żadna z nich nie jest zaznaczona, zwróci undefined(chociaż możesz zmienić powyższą linię, aby zwrócić coś innego, np. Dostaćfalse , możesz zmienić odpowiednią linię powyżej na }).pop() || {value:false}).value;:).

Istnieje również przyszłościowe podejście do wypełniania pól, ponieważ interfejs RadioNodeList powinien ułatwić korzystanie z valuewłaściwości na liście elementów potomnych formularzy radiowych (znajdujących się w powyższym kodzie jako formElement[radioName]), ale wiąże się to z własnymi problemami: Sposób wypełniania RadioNodeList ?

Brett Zamir
źródło
0

Działa to również, unikając wywoływania identyfikatora elementu, ale wywołując go jako element tablicy.

Poniższy kod opiera się na fakcie, że tablica o nazwie grupa przycisków radiobuttons składa się z elementów przycisków radiobuttonów w tej samej kolejności, w jakiej zostały zadeklarowane w dokumencie HTML:

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

Podaj przyciski radiowe, tę samą nazwę, ale różne identyfikatory.

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
źródło