【问题标题】:Javascript Loop & if statement nestedJavascript循环和if语句嵌套
【发布时间】:2016-07-13 01:42:23
【问题描述】:

我已经搜索了论坛,但我似乎无法找到解决这个小问题的方法。

所以我有这个表格,我有 10 个单选按钮组,每个组当然具有相同的名称。我需要做的是遍历十个组中的每一个,并在所有这些组都未选中时执行一个功能,但我似乎无法找到解决方案。到目前为止,我已经完成了 10 次代码重复,我知道这不是一个好主意。我相信也有更好的方法来做到这一点。

到目前为止我所拥有的是:

var drivingCheck = document.getElementById('index-form').Driving;
for (var i = 0; i < drivingCheck.length; i++) {
    if (drivingCheck[i].checked == true) {
        break;
    } else {
        totalCount -= 5;
        console.log(totalCount);
        break;
    }
}
var sleepCheck = document.getElementById('index-form').Sleep;
for (var i = 0; i < sleepCheck.length; i++) {
    if (sleepCheck[i].checked == true) {
        break;
    } else {
        totalCount -= 5;
        console.log(totalCount);
        break;
    }
}

这是两个单选按钮组,我有十个。我怎样才能做到这一点而不重复自己这么多次? & 当前代码的问题是,如果选中除第一个元素之外的任何单选按钮,则代码执行“false”操作,只有在组的所有元素上的“.checked”为 false 时才应执行该操作。

编辑

此更新现在使代码仅在未检查所有字段时才执行操作,但我仍然重复代码太多次:

    var recreationCheck = document.getElementById('index-form').Recreation;
    for (var i = 0; i < recreationCheck.length; i++) {
        if (recreationCheck[i].checked == true) {
            break;
        } else if (recreationCheck[0].checked && recreationCheck[2].checked && recreationCheck[3].checked && recreationCheck[4].checked && recreationCheck[5].checked == false) {
            totalCount -= 5;
            console.log(totalCount);
            break;
        }
    }

这是两个组的 HTML:

    <h3>9: Sleep Per Night</h3>
    <div class="options">
    <input name="Sleep" type="radio" value="0" class="radioCheckBtn">I can sleep with no problem
    <input name="Sleep" type="radio" value="1" class="radioCheckBtn">My sleeping is a slight problem (only 1 hour lost sleep)
    <input name="Sleep" type="radio" value="2" class="radioCheckBtn">My sleeping is a mildly problem (1 to 2 hours lost sleep
    <input name="Sleep" type="radio" value="3" class="radioCheckBtn">My sleeping is a moderate problem (2 to 3 hours lost sleep)
    <input name="Sleep" type="radio" value="4" class="radioCheckBtn">My sleeping is a great problem (3 to 5 hours lost sleep)
    <input name="Sleep" type="radio" value="5" class="radioCheckBtn">My sleeping is a severe problem (5 to 7 hours lost sleep)
    </div>
    <h3>10: Recreational Activities</h3>
    <div class="options">
    <input name="Recreation" type="radio" value="0" class="radioCheckBtn">I can perform all recreation activity without neck pain
    <input name="Recreation" type="radio" value="1" class="radioCheckBtn">I can perform recreation activity with only some neck pain
    <input name="Recreation" type="radio" value="2" class="radioCheckBtn">I can perform most, not all recreation activity due to neck pain
    <input name="Recreation" type="radio" value="3" class="radioCheckBtn">I can only perform some recreation activity due to neck pain
    <input name="Recreation" type="radio" value="4" class="radioCheckBtn">I can hardly perform recreational activity due to pain in my neck
    <input name="Recreation" type="radio" value="5" class="radioCheckBtn">I cannot perform any recreation activity
    </div>

我希望我说得通。

谢谢

【问题讨论】:

  • 您能分享一个用于您的单选按钮组的 HTML 设置示例吗?
  • @mwilson 当然,我编辑了上面的代码,谢谢
  • 使事物通用/可重用将使您远离重复类型 1 的重复代码

标签: javascript jquery forms if-statement for-loop


【解决方案1】:

这样的事情应该可以工作。基本上,您正在对通用结构进行通用检查,只要您的组结构正确(容器>输入),然后只需创建一个函数,将其传递给一个组,然后该函数将查看该组内部并查看是否所有被检查。如果它们都被选中,下面的函数将返回真/假。

JSFiddle:https://jsfiddle.net/u1b3qryf/15/

function checkRadioButtons(optionsDiv) {
    var inputs = $(optionsDiv).find('.radioCheckBtn');
    for (var j = 0; j < inputs.length; j++) {
        if ($(inputs[j]).is(':checked')) {
            return true;
        }
    }
    return false;
}

function runChecks() {
    var options = $('.options');
    var groupStatus = [];
    for (var i = 0; i < options.length; i++) {
        var allChecked = checkRadioButtons(options[i]);
        groupStatus.push({ group: 'group' + i, hasFieldChecked: allChecked });
    }
    return groupStatus;
}

基本上,只需创建一个函数,以便您可以将其传递给一个容器,然后让该函数循环遍历您的所有输入。如果它找到未选中的框,则返回 false。否则返回true。

您可以增强它以传入一个容器数组,或者只构建一个容器数组,然后循环遍历该数组,每次迭代都会获得一个选项组

【讨论】:

  • 我不知道为什么,但无论哪种方式它都返回 false。
  • 我刚刚注意到没有一个组可以选择所有单选按钮。您有此设置,因此每个组都是唯一的,因此一次只能选择一个选项。如果您更新了 html 以允许多个选择,请更新您的 html。我刚刚通过关闭您的第一组的唯一选择进行了测试,它运行良好。如果您删除 name 属性,这将允许选择多个选项。
  • 我在答案中添加了一个 JSFiddle 以便您查看
  • 是的,但我需要这些组一次只能有一个选择,因为问卷结果是基于此的。我基本上需要的是“如果未检查组的所有元素,则从“totalCount”变量中减去 5。我在原始问题的编辑中添加的 JS 代码完美运行,但我必须重复 10 次,我认为不是一个好习惯。非常感谢您的帮助。
  • 好的。我明白了。你只需要稍微颠倒一下逻辑。一秒钟
【解决方案2】:

创建一个以表单和输入字段名称为参数的函数怎么样?

var checkFunction = function(form, field){
   //fields can be Sleep, Recreation etc
   var fields = form[field];
   //Now, loop over the nodes in the list
   // and do whatever you want
}
var form = document.getElementById('index-form');
checkFunction(form, 'Sleep')

【讨论】:

    猜你喜欢
    • 2015-10-01
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多