【问题标题】:Javascript - RadioButton, onClick not toggling checkboxes using ONLY native JSJavascript - 单选按钮,onClick 不使用仅本机 JS 切换复选框
【发布时间】:2012-11-22 23:44:46
【问题描述】:

编辑:联系了教授;我不是实际上 [supposed] 在此作业中使用 jQuery,因为表单上的操作(例如教授的网站)不允许这样做。 Tyvm 致所有回复如此迅速和乐于助人的人。因此,我对纯原生的 JS 解决方案很感兴趣,以解决这些困难:

根据用户在面向 DOM 的表单中单击“是”还是“否”单选按钮,获取一组复选框来切换“打开或关闭”。这是(I:单选按钮,II:复选框)的 HTML:

I:) 单选按钮

<label> Subscribe to our Mailing List? </label>
   <input type="radio" name="raydeo" id="rad1" value="Yes" onclick="subscribe()"></input> 
        <label>Yes</label>
   <input type="radio" name="raydeo" id="rad2" value="No" onclick="subscribe()"></input> 
        <label>No</label>

II.) 复选框

<fieldset>
    <legend>Mailing List Subscriptions</legend>
    <br />
    <input type="checkbox" name="mailinglist" value="Corporate Press Release Emails" id="cor"></input><label> Corporate Press Release Emails</label>
    <br />
    <input type="checkbox" name="mailinglist" value="Upgrade Software Advertising List" id="sof"></input><label> Upgrade Software Advertising List</label>
    <br />
    <input type="checkbox" name="mailinglist" value="List given to spammers after buyout" id="lspa"></input><label> List given to spammers after buyout</label>
    <br />
    <input type="checkbox" name="mailinglist" value="The only non-cynical list" id="cyn"></input><label> The only non-cynical list</label>
    <br />
    <input type="checkbox" name="mailinglist" value="List to sell to spammers" id="tos"></input><label> List to sell to spammers</label>
    <br />
    <input type="checkbox" name="mailinglist" value="Spam List" id="spal"></input><label> Spam List</label>
    <br />
        </fieldset>

使用 Populating Checkboxes Based on Radio Button Click 等帖子中提供的基本原理,它仍然使用 jQuery,迄今为止我所做的最佳尝试是:

<script>
function subscribe(){
  //var yesPlease = document.getElementById("rad1");
  //var noThx = document.getElementById("rad2");
   var arr = new Array["cor", "sof", "lspa", "cyn", "tos", "spal"];
     //var hold = document.getElementById(arr[i]);
     //if(hold.getAttribute(arr[i]).checked = true && arr[i] >= 1){
     //document.getElementById("cor").innerHTML=hold.getAttribute("checked");
    var hold = document.getElementsByName("mailinglist")[0];

    for(var i = 0; i < arr.length; i++)
    {
      if(document.getElementById("rad1").checked==true)
      {
          hold.getAttribute(arr[i]).checked == true;
      }
        else if(document.getElementById("rad2").checked==true)
        {
            hold.getAttribute(arr[i]).checked == false;
        }
    }
}
</script>

当我加载我的文档并单击其中一个时,什么都没有发生。如果有帮助,这里是有关部分的屏幕截图:谢谢:

【问题讨论】:

  • 仅使用 (yesPlease.checked) 而不是 (yesPlease.checked == true),因为单选按钮是 check return boolean。
  • 不是问题,但$('input[type="checkbox"][name="mailinglist"]').prop("checked", true); 会在一行中完成所有复选框...

标签: javascript html checkbox radio-button


【解决方案1】:

您的代码运行良好:- 请参见此处:- http://jsfiddle.net/LeWbR/2/
我能想象到的唯一问题

  1. 您是否在页面中包含了 jquery。
  2. 您放置 JS 函数的位置。

如果您将值从 no wrap(body) 更改为 onDomReady 或 onLoad 不起作用。

function subscribe() {
    var yesPlease = document.getElementById("rad1");
    var noThx = document.getElementById("rad2");
    if(yesPlease.checked){
    //check all boxes
    $("#cor").prop("checked", true);
    $("#sof").prop("checked", true);
    $("#lspa").prop("checked", true);
    $("#cyn").prop("checked", true);
    $("#tos").prop("checked", true);
    $("#spal").prop("checked", true);
}
else if(noThx.checked) {
    //uncheck all boxes
    $("#cor").prop("checked", false);
    $("#sof").prop("checked", false);
    $("#lspa").prop("checked", false);
    $("#cyn").prop("checked", false);
    $("#tos").prop("checked", false);
    $("#spal").prop("checked", false);
}
}

