取消选中复选框后,从收音机中删除“已选中”

时间:2015-03-17 00:10:24

标签: javascript jquery forms checkbox radio-button

我有一个复选框(#FBmngCH),在点击时会显示一组单选按钮(name=adManage)。如果未选中该复选框,则先前选中的单选按钮仍将保持选中状态。一旦取消选中该复选框,我希望删除单选按钮的已检查状态。

这是在一个表单中使用,所以如果用户改变他们关于选择该服务的想法,我也希望擦除该服务的细节(因此所选收音机的值不会在PHP中结束)最终是电子邮件)。我希望这是有道理的。

我给了它相当长的一段时间,似乎并没有让它正常工作。最后一组if语句是我编写的代码的一部分。不确定我是否遗漏了某些东西,选择了错误的东西,或者是什么。任何帮助都将受到高度赞赏。谢谢!

HTML

<li>
    <input type="checkbox" class="cbox" name="FBchecks[]" value="Facebook Ad MGMT" id="FBmngCH">
    <label for="test">Facebook Ad Management</label>
    <ul id="FBmngList">
        <li>
            <input type="radio" name="adManage" value="Ad Management 1" id="adMan1">
            <label for="adMan1">Ad Fund - 1</label>
        </li>
        <li>
            <input type="radio" name="adManage" value="Ad Management 2" id="adMan2">
            <label for="adMan2">Ad Fund - 2</label>
        </li>
        <li>
            <input type="radio" name="adManage" value="Ad Management 3" id="adMan3">
            <label for="adMan3">Ad Fund - 3</label>
        </li>
        <li>
            <input type="radio" name="adManage" value="Ad Management 4" id="adMan4">
            <label for="adMan4">Ad Fund - 4</label>
        </li>
        <div id="FBADerror" class="acctError"></div>
    </ul>
</li>

JS

$FBmngCH = $("#FBmngCH");
$FBmngList = $("#FBmngList");

//hide FB Management List
$FBmngList.hide();

//on FB Management select
$FBmngCH.click(function() {
    //toggle FB Management List
    $FBmngList.toggle();
});

$FBadValid = false;
$FBADerror = $("#FBADerror");

//if FB Ad Management is checked
if ($FBmngCH.attr('checked')) function validateFB() {
   $("input[name=adManage]").each(function () {   //LoopingthroughradioButtons
    // "this" is the current element(radio) in the loop
      if ($(this).is(':checked')) {
            $FBadValid = true; //Radio Button is Checked);
      }

      if ($FBadValid.attr = true ) {
            $FBADerror.empty();
      }
   });
};
if ($FBmngCH.blur($FBadValid.attr = false)) {
    $FBADerror.append("<li> Please select a Facebook Ad plan. </li>");
    //appends error to document
}   
if ($FBmngCH.blur($FBmngCH.not('checked'))) {
    $("input[name=adManage]").each(function () {
        if ($(this).is(':checked')) {
            $("input[name=adManage]").removeAttr('checked');
        }
    });
    //remove checks from radios
};  
$("input[name=adManage]").click(validateFB);

2 个答案:

答案 0 :(得分:1)

也许我不理解您的要求,但您不能只在复选框事件例程中测试它并取消选中已选中的单选按钮:

$FBmngCH.click(function () {
    //toggle FB Management List
    $FBmngList.toggle();
    if (!$FBmngList.attr('checked')) {
        $FBmngList.find('input:checked').attr('checked', false);
    }
});

请参阅this Fiddle.

答案 1 :(得分:0)

您的代码中的错误很少:

if ($FBmngCH.blur($FBadValid.attr = false)) {

这是不正确的语法。它应该是:

$FBmngCH.blur(function(){
    if ($FBadValid === false) {

    }
});

基本上,由于您在不检查任何条件的情况下切换整个无线电部分并愿意删除其:checked属性,因此您不需要循环或if($(this).is(':checked'))语句。只需从所有无线电中删除:checked属性即可。您还可以在没有if条件的情况下在每个复选框单击时显示错误消息,因为整个部分仍然是隐藏的。

您最终应该使用非常短的代码,例如:

$FBmngCH = $("#FBmngCH");
$FBmngList = $("#FBmngList").hide();
$FBADerror = $("#FBADerror");

$FBmngCH.click(function() {
    // no need for loops and if's there. Radios and the message are hidden.
    $FBmngList.toggle();
    $FBADerror.html("<li> Please select a Facebook Ad plan. </li>"); 
    $("input[name=adManage]").prop('checked', false);
});

$("input[name=adManage]").click(function(){
    // no need for loops there. Radios and the message are hidden.
    // Also, no need for if($(this).is(':checked')){. Since it's a click handler, something has to be :checked on radio click.
    $FBADerror.empty();
});

DEMO