单选按钮的OnChange事件处理程序(INPUT type =“radio”)不能作为一个值工作

时间:2012-01-12 16:35:32

标签: javascript html cross-browser

我正在为此寻找一个通用的解决方案。

考虑具有相同名称的2个无线电类型输入。提交时,检查的那个确定使用以下格式发送的值:

<input type="radio" name="myRadios" onchange="handleChange1();" value="1" />
<input type="radio" name="myRadios" onchange="handleChange2();" value="2" />

取消选中单选按钮时,不会触发更改事件。因此,如果已选择值为“1”的无线电并且用户选择第二个,则handleChange1()不会运行。这给我带来了一个问题(无论如何),因为没有任何事情可以让我发现这种取消选择。

我想要的是复选框组值的onchange事件的解决方法,或者是一个oncheck事件,它不仅检测收音机的时间,还检测未选中的时间。

我相信你们中的一些人之前遇到过这个问题。有哪些解决方法(或理想情况下处理此问题的正确方法)?我只是想捕捉改变事件,访问先前检查的无线电以及新检查的无线电。

P.S。
onclick似乎是一个更好的(跨浏览器)事件来指示何时检查无线电但它仍然无法解决未检查的问题。

我认为为什么onchange for checkbox类型在这种情况下工作是有道理的,因为它会更改它在检查或取消选中时提交的值。我希望单选按钮的行为更像是SELECT元素的onchange,但你能做什么......

18 个答案:

答案 0 :(得分:145)

var rad = document.myForm.myRadios;
var prev = null;
for (var i = 0; i < rad.length; i++) {
    rad[i].addEventListener('change', function() {
        (prev) ? console.log(prev.value): null;
        if (this !== prev) {
            prev = this;
        }
        console.log(this.value)
    });
}
<form name="myForm">
  <input type="radio" name="myRadios"  value="1" />
  <input type="radio" name="myRadios"  value="2" />
</form>

这是一个JSFiddle演示:https://jsfiddle.net/crp6em1z/

答案 1 :(得分:94)

我会做两处修改:

<input type="radio" name="myRadios" onclick="handleClick(this);" value="1" />
<input type="radio" name="myRadios" onclick="handleClick(this);" value="2" />
  1. 使用onclick处理程序代替onchange - 您正在更改无线电输入的“已检查状态”,而不是value,因此不会发生更改事件。< / LI>
  2. 使用单个函数,并将this作为参数传递,这样可以轻松检查当前选择的值。
  3. ETA:与您的handleClick()功能一起,您可以在页面范围的变量中跟踪广播的原始/旧值。那就是:

    var currentValue = 0;
    function handleClick(myRadio) {
        alert('Old value: ' + currentValue);
        alert('New value: ' + myRadio.value);
        currentValue = myRadio.value;
    }
    

答案 2 :(得分:31)

从这个示例中可以看出:http://jsfiddle.net/UTwGS/

HTML:

<label><input type="radio" value="1" name="my-radio">Radio One</label>
<label><input type="radio" value="2" name="my-radio">Radio One</label>

jQuery:

$('input[type="radio"]').on('click change', function(e) {
    console.log(e.type);
});

选择单选按钮选项时会触发clickchange事件(至少在某些浏览器中)。

我还应该指出,在我的示例中,当您使用制表符和键盘选择选项时,click事件仍然会被解雇

所以,我的观点是,即使某些浏览器触发了change事件,click事件也应该提供您需要的覆盖范围。

答案 3 :(得分:6)

我认为除了存储以前的状态之外没有任何其他方法。 这是jQuery的解决方案

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 
<script type="text/javascript">
    var lastSelected;
    $(function () {
        //if you have any radio selected by default
        lastSelected = $('[name="myRadios"]:checked').val();
    });
    $(document).on('click', '[name="myRadios"]', function () {
        if (lastSelected != $(this).val() && typeof lastSelected != "undefined") {
            alert("radio box with value " + $('[name="myRadios"][value="' + lastSelected + '"]').val() + " was deselected");
        }
        lastSelected = $(this).val();
    });
</script>

<input type="radio" name="myRadios" value="1" />
<input type="radio" name="myRadios" value="2" />
<input type="radio" name="myRadios" value="3" />
<input type="radio" name="myRadios" value="4" />
<input type="radio" name="myRadios" value="5" />

在考虑了一点之后,我决定摆脱变量并添加/删除类。这是我得到的:http://jsfiddle.net/BeQh3/2/

答案 4 :(得分:6)

您可以添加以下JS脚本

<script>
    function myfunction(event) {
        alert('Checked radio with ID = ' + event.target.id);
    }
    document.querySelectorAll("input[name='gun']").forEach((input) => {
        input.addEventListener('change', myfunction);
    });
</script>

答案 5 :(得分:5)

我意识到这是一个老问题,但这段代码对我有用。也许未来有人会发现它很有用:

<h2>Testing radio functionality</h2>
<script type="text/javascript">var radioArray=[null];</script>
<input name="juju" value="button1" type="radio" onclick="radioChange('juju','button1',radioArray);" />Button 1
<input name="juju" value="button2" type="radio" onclick="radioChange('juju','button2',radioArray);" />Button 2
<input name="juju" value="button3" type="radio" onclick="radioChange('juju','button3',radioArray);" />Button 3
<br />