【讨论】:

  • @Pranav 最初我将所有内容都嵌入到我的 html 文档 (formval.html) 中,之前下载了 jQuery 1.8.3 (jquer.js) 并保存到我的文件夹 ('fv'),我然后在 之后立即调用脚本,如下: 但它只是...不工作: (
  • 请将 jquery 包含在您的头中,并将您的 JS 脚本放入 然后尝试 ...
  • @Pranav 请看更新;这个任务实际上不接受 jQuery:教授的表单操作参数。不过,非常感谢 Pranav 对此事的关注。我需要一个仅 JS 的解决方案:/
【解决方案2】:

删除您的内联 javascript 代码并尝试在 js 文件本身中附加事件..

试试这个

$('#rad1,#rad2').on('click', function() {
        $('fieldset input[type="checkbox"]')
                               .prop('checked',this.value === 'Yes');
    }
});

Check Fiddle

【讨论】:

  • +1 用于更改选择器,尽管通过 name 属性进行选择可能会更好。您也可以删除 if/else:$('fieldset input[type="checkbox"]').prop('checked', this.value === 'Yes');
【解决方案3】:

这个简单的代码将解决问题,

HEAD 部分中的 JavaScript:

$(document).ready(function(){ 

    $(".radio-button").click(function(){

        if($(this).val() == "No")
            $(".checkbox-list input").attr("disabled", true);
        else
            $(".checkbox-list input").attr("disabled", false);

    });

})

还要在上面代码前加上jquery库CDN源码。

BODY部分中的标记:

<label> Subscribe to our Mailing List? </label>
<input type="radio" name="raydeo" id="rad1" value="Yes" onclick="subscribe()" class="radio-button"></input><label> Yes</label>
<input type="radio" name="raydeo" id="rad2" value="No" onclick="subscribe()" class="radio-button"></input><label> No</label>

<fieldset class="checkbox-list">
    <legend>Mailing List Subscriptions</legend>
    <br />
    <input type="checkbox" name="mailinglist" value="Corporate Press Release Emails" id="cor"></input><label> Corporate Press Release Emails</label>
    <br />
    <input type="checkbox" name="mailinglist" value="Upgrade Software Advertising List" id="sof"></input><label> Upgrade Software Advertising List</label>
    <br />
    <input type="checkbox" name="mailinglist" value="List given to spammers after buyout" id="lspa"></input><label> List given to spammers after buyout</label>
    <br />
    <input type="checkbox" name="mailinglist" value="The only non-cynical list" id="cyn"></input><label> The only non-cynical list</label>
    <br />
    <input type="checkbox" name="mailinglist" value="List to sell to spammers" id="tos"></input><label> List to sell to spammers</label>
    <br />
    <input type="checkbox" name="mailinglist" value="Spam List" id="spal"></input><label> Spam List</label>
    <br />
</fieldset>

还有第二个选项可以完成相同的任务,

HEAD 部分中的 JavaScript:

/* Solution - 2 */
function subscribe(ele)
{

    if(ele == "No")
            $(".checkbox-list input").attr("disabled", true);
    else
            $(".checkbox-list input").attr("disabled", false);


}

还要在上面代码前加上jquery库CDN源码。

正文部分MARKUP的变化:

<label> Subscribe to our Mailing List? </label>
<input type="radio" name="raydeo" id="rad1" value="Yes" onclick="subscribe(this.value)" class="radio-button"></input><label> Yes</label>
<input type="radio" name="raydeo" id="rad2" value="No" onclick="subscribe(this.value)" class="radio-button"></input><label> No</label>

【讨论】:

    【解决方案4】:

    单击单选按钮时,您需要一个操作处理程序。以便在单击时正确更新元素属性“checked”。

    下面的代码是从你的代码中编辑的,只包含所有输入类型收音机上的点击处理程序

    $(document).ready(function(){
    function subscribe() {
        $('input[type="radio"]').click(function(){
            var yesPlease = document.getElementById("rad1");
            var noThx = document.getElementById("rad2");
            if(yesPlease.checked == true){
                //check all boxes
                $("#cor").prop("checked", true);
                $("#sof").prop("checked", true);
                $("#lspa").prop("checked", true);
                $("#cyn").prop("checked", true);
                $("#tos").prop("checked", true);
                $("#spal").prop("checked", true);
            }
            else if(noThx.checked == true) {
                //uncheck all boxes
                $("#cor").prop("checked", false);
                $("#sof").prop("checked", false);
                $("#lspa").prop("checked", false);
                $("#cyn").prop("checked", false);
                $("#tos").prop("checked", false);
                $("#spal").prop("checked", false);
            }
        });
    }
    subscribe();
    ​});​
    

    JSFiddle:http://jsfiddle.net/MSZtx/

    【讨论】:

    • @Calvin:谢谢你的帮助和建议;结果不允许为此使用jQuery,但我已经弄清楚了。尽管如此,还是感谢 Calvin、Pranav、NullPointer 和 Sushanth 的指导。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 2013-09-10
    相关资源
    最近更新 更多