【问题标题】:How to validate required checkboxlists when each property's value of them is dymanic using JavaScript?当每个属性的值是使用 JavaScript 动态的时,如何验证所需的复选框列表?
【发布时间】:2015-09-08 15:12:15
【问题描述】:

以下是我的表单,其中包含两组复选框列表。

<form id="my-form">

    <input type="checkbox" class="unknown-name-1" name="unknown-name-1[]" value="Bike"> I have a bike<br>
    <input type="checkbox" class="unknown-name-1" name="unknow-name-1[]" value="Car"> I have a car<br>
    <input type="checkbox" class="unknown-name-1" name="unknow-name-1[]" value="_other" data-target-text-input="text-input-other-option-unknow-name-1"> Others 
    <input type="text" id="text-input-other-option-unknow-name-1" class="unknown-name-1" name="unknown-name-1[]">


    <input type="checkbox" class="unknown-name-2" name="unknow-name-2[]" value="House"> I have a house<br>
    <input type="checkbox" class="unknown-name-2" name="unknow-name-2[]" value="Apartement"> I have an apartement<br>
    <input type="checkbox" class="unknown-name-2" name="unknow-name-2[]" value="Vila"> I have a vila<br>
    <input type="checkbox" class="unknown-name-2" name="unknow-name-2[]" value="_other" data-target-text-input="text-input-other-option-unknow-name-2"> Others 
    <input type="text" id="text-input-other-option-unknow-name-2" class="unknown-name-2" name="unknow-name-2[]">

</form>

每个复选框的所有类或 ID 或名称都是动态的,这意味着我不知道在呈现视图时每个属性的值是什么,也不是复选框列表的组数,而是两个上面的组将用作代码 sn-p 的示例。

验证规则:

每个复选框列表都需要至少一个选项才能被选中。最后一个选项是_other,如果选中此选项,则其输入字段为必填项。

我花了几个小时用JavaScript 编写动态验证器,但我仍然无法完成。我希望你们中的一些人可以帮助我!如何使用JavaScriptnot in jQuery 编写可以检查这些条件的动态验证器?注意: checkboxlist 可以有一组、二组、三组或更多组,每个 checkbox 的所有属性的值都是事先未知的。如有必要,可以在复选框中添加更多属性,但它们的值需要是动态的。

【问题讨论】:

  • 您能告诉我们您已经拥有的任何验证码吗?您是否只是想验证是否检查了值(如果需要,输入字段已完成),或者您是否关心验证这些值是一组预期的值(即未更改)?换句话说,这些值真的很重要,还是您只是想验证输入状态?
  • 为什么不给他们添加第二个静态类,其唯一目的是验证?
  • 否则我唯一能想到的就是有一个带有全局变量 isChecked 的 .each() 循环,如果你看到一个 true,你将变量设置为 true 并中断。 (PS 你需要一个 if 语句来检查复选框与文本字段)
  • 您是在获取 JSON 并将其传递给创建表单的组件还是获取 HTML?
  • 对您来说,是否可以为每个组维护 div。这样您就可以通过 div 名称/id/类检查每个组的选中字段。

标签: javascript validation checkboxlist


【解决方案1】:

您需要附加一个处理程序来提交事件并检索当前表单的所有复选框,并使用“checked”属性检查是否选中了一个复选框(很简单,不是吗?:))。

简单的解决方案:

var form = document.getElementById('my-form');

function validate(e) {
    // "this" is the current form which has been submitted
    // so we get all checkboxes for this form
    var checkboxes = this.querySelectorAll('[type="checkbox"]'); 
    var isValid = false;

    for (var c = 0; c < checkboxes.length; c++) {
        if (checkboxes[c].checked) {
            isValid = true; break;
        }
    }

    if (!isValid) {
        alert('One choice at least required.');
        e.preventDefault();
    }
}

form.addEventListener('submit', validate);

完整示例:http://jsfiddle.net/Reeska/a228Lko0/

高级解决方案:

您可以将此方法应用于高级用法,首先我们需要标记需要验证的块或字段,为此,我们需要使用 css 类和数据属性:

<form id="my-form">
   <div class="validate" data-validator="checkbox-required" data-name="Group 1">
      <input type="checkbox" class="unknown-name-1" name="unknown-name-1[]" value="Bike"> I have a bike<br>
      <input type="checkbox" class="unknown-name-1" name="unknow-name-1[]" value="Car"> I have a car<br>
      <input type="checkbox" class="unknown-name-1" name="unknow-name-1[]" value="_other" data-target-text-input="text-input-other-option-unknow-name-1"> Others 
      <input type="text" id="text-input-other-option-unknow-name-1" class="unknown-name-1" name="unknown-name-1[]">
   </div>
   <hr />
   <div class="validate" data-validator="checkbox-required" data-name="Group 2">
    ...
   </div>
   <input type="submit" val="submit" />
</form>

对于每个带有validate 类的项目,我用数据属性data-validator 指明我想要的验证类型,在JS 中我将通过验证类型创建一个函数:

var validators = {
    'checkbox-required' : function() {
        var checkboxes = this.querySelectorAll('[type="checkbox"]'); 
        var isValid = false;

        for (var c = 0; c < checkboxes.length; c++) {
            if (checkboxes[c].checked) {
                isValid = true; break;
            }
        }     

        return {
            valid: isValid,
            msg: (!isValid ? 'One choice at least required.' : '')
        }
    }
};

最后,对于每个 validate 项目,我在提交时应用其验证器功能:

form.addEventListener('submit', function(e) {
    var items = this.querySelectorAll('.validate');
    var errors = [];

    for (var it = 0; it < items.length; it++) {
        var data = items[it].dataset;
        var validator = data['validator'];

        if (!validator || !validators[validator]) {
            console.log('Unknown validator : ' + validator);
            continue;
        }

        var test = validators[validator].call(items[it]);

        if (!test.valid) {
            errors.push((data.name ? data.name + ": " : '') + test.msg);  
        }
    }

    if (errors.length > 0) {
        // if error is detected, cancel submit
        e.preventDefault();  

        alert(errors.join("\n"));
    }
});

就是这样,你可以添加其他验证器类型。

完整的高级示例:http://jsfiddle.net/Reeska/a228Lko0/5/

【讨论】:

  • 我认为当第一组复选框列表有效但第二组复选框列表无效时,您的验证也会通过。不会吗?
  • 你说得对,这个例子是一个简单的方法,它不是完整的解决方案,但我会用更高级的功能来完成它。
  • 拜托了!事先谢谢你。我坚持了好几天。
  • 我试过你的高级代码。效果很好!当检查任何复选框的最后一个选项时,您是否可以修改一个条件的代码,它有值_others。如果是这样,最后一个复选框选项之后的输入文本字段可能不是空白的。
  • 您可以为这种情况添加一个特定的验证器,将validate 类添加到_other 输入,创建一个other-required 验证器,它将检查以data-target-text-input 属性为目标的输入是否为是否为空。在other-required 函数中,您将获得带有var tf = this.querySelector('#' + this.dataset['targetTextInput']); 的“其他”文本字段
猜你喜欢
  • 2019-08-14
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多