Як я можу перевірити, чи вибрано перемикач із JavaScript?


Відповіді:


330

Давайте зробимо вигляд, що у вас є такий HTML

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

Для перевірки на стороні клієнта, ось Javascript, щоб перевірити, який з них вибрано:

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

Сказане може бути більш ефективним залежно від точного характеру розмітки, але цього має бути достатньо для початку роботи.


Якщо ви просто хочете побачити, чи вибрана будь- яка радіо-кнопка де-небудь на сторінці, PrototypeJS робить це дуже просто.

Ось функція, яка поверне справжнє значення, якщо десь на сторінці буде вибрано хоча б одну перемикач. Знову ж, це, можливо, доведеться змінити залежно від конкретного HTML-коду.

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

Для перевірки на стороні сервера (пам’ятайте, ви не можете повністю залежати від Javascript для перевірки!) , Це залежатиме від вашої мови вибору, але ви хочете перевірити genderзначення рядка запиту.


1
але що я хочу перевірити, чи вибрано перемикач незалежно від того, що вибрано.
noob

1
Я насправді не стежу за тим, що ти кажеш? Вас цікавить, чи обрана будь-яка радіо кнопка?
Марк Бейк

так. оскільки форма не може бути подана, якщо не всі поля заповнені, включаючи перемикачі.
noob

if (document.getElementById ('gender_Male'.
Хавенард

Я змінив приклад «Прототипу», щоб скористатися уроком селектора CSS, який я тільки що дізнався від Р. Бемроуза.
Марк Бік

111

З jQuery це було б щось подібне

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

Дозвольте мені розбити це на частини, щоб ясніше це покрити. jQuery обробляє речі зліва направо.

input[name=gender]:checked
  1. input обмежує його введенням тегів.
  2. [name=gender] обмежує його тегами з іменем статі в попередній групі.
  3. :checked обмежує його прапорцями / перемикачами, вибраними в попередній групі.

Якщо ви хочете цього взагалі уникнути, позначте одну з перемикачів як встановлену ( checked="checked") у HTML-коді, що гарантувало б, що одна радіо кнопка завжди обрана.


17
-1 за пропозицію бібліотеки, коли її не вимагають. Таким чином ми могли б відповісти на все з "включати бібліотеку x, використовувати x.doWhatYouNeed ()". Немає полум'я, я щиро думаю, що на це питання слід відповісти чистим javascript (а згодом зазначити, як простіше з бібліотекою)
Riccardo Galli,

23
@RiccardoGalli: Багато людей вже використовують jQuery, отже чому відповідь починається з "З jQuery, це було б щось на зразок" у випадку, якщо вони вже використовували його.
Powerlord

1
Хтось знає, чи можна ланцюжкові селектори, як це? введення [ім'я = стать] [тип = радіо] або введення [ім'я = стать, тип = радіо] лише для додаткової перевірки?
Ty_

@ EW-CodeMonkey Перший спосіб, про який ви згадали, повинен працювати .
Powerlord

81

Ванільний спосіб 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;       
    }
}

2
Ну, у мене зараз майже та сама проблема, і ваш код був дуже корисним
MoreThanChaos

2
Це отримає значення останньої перевіреної радіо кнопки. Якщо у вас є кілька радіогруп, то це, ймовірно, не отримає правильного значення.
styfle

@styfle Це чудово справляється з питанням про ОП, де він стверджує, що на сторінці є лише дві радіо кнопки. Рішення було б іншим для різного сценарію проблем, таких як більше двох кнопок радіо, декілька радіогрупп тощо.
Russ Cam

2
@RussCam Так, це працює для крихітної сторінки з лише двома перемикачами, але я додав свій коментар, щоб відповідь була повною. Найкращий спосіб отримати елементи перемикача за допомогою name.
стайфл

Кращим способом було б виділення радіоелементів за певним класом, а потім групування різних груп радіоелементів у різні класи. В іншому випадку це рішення як би працює лише для однієї групи радіоелементів, без інших елементів вхідних форм.
Олівер

15

Просто намагаюся вдосконалити рішення Russ Cam з використанням деяких цукрових селекторів CSS, що вкинуті ванільним JavaScript.

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

Тут немає реальної потреби в jQuery, querySelectorAll досить широко підтримується.

Редагувати: виправлено помилку за допомогою селектора css, я включив цитати, хоча ви можете їх опустити, в деяких випадках не можете, тому краще залишити їх.


може бути, це має бути var radios = document.querySelectorAll ('input [type = "radio"]: перевірено');
Пані Шафікур Рахман

@ShafiqurRahman Ви абсолютно праві, я оновлю свою відповідь, я не думаю, що вам потрібні цитати навколо радіо.
Метт Маккейб

3
+1 для ванільного JavaScript. Я б завжди використовував лапки навколо значень атрибутів, оскільки для деяких інших значень атрибутів (таких як a[href^="http://"]) вони були б потрібні, а послідовність є більш ретельною. Крім того, це дозволяє декларації атрибутів відповідати відповідному HTML.
Манго

11

HTML-код

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

Код 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");
}

2
Попередження: цей код повертає спливаюче попередження, як тільки сторінка завантажується.
samthebrand

11

Ви можете використовувати цей простий сценарій. У вас може бути кілька радіо кнопок з однаковими назвами та різними значеннями.

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

