位置绝对jQuery-Validation-Engine - 表单字段的条件验证

时间:2012-07-16 20:49:45

标签: position conditional absolute jquery-validation-engine

我正在使用Position Absolute的表单验证引擎。

我有一个特定的验证案例,我希望这可以为我解决。我需要能够根据另一个字段的值创建一个字段。

例如:

If country.dropdown = "USA", then state.dropdown is required.  

If country.dropdown <> 'USA" then state.dropdown is not required.

您认为JQuery Validation Engine可以实现吗?如果是这样,你能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

我必须说,首先,我从未使用过Position Absolute的Form验证引擎, 但我对阅读你的问题感兴趣。 从文档(https://github.com/posabsolute/jQuery-Validation-Engine),您似乎必须创建自定义验证功能。

我在这里创造了一个工作小提琴:http://jsfiddle.net/5pKjW/6/

即使它有效,我也不会完全满意,因为在第584行的验证引擎中需要“哨兵值”。

// If the rules required is not added, an empty field is not validated
if(!required && field.val() == "" && !errorMsg) options.isError = false; 

这是自定义函数选择的标记:

<select class="validate[funcCall[checkCountry]]" type="text" name="state" id="state">
    <option value="none" ></option>
    <option value="CALIFORNIA" >CALIFORNIA</option>
    <option value="NEW ENGLAND" >NEW ENGLAND</option>
    <option value="TEXAS" >TEXAS</option>
</select>

这是验证器初始化:

jQuery("#formID").validationEngine({
    'customFunctions': {
        'checkCountry': function (field, rules, i, options){
            if ($('#country').val() === 'USA' && field.val() === 'none') {
                return options.allrules.required.alertText;
            }
        }
    }
});

1)首先,您必须定义一个可以是全局的验证函数,或者可以作为插件的参数传递(如上所述)。自定义函数接受此输入:field,rules,i,options。 您没有引用该表单,您只能引用当前字段。 因此,如果你想访问另一个字段,你必须像往常一样用jQuery选择它(在例子中:$('#country'))。

2)检查验证条件。在示例中,如果出现以下情况则失败:

$('#country').val() === 'USA' && field.val() === 'none'

如果不遵守该条件,则该函数必须返回一个String。在示例中,我返回了options.allrules.required中的标准消息。该文档解释了如何为自定义函数定义自定义消息。

如你所见,因为

if(!required && field.val() == "" && !errorMsg) options.isError = false;
验证引擎中的

行,开发人员被迫使if内的条件失败,并将所需条件设置为true或将错误消息设置为假值不正确。所以,唯一的方法是制作field.val() != ''。 因此,标记中的第一个选项元素具有标记值none,而不是空。它不是一个干净的解决方案,甚至可能无法轻松实现(我不知道你是否自己生成了标记(如果你不这样做,事情变得更加困难,你需要通过javascript操作表单,在验证引擎初始化之前))。

这不是一个干净的解决方案。 一个更好的解决方案是使用condRequired,如果它只接受一个自定义函数,而不是只检查它的一个参数是否已被填充。