0

我有一个附加到一组单选输入的单击事件处理程序,并且想查看我是否单击了已选择的单选按钮(已设置属性“已检查”)。我认为事件处理程序将以菊花链方式运行(首先在单击时调用我的事件处理程序,然后继续沿链向下执行单击的默认行为)。显然情况并非如此,因为当我评估我刚刚单击的单选按钮上的“已检查”属性是否为真时,它总是在我的单击事件处理程序中返回真。

默认行为已经处理了单击,并且已经将“checked”属性应用于我刚刚单击的单选按钮。同样,我认为我的 click 事件处理程序将在默认行为之前处理。更奇怪的是,即使我阻止了默认行为,它仍然为“checked”属性返回 true。我认为这是因为 'change' 事件正在处理 'checked' 属性,因此阻止我的 click 事件处理程序的默认行为不会影响任何事情。

$("input[type='radio']").click(function(e) {
  e.preventDefault();

  alert($(this).prop("checked")); // always returns true; i want prop value immediately prior to click
});

我怎样才能实现我所追求的?也就是说,查看刚刚单击的单选按钮是否已被选中。谢谢。

4

4 回答 4

2

根据@Jeffman 的回复,我能够为我需要做的事情找到一些工作。我有自定义按钮,只能选择其中一个(因此使用单选按钮)。但是,如果您单击已选择的那个,它应该取消选择并选择默认值。

我必须做的事情。处理单选标签上的 mousedown 事件。如果我单击已选择的收音机,请将默认按钮设置为“选中”。否则,我只需选择已单击的按钮。我必须禁用这些按钮上的“单击”事件,因为这会覆盖我对单选按钮的不规则处理(由于某种原因,当我覆盖它并手动选择默认选项时,选择会迅速回到单击的那个) . 这也意味着我需要手动触发更改事件,因为我在那里执行自定义单选按钮样式。

$(".radios > label").mousedown(function(e) {

var l = $(this); // label
var t = l.parent(); // container for radio group
var i = l.find("input"); // input element of this label

if(i.prop("checked")) { // clicking on the already selected button
    t.find(".default_radio input").prop("checked", true).trigger("change");     
} else {
    i.prop("checked", true).trigger("change");
}
}).bind('click',false);

$("input[type='radio']").change(function(e) {

    // style the buttons here
});
于 2013-10-27T22:30:09.643 回答
1

通过 mousedown 单击之前保存收音机状态

var was_checked;  
  $( "#radio" ).mousedown(function() {       
     was_checked = $(this)[0].checked;             
  });

  $( "#radio" ).click(function() {               
        $(this).attr('checked', !was_checked);      
  });
于 2014-01-10T16:50:43.283 回答
0

这是一个可以解决问题的示例代码

<script>
$(function() {
    var radios = {};

    $("input[type='radio']").each(function() {
        radios[$(this).uniqueId().attr('id')] = false;
    });
    function resetRadioState() {
        $("input[type='radio']").each(function() {
            radios[$(this).attr('id')] = $(this).is(':checked');
        });
    }
    resetRadioState();
    $("input[type='radio']").click(function(e) {
        alert(radios[$(this).attr('id')]);
        resetRadioState();
    });
})
</script>

<input type="radio" name="group[]"/>
<input type="radio" name="group[]" checked/>
于 2013-10-27T20:58:15.807 回答
0

我认为你也应该返回false。不仅防止默认

于 2013-10-27T20:21:47.960 回答