<script type="text/javascript">
function radioChange(radioSet,radioButton,radioArray)
  {
  //if(radioArray instanceof Array) {alert('Array Passed');}
  var oldButton=radioArray[0];
  if(radioArray[0] == null)
    {
    alert('Old button was not defined');
    radioArray[0]=radioButton;
    }
  else
    {
    alert('Old button was set to ' + oldButton);
    radioArray[0]=radioButton;
    }
  alert('New button is set to ' + radioArray[0]);
  }
</script>

答案 6 :(得分:5)

如何使用Jquery的更改事件?

$(function() {
    $('input:radio[name="myRadios"]').change(function() {
        if ($(this).val() == '1') {
            alert("You selected the first option and deselected the second one");
        } else {
            alert("You selected the second option and deselected the first one");
        }
    });
});

jsfiddle:http://jsfiddle.net/f8233x20/

答案 7 :(得分:4)

正如你在这里看到的: http://www.w3schools.com/jsref/event_onchange.asp 单选按钮不支持onchange属性。

由您链接的第一个SO问题为您提供答案:改为使用onclick事件并检查其触发的函数内的单选按钮状态。

答案 8 :(得分:4)

是当前所选单选按钮没有更改事件。但问题是每个单选按钮被视为一个单独的元素。相反,无线电组应被视为单个元素,如select。因此,该组触发了更改事件。如果它是select元素,我们从不担心其中的每个选项,但只选择所选的选项。当选择新选项时,我们将当前值存储在变量中,该变量将成为先前的值。同样,您必须使用单独的变量来存储已检查单选按钮的值。

如果要识别上一个单选按钮,则必须循环mousedown事件。

var radios = document.getElementsByName("myRadios");
var val;
for(var i = 0; i < radios.length; i++){
    if(radios[i].checked){
        val = radios[i].value;
    }
}

请参阅:http://jsfiddle.net/diode/tywx6/2/

答案 9 :(得分:4)

将先前检查的无线电存储在变量中:
http://jsfiddle.net/dsbonev/C5S4B/

HTML

<input type="radio" name="myRadios" value="1" /> 1
<input type="radio" name="myRadios" value="2" /> 2
<input type="radio" name="myRadios" value="3" /> 3
<input type="radio" name="myRadios" value="4" /> 4
<input type="radio" name="myRadios" value="5" /> 5

JS

var changeHandler = (function initChangeHandler() {
    var previousCheckedRadio = null;

    var result = function (event) {
        var currentCheckedRadio = event.target;
        var name = currentCheckedRadio.name;

        if (name !== 'myRadios') return;

        //using radio elements previousCheckedRadio and currentCheckedRadio

        //storing radio element for using in future 'change' event handler
        previousCheckedRadio = currentCheckedRadio;
    };

    return result;
})();

document.addEventListener('change', changeHandler, false);

JS示例代码

var changeHandler = (function initChangeHandler() {
    var previousCheckedRadio = null;

    function logInfo(info) {
        if (!console || !console.log) return;

        console.log(info);
    }

    function logPrevious(element) {
        if (!element) return;

        var message = element.value + ' was unchecked';

        logInfo(message);
    }

    function logCurrent(element) {
        if (!element) return;

        var message = element.value + ' is checked';

        logInfo(message);
    }

    var result = function (event) {
        var currentCheckedRadio = event.target;
        var name = currentCheckedRadio.name;

        if (name !== 'myRadios') return;

        logPrevious(previousCheckedRadio);
        logCurrent(currentCheckedRadio);

        previousCheckedRadio = currentCheckedRadio;
    };

    return result;
})();

document.addEventListener('change', changeHandler, false);

答案 10 :(得分:2)

这只是我的头脑,但你可以为每个单选按钮执行onClick事件,为它们提供所有不同的ID,然后在事件中进行for循环以遍历组中的每个单选按钮,通过查看“已检查”属性查找已检查的内容。已检查的id将作为变量存储,但您可能希望首先使用temp变量来确保该变量的值发生更改,因为无论是否选中了新的单选按钮,click事件都会触发。

答案 11 :(得分:2)

最简便,更全面的功能

使用getAttribute只读无线电输入

document.addEventListener('input',(e)=>{

if(e.target.getAttribute('name')=="myRadios")
console.log(e.target.value)
})
<input type="text"  value="iam text" /> 
<input type="radio" name="myRadios" value="1" /> 1
<input type="radio" name="myRadios" value="2" /> 2

答案 12 :(得分:2)

如果您想避免使用内联脚本,只需在收音机上收听点击事件即可。这可以通过听取

上的点击事件使用普通的Javascript来实现
for (var radioCounter = 0 ; radioCounter < document.getElementsByName('myRadios').length; radioCounter++) {
      document.getElementsByName('myRadios')[radioCounter].onclick = function() {
        //VALUE OF THE CLICKED RADIO ELEMENT
        console.log('this : ',this.value);
      }
}

答案 13 :(得分:2)

