设计Javascript验证方法

时间:2009-04-27 18:04:09

标签: javascript validation

在JavaScript中进行验证时,如何保持需要处理一系列意外事件的验证方法变得不守规矩?

例如,我有一个表单,其中包含一个具有检查功能的字段:

  • 是新值吗?
  • 是否在另一个字段中的值 形式&gt; <当前字段> 0时0
  • 表单上的另一个字段是== 1和 当前字段== 0
  • 表单上的另一个字段是== true 而当前字段是另一个Mod field == 0

目前,我有一个带有一堆if / else语句的方法。

我可以将每个签出分解为它自己的方法并从主验证方法中调用它,但这会产生大量新方法。

更新:无论我是使用框架还是单个方法,我是否仍然拒绝让调用验证方法填充If / Else或Switch语句以及失败验证的警告框?

4 个答案:

答案 0 :(得分:3)

为什么重新发明轮子?我会建议jQuery Validation Plugin。查看demo pages以及

答案 1 :(得分:1)

听起来你可能想要一个基本的状态机。您可以考虑的一件事是将验证器分解为最简单的形式:

function validator(op, options, pass, fail) {
    if (op(options)) {
        pass(options);
    } else {
        fail(options);
    }
}

然后,您可以将它们链接在一起,形成更复杂的系统。

function isFooChecked(options) {
    return $(options.foo).is(':checked');
}

function sayHi(options) {
    alert('hi ' + options.name);
}

function fail(options) {
    alert(options.name + ' was bad');
}

function validateName() {
    validator(isFooChecked, { foo: '#someField', name: $('#nameField').val() }, sayHi, fail);
}

你仍然会有很多代码,但如果你做得对,那么功能应该很小而且易于理解。

答案 2 :(得分:0)

我建议将每个单独的签出拆分为自己的方法,并将要验证的控件作为参数传入。这样你就可以很容易地重用常见的(“新值是一个数字吗?”)。

我不知道在JavaScript中使用大量方法有任何缺点(除了命名空间拥挤),但我可能会遗漏那些东西。

当然,您可能还想考虑使用framework of some kind

答案 3 :(得分:0)

我有一个看起来像

的Json对象
{'field1': {'rule_name1':{'rule': rule1, 'message': message1},
    {'rule_name2':{'rule': rule2, 'message': message2}},
    field2: {'rule_name3':{'rule': rule3, 'message': message3},
    {'rule_name4':{'rule': rule1, 'message': message1}},
    {'rule_name5':{'rule': rule4, 'message': message4}}}

或者,如果您发现它更具可读性

field1
    rule_name1
        rule: rule1
        message: message1
    rule_name2
        rule: rule2
        message: message2
field2
    rule_name3
        rule: rule3
        message: message3
    rule_name4
        rule: rule1
        message: message1
    rule_name5
        rule: rule4
        message: message4

基本上,您有一个字段列表。在每个字段下,您可以找到一系列规则,这些规则的名称无关紧要,对于每个rule_name,您都有一条规则和一条消息。

每次我需要检查字段时,都会找到相应的子对象。然后我遍历rule_names,对于rule_name,我得到一条规则和一条消息。该规则对应于检查字段的方法(例如“notEmpty()”)。所以我调用方法:如果它返回true,我将迭代带到下一个rule_name。否则我会返回消息。

然后我可以在视图方法中使用我想要的消息。