【问题标题】:How to get the selected radio button’s value?如何获取选中的单选按钮的值?
【发布时间】:2021-12-29 22:18:16
【问题描述】:

我的 JS 程序出现了一些奇怪的问题。我让这个工作正常,但由于某种原因它不再工作。我只想找到单选按钮的值(选择了哪个)并将其返回给变量。出于某种原因,它不断返回undefined

这是我的代码:

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>

【问题讨论】:

标签: javascript html for-loop radio-button


【解决方案1】:

编辑: 正如 Chips_100 所说,您应该使用:

var sizes = document.theForm[field];

直接不使用测试变量。


旧答案:

你不应该eval这样吗?

var sizes = eval(test);

我不知道它是如何工作的,但对我来说你只是在复制一个字符串。

【讨论】:

  • eval 不是这里的最佳选择...您可能想说var sizes = document.theForm[field]; 并删除第一个分配,因此不再使用test 变量。
  • 据我所知, eval 会按原样工作吗?还是仅适用于 eval('var sizes=document.theForm.' + field)
  • 你的回答 var sizes = eval(test); 中的 eval 语句会这样工作(我只是在 firebug 中测试它)。
  • 这更有意义,但是在我将field 放在括号中的那一行上,我收到了一个错误“Unexpected token [”。有什么猜测吗?
【解决方案2】:

你可以这样做:

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

编辑:感谢 HATCHA 和 jpsetung 的编辑建议。

【讨论】:

  • 这适用于 jquery 1.7 但现在 jQuery 1.9 的正确语法是 $('input[name="genderS"]:checked').val(); (删除@)
  • 我相信@ 的语法是deprecated even earlier 而不是(jquery 1.2)
  • @TomPietrosanti 文档似乎有点偏离,jsfiddle.net/Xxxd3/608 适用于 1.8.3。无论如何,@ 绝对应该被删除
  • 是的,看起来他们在那里留下了一些向后兼容性,但没有更新文档以匹配。我记得当他们放弃了一些仍在广泛使用的已弃用功能时发生了一些喧嚣,因此他们重新添加了支持。也许这就是为什么...
  • document.querySelector() 现在应该是直接使用 JavaScript 的推荐方法了。
【解决方案3】:

试试这个

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

小提琴here

【讨论】:

    【解决方案4】:

    这是一个没有使用 Checked="checked" 属性的收音机示例

    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/ [点击查找而不选择任何电台]

    来源(来自我的博客):http://bloggerplugnplay.blogspot.in/2013/01/validateget-checked-radio-value-in.html

    【讨论】:

      【解决方案5】:
      document.forms.your-form-name.elements.radio-button-name.value
      

      【讨论】:

      • 这也可以:document.forms.your-form-name.name-shared-by-radio-buttons.value
      • 我想大多数人都忽略了这一点。接受的答案有效。 Giorgos Tsakonas 的回答更好。但这是一个基本正确的答案。这就是单选按钮的实际工作方式。请注意,如果未选择任何内容,则返回一个空字符串。
      • @Web_Designer 你的评论不应该是一个真正的答案吗?
      • 如果您的无线电输入不在表单中,这将不起作用,所以我认为这不是比 querySelector 更好的答案,也许这两个应该合并。
      • 如果您的收音机在标签内,这种方式就行不通
      【解决方案6】:
          var value = $('input:radio[name="radiogroupname"]:checked').val();
      

      【讨论】:

        【解决方案7】:

        从 jQuery 1.8 开始,查询的正确语法是

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

        不再是$('input[@name="genderS"]:checked').val();,它在 jQuery 1.7 中工作(使用 @)。

        【讨论】:

          【解决方案8】:

          这适用于任何资源管理器。

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

          这是获取任何输入类型值的简单方法。 你也确实需要包含jQuery路径。

          【讨论】:

          • 使用 document.querySelector() 是一个纯 JavaScript 答案:developer.mozilla.org/en-US/docs/Web/API/document.querySelector
          • 如果将其存储在变量中并且未选择单选按钮,则会导致浏览器停止。控制台说:TypeError document.querySelector(...)null
          • 只有选择了一个才有效。所以你应该先检查一下。 var selector = document.querySelector('input[name="genderS"]:checked'); if(selector) console.log(selector.value);
          • 我正在使用 Meteor 中的模板,而 :checked 的技巧完全为我所用.. 对我来说,从 Meteor 模板表单中读取单选按钮的修复方法是 accountType = template.find("[name='optradio']:checked").value;
          • @markus-zeller 在现代浏览器中,您可以使用链接运算符 (.?) 来防止无效,例如document.querySelector('input[name="genderS"]:checked')?.value;
          【解决方案9】:

          使用纯 javascript,您可以处理对调度事件的对象的引用。

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

          【讨论】:

            【解决方案10】:

            这是纯 JavaScript,基于 @Fontas 的回答,但如果没有选中单选按钮,则使用安全代码返回空字符串(并避免 TypeError):

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

            代码分解如下:

            • 第 1 行:获取对控件的引用,该控件 (a) 是 &lt;input&gt; 类型,(b) 具有 name 属性的 genderS,并且 (c) 已检查。
            • 第 2 行:如果有这样的控件,则返回其值。如果没有,则返回一个空字符串。如果第 1 行找到控件,则 genderSRadio 变量为真,否则为空/假。

            对于 JQuery,请使用 @jbabey 的答案,并注意如果没有选中的单选按钮,它将返回 undefined

            【讨论】:

              【解决方案11】:
               <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"> 
              

              等然后只使用

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

              或者

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

              【讨论】:

                【解决方案12】:
                 document.querySelector('input[name=genderS]:checked').value
                

                【讨论】:

                  【解决方案13】:

                  如果有人在寻找答案并像我一样来到这里,您可以从 Chrome 34 和 Firefox 33 执行以下操作:

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

                  或更简单:

                  alert(document.theForm.genderS.value);
                  

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

                  【讨论】:

                  • 我真的猜这是今天的首选方式。然而,人们也可以通过querySelector 选择表单,它也可以正常工作:const form = document.querySelector('form[name="somename"]')。也可以使用radios.value = {value} 设置radios 的值。但是,直接选择无线电(例如document.querySelectorAll('input[name="some_radio"]'))将起作用,因为它返回NodeList 而不是RadioNodeList。这就是为什么你必须先选择表格。
                  【解决方案14】:

                  ECMAScript 6 版本

                  let genderS = Array.from(document.getElementsByName("genderS")).find(r => r.checked).value;
                  

                  【讨论】:

                    【解决方案15】:

                    如果您可以为表单 element() 分配一个 Id,这种方式可以被认为是一种安全的替代方式(特别是当单选组元素名称在文档中不是唯一的时):

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

                    【讨论】:

                      【解决方案16】:

                      假设您需要在表单中放置不同行的单选按钮,每个单选按钮具有单独的属性名称('option1'、'option2' 等)但类名相同。也许您需要它们在多行中,它们将根据与问题有关的 1 到 5 的比例分别提交一个值。你可以这样写你的javascript:

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

                      我还将最终输出插入到隐藏的表单元素中,以便与表单一起提交。

                      【讨论】:

                        【解决方案17】:

                        这是使用纯 JavaScript 获取选中单选按钮值的好方法:

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

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

                        使用此 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>
                        

                        您还可以使用Array Find checked 属性来查找选中的项目:

                        Array.from(form.elements.characters).find(radio => radio.checked);
                        

                        【讨论】:

                        • 这是一个非常好的答案! querySelector :checked 是一个不错的技巧,但我也喜欢 .find() 方法。
                        【解决方案18】:

                        我喜欢使用方括号从输入中获取值,它比使用点更清晰。

                        document.forms['form_name']['input_name'].value;
                        

                        【讨论】:

                          【解决方案19】:

                          首先,向 ashraf aaref 致敬,我想扩展一下他的回答。

                          正如 MDN Web Docs 建议的那样,使用 RadioNodeList 是首选方法:

                          // Get the form
                          const form = document.forms[0];
                          
                          // Get the form's radio buttons
                          const radios = form.elements['color'];
                          
                          // You can also easily get the selected value
                          console.log(radios.value);
                          
                          // Set the "red" option as the value, i.e. select it
                          radios.value = 'red';
                          

                          但也可以通过querySelector 选择表单,它也可以正常工作:

                          const form = document.querySelector('form[name="somename"]')
                          

                          但是,直接选择无线电将工作,因为它返回一个简单的NodeList

                          document.querySelectorAll('input[name="color"]')
                          // Returns: NodeList [ input, input ]
                          

                          首先选择表单时返回RadioNodeList

                          document.forms[0].elements['color']
                          // document.forms[0].color # Shortcut variant
                          // document.forms[0].elements['complex[naming]'] # Note: shortcuts do not work well with complex field names, thus `elements` for a more programmatic aproach
                          // Returns: RadioNodeList { 0: input, 1: input, value: "red", length: 2 }
                          

                          这就是为什么你必须先选择表单,然后调用elements 方法。除了所有 input 节点之外,RadioNodeList 还包括一个属性 value,它可以实现这种简单的操作。

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

                          【讨论】:

                          • +1。很好解释。我正在寻找解释使用 elements 和使用快捷方式变体之间区别的答案。感谢那!快捷方式变体是否适用于所有主流浏览器?
                          【解决方案20】:

                          我更喜欢使用formdata object,因为它表示提交表单时应该发送的值。

                          Demo:

                          let formData = new FormData(document.querySelector("form"));
                          console.log(`The value is: ${formData.get("choice")}`);
                          <form>
                              <p>Pizza crust:</p>
                              <p>
                                  <input type="radio" name="choice" value="regular" >
                                  <label for="choice1id">Regular crust</label>
                              </p>
                              <p>
                                  <input type="radio" name="choice" value="deep" checked >
                                  <label for="choice2id">Deep dish</label>
                              </p>
                          </form>

                          【讨论】:

                            猜你喜欢
                            • 2015-06-26
                            • 2013-03-28
                            • 1970-01-01
                            • 2012-07-18
                            相关资源
                            最近更新 更多