jquery validate-根据条件切换字段集(带有嵌套的必需字段)

jquery validate - toggle fieldset (with nested required fields) based on conditions

本文关键字:字段 嵌套 validate- 条件 jquery      更新时间:2024-04-20
Jquery大师们,我一直在为这件事绞尽脑汁。我正在为表单呈现系统构建一个客户端表单验证层,该系统输出这样的标记(最小示例):
<form name="someName" action="someAction">
<label for="1">Product</label>
<select id="1" name="1">
  <option value="">Please Select</option>
  <option value="shoe">Shoe</option>
  <option value="hat">Hat</option>
  <option value="vest">Vest</option>
</select>
<!-- this fieldset would be enabled if select (id:1) IS NOT blank -->
<fieldset data-dep-values="" data-dep-operator="!=" data-dep-id="1" class="dependant">
    <label for="2">Brand</label>
    <input type="text" id="2" name="2" class="required">
</fieldset>
<!-- this fieldset would be enabled if select (id:1) IS blank -->
<fieldset data-dep-values="" data-dep-operator="=" data-dep-id="1" class="dependant">
    <label for="3">Other Product</label>
    <textarea id="3" name="3" class="required"></textarea>              
</fieldset>
<!-- this fieldset would be enabled if select (id:1) equals "shoe" OR "vest" -->
<fieldset data-dep-values="shoe|vest" data-dep-operator="=" data-dep-id="1" class="dependant">
    <label for="4">Material</label>
    <textarea id="4" name="4" class="required"></textarea>              
</fieldset>
<input type="submit">
</form>

示例中需要注意的一些事项:

  • 所有"可能"是必需的字段都用类"必需"标记
  • 字段和字段集可以标记为"依赖",这意味着"如果"满足表单中的某些条件,它们应该是必需的。在上面的例子中,字段集元素上的数据属性表示逻辑

这是我的问题。

  • 验证插件是否可以向所有字段添加侦听器,即使不是必需的或基于格式的,如数据、int、电子邮件等。我需要检测所有字段的更改,以测试该字段是否有任何"依赖项"。然后,我需要根据依赖性需求测试该值
  • 如果一个相关字段或一组字段被隐藏(不满足要求),它仍然会有标记为必需的字段。如果父级(从属组)未启用(不满足从属关系),Validate是否可以跳过这些字段

我想它会这样运行:

  1. 倾听每次输入的变化
  2. 当字段发生变化时,在表单中搜索$('.dependant[data-dep-id="idOfChangedInput"]'),然后测试条件。如果为true,则显示依赖项,并在"验证"规则中包括任何子"必需"字段。同时隐藏和禁用任何以前启用的从属项(如果条件不再满足)

这是一个逻辑难题,后果不堪设想。

我必须相信有一个相当基本的方法来建立这个规则,但我尝试的一切都失败了。

任何见解或建议都将不胜感激。

干杯!

使用默认属性为每个字段集设置id。假设第一个字段集

<fieldset id="fs1" disabled="true"

用于第二个字段集

<fieldset id="fs2"

用于第三个字段集

<fieldset id="fs3" disabled="true"

你必须编写一个JS函数,这将是最有可能的。

function enableDisableFS() {
    var value = $("#1").val();
    if (value != "") {
        $("#fs1").removeProp("disabled");
        $("#fs2").prop("disabled", true);
        if (value == 'shoe' || value == 'vest') {
            $("#fs3").removeProp("disabled");
        } else {
            $("#fs3").prop("disabled", true);
        } 
    } else {
        $("#fs2").removeProp("disabled");
    }
}

并将onchange()属性添加到您选择的中

<select id="1" name="1" onchange="enableDisableFS()">

如果您想在提交时验证表单,请编写另一个JS函数。

function validate() {
    // if else validate do here depending on your conditions.
    if (valid) {
        document.forms[0].submit;
    } else {
        alert('Validation failed');
    }
    return false;
}

您的提交按钮

<input type="button" onclick="return validate()">