+1. Це найкоротше рішення Vanilla JS, щоб отримати перевірений радіоелемент, що нам потрібно в деяких випадках. Я думаю, ти маєш найкращу відповідь через це. І тільки для отримання цінності, яку ми могли б використатиdocument.forms[0].elements['nameOfRadioList'].value
Бхарата

9

Сценарії на цій сторінці допомогли мені придумати нижченаведений сценарій, який, на мою думку, є більш повним та універсальним. В основному він підтверджує будь-яку кількість радіо кнопок у формі, тобто означає, що для кожної з різних радіогруп у формі вибрано параметр радіо. наприклад, у тестовій формі нижче:

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

Сценарій RadioValidator переконається, що відповідь була надана і для 'test1', і для 'test2', перш ніж вона подається. Ви можете мати стільки радіогруп у формі, і вона буде ігнорувати будь-які інші елементи форми. Усі відсутні відповіді на радіо відображатимуться в одному спливаючому вікні попередження. Ось так, я сподіваюся, що це допомагає людям. Будь-які виправлення помилок або корисні зміни вітаються :)

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

6

Зверніть увагу на цю поведінку з jQuery при отриманні значень вхідного радіо:

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

});

Таким $('input[name="myRadio"]').val()чином, не повертає перевірене значення радіовходу, як ви могли очікувати - воно повертає значення першої радіо кнопки.


4

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

// Перевірте, чи вибрано щось у радіогрупі, якщо ($$ ('input [name = radiosname]: перевірено'). Довжина> 0) було саме те, що мені потрібно
Стів Джонсон

3

це утиліта, яку я створив для вирішення цієї проблеми

    //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;
            }
        }
    }

1
Подобається це тому, що його (повторна) зручність і простота. Крім того, повернене значення може оброблятися приємним оператором перемикання.
JGurtz

3

Це справедливо для радіо кнопок, що мають одне й те саме ім'я, JQuery не потрібен.

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

Якщо ми говоримо про прапорці, і ми хочемо, щоб список із прапорцями встановив прапорець, щоб поділитися ім'ям:

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


2

просто модифікація біта ліла до Марка Біка;

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>

і код Javascript, щоб перевірити, чи вибрано радіо-кнопку

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

1
getElementsByName () повертає HTMLCollection, який би не мав перевіреного властивості, тому я не вірю, що фрагмент JavaScript, який ви опублікували, буде працювати за призначенням. Вам доведеться перевести елементи в HTMLCollection і побачити, чи перевіряється будь-який з них, як пропонують інші.
Руді

Дякую. ви праві. :) оновив мою відповідь, щоб більше людей не отримували неправильну інформацію.
Параг

2

Існує дуже складний спосіб перевірити, чи перевірена будь-яка з перемикачів за допомогою ECMA6 та методу .some().

Html:

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

І javascript:

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

let radioButtonsArray = Array.from(htmlNodes);

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

isAnyRadioButtonCheckedбуде, trueякщо деякі перемикачі перевірені, і falseякщо жодна з них не встановлена.


2

Повернути всі перевірені елементи в радіо-кнопці

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

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 "";
}

1

З JQuery, ще один спосіб перевірити поточний стан радіо кнопок - це отримати атрибут "перевірений".

Наприклад:

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

У цьому випадку ви можете перевірити кнопки, використовуючи:

if ($("#gender_male").attr("checked") == true) {
...
}

1
У моєму випадку значенням $("#gender_male").attr("checked")є рядок, "checked"а не булева.
Koks_rs

1

Цей код попередить вибрану перемикач при надходженні форми. Для отримання вибраного значення використовували jQuery.

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


1

Я використовував оператор розповсюдження, а деякі для перевірки хоча б одного елемента в масиві проходять тест.

Я поділяю, щодо кого хвилює.

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


0

Ось розширене рішення, щоб не продовжувати подання та надсилати попередження, якщо радіо кнопки не встановлені. Звичайно, це означає, що для початку ви повинні їх не перевірити!

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

Просто пам’ятайте, що встановити ідентифікатор («radio1», «radio2» або як би ви його не назвали) у формі для кожної з перемикачів або сценарій не працюватиме.


Ви можете просто зробити: if (!document.getElementById('radio1').checked && !document.getElementById('radio2').checked) { alert(); }.
Вставтекористування

0

Приклад:

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


0

Я просто хочу переконатися, що щось вибирається (використовуючи 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;
}

0

Якщо ви хочете, щоб ванільний JavaScript, не хотілося захаращувати свою розмітку, додаючи ідентифікатори на кожен перемикач і дбаєте лише про сучасні браузери , наступний функціональний підхід для мене трохи смачніший, ніж цикл 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>

Якщо не встановлено жодної позначки, вона повернеться undefined(хоча ви можете змінити рядок вище, щоб повернути щось інше, наприклад, щоб falseповернутись, ви можете змінити відповідний рядок вище на }).pop() || {value:false}).value;:).

Існує також перспективний підхід до заповнення поліфункції, оскільки інтерфейс RadioNodeList повинен полегшити просто використання valueвластивості у списку дочірніх радіоелементів (знайдений у наведеному вище коді як formElement[radioName]), але у цього є свої проблеми: Як заповнити RadioNodeList ?


0

Це також працює, уникаючи викликати ідентифікатор елемента, але викликати його, використовуючи як елемент масиву.

Наступний код заснований на тому, що масив, іменований як група радіо кнопок, складається з елементів radiobuttons у тому ж порядку, що і де задекларовано в html-документі:

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

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

-2

Укажіть радіо кнопки, однойменні, але різні ідентифікатори.

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;
   }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.