- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在工作中,我们有一个相当古老的 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 中做类似的事情吗?
如果我要求太多,我能理解。但是是否有一个验证库至少具有这些功能中的一些?我最想要的是能够在元素本身上指定验证规则。如果没有任何其他要求就可以了。我可以以某种方式解决这个问题。
最佳答案
免责声明:我有一匹马参加了这场比赛;我是以下库的作者。
我回答过类似的问题previously你可能想看看。我想推荐一个我设计的名为 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 支持和异步验证而言,这些功能将在目前处于 Alpha 阶段的 Regula 1.3 版中提供。我有一些小功能和文档要更新,但您应该能够检查当前 GitHub 上的内容,它应该适合您。 HTML5 和异步验证已基本完成。
关于 HTML5 约束,您可以使用 native 属性,或使用 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")' />
您通常不能只使用 native 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 阶段,您可以从 here 获得它.
关于javascript - 灵活而强大的表单验证解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17599276/
我有以下几行代码: using XXX.PAD.PaidServices; using YYY= XXX.PAD.PaidServices.Judet; //// uncomment below fo
我正在寻找一种方法,让 LAN 中的客户端无需任何配置即可找到我的服务器应用程序的所有实例。我不想自己破解某些东西,而是想使用现有的解决方案。就个人而言,我需要用 Python 完成它,但我很乐意听到
我的“问题”或“挑战”有很多问题。但它们都不符合我的需求。好的,我开始了: 我想要一个保存可变属性的数据库。现在我将它们作为列名“硬编码”到数据库中(参见图片)。请参阅“颜色”和“尺寸”。但是如果我想
我正在为我的一个 friend 创建一个网站。我们得到了这些布局,我已经放了一个灵活的背景,可以缩放到当前的浏览器大小。但是放置在背景上的图标需要在缩放窗口时保持相对位置。意味着如果我调整窗口大小,让
案例 通常,您会使用 cellForRowAtIndexPath 委托(delegate)方法来设置单元格。单元格的信息集对于单元格的绘制方式和大小非常重要。 不幸的是,heightForRowAtI
我试图让下面的 div 变得灵活 div { min-width: 500px; max-width: 1000px; width:100%; height: 400px; margin-left:1
我在单元测试方面遇到问题。当我运行测试时,它以 "No tests found" 结束。我正在使用 AppCode 和 Quick/Nimble 框架进行单元测试,但它在 XCode 中也不起作用。
问之前,请理解我的英语不好。 我在 servlet 编程中使用 Class.forName(...) 类。当我访问 servlet 时,我从数据库中获得一行详细的 Controller 信息,指示要使
我创建了一个cron job在 GAE 灵活环境中,每 15 分钟自动运行一次。 但是在创建每个实例时,是否会为每个实例复制相同的 cron 作业?我对此不太确定。 最佳答案 不,不会为每个实例复制
div A 灵活且固定(位于窗口顶部),具有高 z-index,因此下方的元素可以在滚动时从下方通过。 div B 位于 div A 下方,我希望它“粘”在 div A 的底部,因为在调整窗口大小时高
我是 Quick/Nimble 的新手,所以我尝试了一个简单的单元测试: import Quick import Nimble class DarkSkyTests: QuickSpec {
我创建了一个演示。关于表格单元格的灵 active ,我需要一些帮助。 我有一些表格单元格,它们的宽度应该是固定的。 但单元格由标签组成,标签可以是长文本,也可以是短文本。 基于此标签,表格单元格应该
我非常熟悉在代码中需要“水平带”的网站 - 即使他们的内容固定在 960 像素以内,他们的背景也会向左和向右“延伸”。 我知道如何做这些,如果它们只有一种颜色,或者我可以用作背景的一张图片。 最近一位
我在自己编写的网站(无框架或 CMS)上使用 Cloudflare Flexible SSL。一切正常,现在我想在整个网站上使用 HTTPS。我在 Apache Web 服务器上使用 PHP。 我想知
我有这个 Java 接口(interface): public interface Box { public void open(); public void close(); } 这个接
所以我有一个“主要”功能系统,现在可以作为 CMS 使用:用户进入编辑器并从四个模板中选择一个。在模板中,他们单击可以添加图像、文本或两者的部分。 我有一个预览屏幕,可以向他们展示他们正在制作的东西,
下面的 HTML/CSS/Javascript (jQuery) 代码显示了 #makes 选择框。选择一个选项会显示带有相关选项的 #models 选择框。 #makes 选择框偏离中心,#mode
我正在使用固定高度的图像来填充具有渐变颜色的 div,方法如下:背景:透明 url(green_bg.gif) repeat-x scroll 0 0; 但是它只填充一个等于图像高度的高度。根据其中的
我的系统的 GUI 在 1366 X 768 分辨率下运行良好。当它以不同的分辨率显示时,我需要并排滚动,而它不应该这样。此外,当我尝试在 chrome 中按 ctr+- 时,div 和部分变得困惑。
我正在尝试在 google app engine 灵活环境中使用 python 编写日志。 我想使用默认的 python 日志记录库并使用处理程序进行日志记录。这是我的代码: import loggi
我是一名优秀的程序员,十分优秀!