Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 阻止立即广播:单击事件时已选中属性_Javascript_Jquery - Fatal编程技术网

Javascript 阻止立即广播:单击事件时已选中属性

Javascript 阻止立即广播:单击事件时已选中属性,javascript,jquery,Javascript,Jquery,我有一个click事件处理程序连接到一组单选输入,并希望查看我是否正在单击已选中的单选按钮(已设置属性“选中”)。我认为事件处理程序将以菊花链的方式运行(首先在单击时调用我的事件处理程序,然后沿着链继续执行单击的默认行为)。显然情况并非如此,因为当我计算刚刚单击的单选按钮上的属性“checked”是否为true时,它在单击事件处理程序中总是返回true 单击已按默认行为处理,并已将“checked”属性应用于我刚才单击的单选按钮。同样,我认为我的点击事件处理程序将在默认行为之前被处理。更奇怪的是

我有一个click事件处理程序连接到一组单选输入,并希望查看我是否正在单击已选中的单选按钮(已设置属性“选中”)。我认为事件处理程序将以菊花链的方式运行(首先在单击时调用我的事件处理程序,然后沿着链继续执行单击的默认行为)。显然情况并非如此,因为当我计算刚刚单击的单选按钮上的属性“checked”是否为true时,它在单击事件处理程序中总是返回true

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

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

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

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

我想你也应该返回false。不仅仅是默认的

,这里还有一个示例代码可以实现这一点

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

$(函数(){
变量无线电={};
$(“输入[type='radio']”)。每个(函数(){
收音机[$(this).uniqueId().attr('id')]=false;
});
函数resetRadioState(){
$(“输入[type='radio']”)。每个(函数(){
收音机[$(this.attr('id')]=$(this.is(':checked');
});
}
重置放射性状态();
$(“输入[type='radio']”)。单击(函数(e){
警报(无线电[$(this).attr('id'));
重置放射性状态();
});
})

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

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

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

保存收音机状态,然后单击鼠标向下

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

  $( "#radio" ).click(function() {               
        $(this).attr('checked', !was_checked);      
  });

我认为您最好编写代码,在页面加载后立即捕获默认选中单选按钮的id属性,然后修改onclick代码,检查触发事件的单选按钮是否具有与您已存储的预选中id匹配的id。尝试与事件链的工作方式抗争可能只会带来挫折。由于您不能检查多个单选按钮,因此您可以跟踪上次检查的单选按钮并进行比较。捕获鼠标向下,而不是单击。Jeffman-看起来这样可以防止标签也注册为单选按钮的单击。plalx-这是一个考虑因素,但如果我在页面上有50个广播组,我不想跟踪每个组。如果有一个对所有人都有效的解决方案,那就太好了。如果停止鼠标向下,则停止单击,关联标签也将如此。如果您想要标签和按钮的单独处理程序(我不确定您是否这样说),您需要更复杂的逻辑。谢谢您的回答。我试图避免存储以前的值,因为当页面上有大量广播组时,这会变得很麻烦。我在寻找一个基于事件的解决方案,@Jeffman关于mousedown使用的说明让我找到了我想要的那种解决方案。见上文。