1

在工作中,我们有一个非常古老的 Web 应用程序。所以我们有一个大杂烩形式的验证解决方案。有很多重复的验证逻辑,很多自定义验证逻辑,一些已经用 jQuery 验证实现的东西,一些来自 bassistance.de 验证器的东西,一些新代码甚至有 HTML 验证等等。你得到图片。

我们正在客户端进行大量清理和重构,我的任务是找出一种方法来完成所有验证。最初,我打算使用我们已经在使用的解决方案之一,例如 jQuery 验证或 bassistance 验证插件。但后来我在看 HTML5 验证,我真的很喜欢你如何通过查看元素来判断哪些验证规则适用于它。所以我决定走这条路。但后来我意识到,对于自定义验证,我仍然需要用 Javascript 将它们写出来,然后没有简单的方法来判断该自定义验证规则是否适用于元素。基本上,我想做这样的事情:

<input type="text" required="true" customValidationRule="true" />

或类似的东西。但它变得比这更复杂。我们的一些自定义验证规则需要某些参数,如果我能做这样的事情会很棒:

<input type="text" required="true" customValidationRule="true" customValidationRuleParamOne="5" customValidationRuleParamTwo="6" />

我还想将某些事物作为组进行验证,例如一个人的地址详细信息,或信用卡详细信息,或类似的东西。例如,做这样的事情会很有用:

<input type="text" name="street" required="true" group="addressGroup" />
<input type="text" name="city" required="true" group="addressGroup" />
<input type="text" name="state" required="true" group="addressGroup" />
<input type="text" name="zip" required="true" group="addressGroup" />

然后我可以验证“addressGroup”中的所有内容,它会自动验证所有这些元素。

为了让事情变得更复杂,我们还使用 JSR-303 进行了服务器端验证。我们目前为此进行 AJAX 调用,但我想以某种方式将其附加到元素上,也可以使用asyncValidationRule="true" 之类的属性。你能在 HTML5 中做类似的事情吗?

我明白我是否要求太多。但是是否有至少具有其中一些功能的验证库?我最想做的是能够在元素本身上指定验证规则。如果没有其他要求也没关系。我可以以某种方式解决这个问题。

4

3 回答 3

2

免责声明:我在这场比赛中有一匹马;我是以下库的作者。

我之前回答过一个类似的问题你可能想看看。我想推荐一个我设计的名为Regula的框架。它可以满足您的大部分要求。data-constraints验证规则(或约束)可以使用属性直接附加到元素上。

例如,您可以执行以下操作:

<input type="text" name="something" data-constraints='@Required' />

您甚至可以设置错误消息或标签等内容:

<input type="text" name="something" data-constraints='@Required(label="something" message="{label} is required.")' />

自定义验证也很容易。您确实需要在 JavaScript 中定义一次验证器但之后您可以使用它:

regula.custom({
   name: "MustBe42",
   defaultMessage: "The answer must be equal to 42",
   validator: function() {
      return this.value == 42;
   }
});

接着:

<input type="text" name="something" data-constraints='@MustBe42' />

还支持参数:

regula.custom({
   name: "MustBeSpecifiedNumber",
   params: ["number"],
   defaultMessage: "The answer must be equal to {number}",
   validator: function(params) {
      return this.value === params.number;
   }
});

接着:

<input type="text" name="something" data-constraints='@MustBeSpecifiedNumber(number=10)' />

您询问了验证组,这也可以在 Regula 中完成:

<input type="text" name="street" data-constraints='@Required(groups=[AddressGroup])' />
<input type="text" name="city" data-constraints='@Required(groups=[AddressGroup])' />
<input type="text" name="state" data-constraints='@Required(groups=[AddressGroup])' />
<input type="text" name="zip" data-constraints='@Required(groups=[AddressGroup])' />

然后你可以验证:

var constraintViolations = regula.validate({
    groups: [regula.Group.AddressGroup] //AddressGroup property is automatically added
});

就 HTML5 支持和异步验证而言,这些功能将在 Regula 的 1.3 版本中提供,该版本目前处于 Alpha 阶段。我有一些小功能和文档要更新,但您应该能够查看当前在 GitHub 上的内容,并且它应该适合您。HTML5 和异步验证主要完成。

关于 HTML5 约束,您可以使用本机属性,或使用 Regula 包装的版本,这些版本为您提供更多选项,例如分配给组和自定义消息。例如:

<input type="text" name="something" required="true" /> 

将得到 Regula 的认可和验证。但你也可以这样做:

<input type="text" name="something" data-constraints='@HTML5Required(groups=[MyGroup], message="{label} is required!", label="something")' /> 
<input type="text" name="somethingElse" data-constraints='@HTML5Required(groups=[MyGroup], message="{label} is required!", label="somethingElse")' /> 

您通常不能仅使用本机 HTML5 验证来做到这一点。然而,需要注意的重要一点是,浏览器必须支持 HTML5 验证才能正常工作。Regula 不尝试模拟 HTML5 功能,因为它涉及的不仅仅是简单的验证;它还涉及特定的 UI 组件。因此,为了实现跨浏览器兼容性,您需要使用某种 polyfill 或 shim。

异步验证也是可能的:

regula.custom({
    name: "AsyncConstraint",
    async: true,
    defaultMessage: "{label} did not validate properly.",
    validator: function(params, validator, callback) {
        jQuery.ajax({
            url: "myurl",
            dataType: "json",
            data: someData,
            success: function(data) {                    
                callback(data.successful)
            }
        });
    }
});

然后你可以注释你的元素:

<input type="text" name="something" data-constraints='@AsynchronousConstraint' /> 

并通过以下方式验证:

//Simply calling validate will validate all constraints on all elements
regula.validate(function(constraintViolations) {
    //do stuff with constraintViolations
});

进行条件验证和使用预先存在的验证器也很容易:

regula.custom({
   name: "ConditionalRequired",
   defaultMessage: "The answer must be equal to {number}",
   validator: function(params, validator) {
      var result = true;
      if(some condition is true) {
          result = validator.required(this, params, validator);
      }

      return result;
   }
});

validator对象基本上使您可以访问每个约束的原始验证器函数。

Regula 还有许多其他特性,例如复合约束(基本上就像在 JSR-303 中一样)。

Regula 没有任何与 UI 相关的逻辑,例如显示错误消息。它只是一个验证引擎,所以它只是这样做的。您希望如何显示错误消息取决于您。

希望你觉得这很有用!正如我之前提到的,当前版本是 1.3.0;它是 alpha 版本,您可以从这里获取。

于 2013-07-11T17:30:15.937 回答
1

您应该考虑的几点:

1-并非所有浏览器都支持 html5。

2-您不能为必填字段自定义默认错误消息。

3-您可以使用模式属性并使用正则表达式进行验证。外部资源

我的建议:看看 MVVM 库,例如 Backbone 或 Knockout。

http://backbonejs.org/#Model-validate

于 2013-07-11T17:14:50.527 回答
0

HTML5 data-* 属性对这类问题很有用。 http://www.slideshare.net/lensco/html5-data-attributes

它们不适用于 XHTML 文档类型,但它们适用于更宽松的文档类型,例如 HTML 4.01。

jQuery 1.9(我也认为以前的版本)允许你做这样的事情:

$(someInput).data()

这将返回一个具有所有 data-* 属性(在 camelCase 中)及其各自值的对象。

于 2013-07-11T17:08:51.823 回答