Javascript 我需要一个事件触发器的单选按钮,当它被取消选中,因为另一个按钮被选中

Javascript 我需要一个事件触发器的单选按钮,当它被取消选中,因为另一个按钮被选中,javascript,Javascript,我需要一个事件触发器的单选按钮,当它被取消选中,因为另一个按钮被选中 下面的代码应该说明我的困境 如果您注意到,html代码中的每个单选按钮和复选框都有一个onchange事件触发器。理论上,如果状态从“已检查”更改为“未检查”,则应触发onchange事件 这与复选框中的预期情况相同。如果您选中一个,则会收到警报“您的项目已更改为选中”。如果取消选中,则会收到警告“您的项目已更改为未选中” 使用单选按钮,当您选中按钮1时,您会像预期的那样收到警报,“您的项目已更改为选中”,因为该按钮已从未选中

我需要一个事件触发器的单选按钮,当它被取消选中,因为另一个按钮被选中

下面的代码应该说明我的困境

如果您注意到,html代码中的每个单选按钮和复选框都有一个onchange事件触发器。理论上,如果状态从“已检查”更改为“未检查”,则应触发onchange事件

这与复选框中的预期情况相同。如果您选中一个,则会收到警报“您的项目已更改为选中”。如果取消选中,则会收到警告“您的项目已更改为未选中”

使用单选按钮,当您选中按钮1时,您会像预期的那样收到警报,“您的项目已更改为选中”,因为该按钮已从未选中更改为选中。但是,当您选中第二个按钮且第一个单选按钮从选中更改为未选中时,“onchange”事件触发器不会触发,“else”警报不会触发

对我来说,这个问题是当一个单选按钮被另一个被选中的按钮取消选中时,会触发什么事件

我感谢大家在这方面的帮助

--基诺利

    <html>
<head>
<title></title>

<script type="text/javascript">

function clickAction() {

    //alert ('Your item changed');

    if (this.checked == true) {alert ('Your item is changed to checked');}

    else if (this.checked == false) {alert('Your item is changed to unchecked');}

}



</script>

<script type="text/javascript">

function initializeToggles() {

    var button1= document.getElementById('button1');
    button1.onchange = clickAction;

    var box1= document.getElementById('box1');
    box1.onchange = clickAction;

    var box2= document.getElementById('box2');
    box2.onchange = clickAction;

}

</script>

<script type="text/javascript">window.onload = initializeToggles;</script>

</head>
<body>

<input type="radio" name="testRadio" id="button1" >Button one<br/>
<input type="radio" name="testRadio" id="button2" >Button two<br/><br/>

<input type="checkbox" name="testCheckbox" id="box1" >Box one<br/>
<input type="checkbox" name="testCheckbox" id="box2" >Box two<br/><br/>

</body>
</html>

函数clickAction(){
//警报(“您的物品已更改”);
如果(this.checked==true){alert('您的项目已更改为checked');}
else如果(this.checked==false){alert('您的项目更改为unchecked');}
}
函数初始化切换(){
var button1=document.getElementById('button1');
button1.onchange=单击操作;
var box1=document.getElementById('box1');
box1.onchange=单击操作;
var box2=document.getElementById('box2');
box2.onchange=单击操作;
}
window.onload=初始化切换;
按钮一
按钮二

方框一
方框二


单选按钮未选中时,不存在任何事件。您可能可以使用
onpropertychange
事件,但这不是一个标准化事件,因此它可能只在Internet Explorer中工作


最安全的方法是在onchange事件中处理这个问题。如果您想知道哪个单选按钮未选中,则必须在变量中保留对当前选中元素的引用。

我来这里是为了寻找此类问题的快速解决方案,nuc的回答帮助我得出以下结论:

$(document).ready(function(){
  $('input[type=radio]').change(function() {
    var selected = $(this);
    $('input[type=radio]').each(function() {
      if $(this).attr('id') != selected.attr('id') {
        console.log( $(this).attr('value') + ' was deselected because ' + selected.attr('value') + ' was clicked.')
      }
    });
  });
});

我稍微修改了rthbound的代码以处理一组无线电输入,在我的例子中,它包含在
中。但是对于
来说,这很容易改变。此外,该代码更符合jQuery 1.9。一个普通的类会更好,从所选的收音机中选取一个类,并找到具有相同类的其他收音机输入,但我正在使用ASP.NET,这对我来说更快、更容易

$(document).ready(function(){
    $(document).on("change", "input[type='radio']", function () {
        var selected = $(this);
        $(this).closest("table").find("input[type='radio']").each(function () {
            if ($(this).attr("id") !== selected.attr("id")) {
                console.log($(this).attr("value") + " was deselected because " + selected.attr("value") + " was clicked.");
            }
        });
    });
});

我以一种通用的方式解决了这个问题:

每当更改单选按钮时:

  • 如果它们是由这个系统触发的-我们不想要无休止的循环
  • 查找其所有单选按钮好友
  • 触发他们的变化
  • 然后我可以测试单选按钮是否被选中

    $(function(){
        $('body').on('change', 'input[type="radio"]', function(e, by_other) {
            if (!by_other) {
              $("input[type='radio'][name='" + $(this).attr('name') + "']")
                .not(this)
                .trigger('change', true)
            }
        }
    }
    

    (我确实把它从coffeescript翻译成了javascript供你参考。)

    单选按钮有相同的名称,因此我们可以按名称选择它们。 因为取消选中收音机时,
    .change()
    不受影响,所以我们使用
    .click()
    代替

    $('input[name="your-radio-name"]').click(function() {
        var $radios = $('input[name="your-radio-name"]');
        for (var i = 0; i < $radios.length; i++) {
            var radio = $radios[i];
            if (radio != this) {
                radio = $(radio);
                // Process for unchecked radios here
            }
        }
    
        // Now, process for checked radio
        // alert(this.value + ' is checked'); Or
        alert($(this).val() + ' is checked');
    });
    
    $('input[name=“your radio name”]”)。单击(函数(){
    var$radios=$('input[name=“your radio name”]”);
    对于(变量i=0;i<$radios.length;i++){
    var无线电=$无线电[i];
    如果(收音机!=这个){
    无线电=$(无线电);
    //在此处处理未检查的无线电
    }
    }
    //现在,检查无线电的过程
    //警报(选中了this.value+);或
    警报($(此).val()+'已选中);
    });
    
    谢谢。这回答了我的问题。我想我可以创建一个“checked”元素的变量,并遍历它来重置这些元素。现在似乎有了这么多AJAX取消选中单选按钮的“OnOnSet”事件将非常有用。这实际上不适用于多个单选组-您需要检查name属性以确保它们实际上在同一组中。您是对的。。。这需要稍加修改。如果您已经调整了答案以处理多个组,请随意编辑答案。