使用自定义验证程序对嵌套输入进行条件jquery验证

时间:2014-04-04 13:23:00

标签: jquery jquery-validate

我有以下HTML:

<div class='headerWithYesNo'>
    <p>Text....</p>
    <div class='choices'>
        <input type="radio" name="choices" value="yes" />
        <input type="radio" name="choices" value="no" />
    </div>
    <div class='headerWithYesNoChild hidden'>
        <input type="checkbox" />
        <input type="checkbox" />
    </div>
</div>

我有一个jquery验证器,要求用户选择是或否。当用户选择“是”时,显示“headerWithYesNoChild”div。如果选择是,我想要求用户选择其中一个复选框。所以我添加了以下自定义验证器:

jQuery.validator.addMethod("headerWithYesNo", function(value, element) {
    //If the value === no return valid
    if (value === 'no') return true;

    var yesNoChild = $(element).closest('.headerWithYesNo').children('.headerWithYesNoChild');
    var checkedInputs = yesNoChild.find('input:checked');

    //If any inputs are checked, return valid
    if (checkedInputs.length > 0) {
        return this.optional(element);
    }

    return false;
});

我使用以下JavaScript添加验证器:

$('.headerWithYesNo .choices input:radio').each(function () {
    $(this).rules("add", {
        headerWithYesNo: true,
        messages: {
            headerWithYesNo: "Make a selection from the options below or select 'No'"
        }
    })
});

我添加到验证功能的唯一选项是更改错误放置:

$('form').validate({
    errorPlacement: function(error, element) {
        ... error placement logic
    }
});

这很有效...有一个问题。选择yes后,将在用户有机会进行选择之前触发验证。我希望在用户选择“否”(清除任何失败的验证)或表单提交时触发验证。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

我最终做的是在我的规则中添加depends

$('.headerWithYesNo .choices input:radio').each(function () {
    $(this).rules("add", {
        headerWithYesNo: {
            depends: function(element) {
                var targetType = $(event.target).attr('type');
                if (element.value === 'no' || targetType === 'submit') {
                    return true;
                }
                return false;
            }
        },
        messages: {
            headerWithYesNo: "Make a selection from the options below or select 'No'"
        }
    })
});

因此,如果收音机的价值是“不”。 required设置为true。或者,如果目标是提交输入。不过我认为@Sparky对onclick提出了一些很好的建议,我只是无法弄清楚如何将它应用于一条规则。我对此有更多的反馈意见。