<input type="radio" name="brd" onclick="javascript:brd();" value="IN">   
<input type="radio" name="brd" onclick="javascript:brd();" value="EX">` 
<script type="text/javascript">
  function brd() {alert($('[name="brd"]:checked').val());}
</script>

答案 14 :(得分:1)

这对我有用

<input ID="TIPO_INST-0" Name="TIPO_INST" Type="Radio" value="UNAM" onchange="convenio_unam();">UNAM

<script type="text/javascript">
            function convenio_unam(){
                if(this.document.getElementById('TIPO_INST-0').checked){
                    $("#convenio_unam").hide();
                }else{
                    $("#convenio_unam").show(); 
                }                               
            }
</script>

答案 15 :(得分:0)

这是最容易和最有效的功能,只需添加任意数量的按钮,你可以使用checked = false,并使每个单选按钮的onclick事件调用此函数。为每个收音机指定一个唯一的号码 按钮

function AdjustRadios(which) 
{
    if(which==1)
         document.getElementById("rdpPrivate").checked=false;
    else if(which==2)
         document.getElementById("rdbPublic").checked=false;
}

答案 16 :(得分:0)

出于某种原因,最好的答案对我不起作用。

我通过使用改善了最佳答案

    var overlayType_radio = document.querySelectorAll('input[type=radio][name="radio_overlaytype"]');

最初的最佳答案使用:

      var rad = document.myForm.myRadios;

其他人保持不变,最后对我有用。

var overlayType_radio = document.querySelectorAll('input[type=radio][name="radio_overlaytype"]');
                              console.log('overlayType_radio', overlayType_radio)

                              var prev = null;
                              for (var i = 0; i < overlayType_radio.length; i++) {
                                  overlayType_radio[i].addEventListener('change', function() {
                                      (prev) ? console.log('radio prev value',prev.value): null;
                                      if (this !== prev) {
                                          prev = this;
                                      }
                                      console.log('radio now value ', this.value)
                                  });
                              }

html是:

<div id='overlay-div'>
                        <fieldset>
                                <legend> Overlay Type </legend>
                                
                                <p>
                                    <label>
                                      <input class='with-gap' id='overlayType_image' value='overlayType_image' name='radio_overlaytype' type='radio' checked/>
                                      <span>Image</span> 
                                    </label>
                                </p>

                                <p>
                                  <label>
                                    <input class='with-gap' id='overlayType_tiled_image' value='overlayType_tiled_image' name='radio_overlaytype' type='radio' disabled/>
                                    <span> Tiled Image</span>   
                                </p>

                                <p>
                                  <label>
                                    <input class='with-gap' id='overlayType_coordinated_tile' value='overlayType_coordinated_tile' name='radio_overlaytype' type='radio'  disabled/>
                                    <span> Coordinated Tile</span>  
                                </p>

                                <p>
                                  <label>
                                    <input class='with-gap' id='overlayType_none' value='overlayType_none' name='radio_overlaytype' type='radio'/>
                                    <span> None </span>            
                                  </p>

                                  
                          </fieldset>
                       </div>

 var overlayType_radio = document.querySelectorAll('input[type=radio][name="radio_overlaytype"]');
                                  console.log('overlayType_radio', overlayType_radio)

                                  var prev = null;
                                  for (var i = 0; i < overlayType_radio.length; i++) {
                                      overlayType_radio[i].addEventListener('change', function() {
                                          (prev) ? console.log('radio prev value',prev.value): null;
                                          if (this !== prev) {
                                              prev = this;
                                          }
                                          console.log('radio now value ', this.value)
                                      });
                                  }
<div id='overlay-div'>
                            <fieldset>
                                    <legend> Overlay Type </legend>
                                    
                                    <p>
                                        <label>
                                          <input class='with-gap' id='overlayType_image' value='overlayType_image' name='radio_overlaytype' type='radio' checked/>
                                          <span>Image</span> 
                                        </label>
                                    </p>

                                    <p>
                                      <label>
                                        <input class='with-gap' id='overlayType_tiled_image' value='overlayType_tiled_image' name='radio_overlaytype' type='radio' />
                                        <span> Tiled Image</span>   
                                    </p>

                                    <p>
                                      <label>
                                        <input class='with-gap' id='overlayType_coordinated_tile' value='overlayType_coordinated_tile' name='radio_overlaytype' type='radio'  />
                                        <span> Coordinated Tile</span>  
                                    </p>

                                    <p>
                                      <label>
                                        <input class='with-gap' id='overlayType_none' value='overlayType_none' name='radio_overlaytype' type='radio'/>
                                        <span> None </span>            
                                      </p>

                                      
                              </fieldset>
                           </div>

jsfiddle click here

https://jsfiddle.net/hoogw/jetmkn02/1/

答案 17 :(得分:-1)

<script>
    function radioClick(radio){
        alert()
    }
</script>

<label>Cash on delivery</label>
<input type="radio" onclick="radioClick('A')" name="payment_method" class="form-group">

<br>

<label>Debit/Credit card, GPay, Paytm etc..</label>
<input type="radio" onclick="radioClick('B')" name="payment_method" class="form-group">