用来自定义校验信息的显示机制。它有两个参数,第一个参数以Object的形式,封装了当前校验操作的所有校验失败的信息;第二个参数errorList是一个数组,它的每个元素包含两个属性element和message分别代表失败的表单元素的jq对象和失败信息。另外在这个方法里面通过this.successList还可访问到所有校验成功的元素列表,这个successList也是一个数组,它的每个元素就是校验成功的表单元素的DOM对象。
通过前面对这两个方法的描述,大概就能知道该如何去完成自定义的表单校验功能了:
1)如果在errorPlacement这个option里什么都不做,那么校验的时候就不会插入到页面中了;
2)在showErrors里面,通过errorList和successList,我们可以分别遍历一遍,给失败的元素显示tooltip,然后给成功的元素移除tooltip。
下图是简单说明我的实现中对jquery.validate调用时的方式,只用到了前面提到的这两个选项。
接下来就来看看实际实现时的一些要点。
2. 详细实现
1)从代码组织说起
本文实现主要包含三个文件:
https://github.com/liuyunzhuge/blog/blob/master/form/src/js/mod/formValidation.js
https://github.com/liuyunzhuge/blog/tree/master/form/src/js/mod/validation(这个文件包含两个文件:validate.js和validator.js)
核心的文件是mod/validation文件夹下的两个。其中:
validate.js是最核心的代码,包含了所有的自定义逻辑; validator.js仅仅是对jquery.validate默认的校验信息做的重置,因为它默认是英文的,而我的项目环境不需要考虑英文,所以就在这个文件里做了统一的处理;另外如果要添加一些全局的校验器的话,也可以考虑添加在这里。
mod/formValidation.js是在页面中直接引用的文件,它依赖mod/validation/validate.js,同时基于validate.js提供的接口,注册了一些自定义的处理,这些自定义的处理我会在后面进行说明,它的作用仅仅是为了将validate.js的功能与我之前写的form相关组件结合起来使用。
如果你对本文的实现感兴趣,但是对我写的form相关组件不感兴趣的话,完全可以考虑只关注validate.js和validator.js,因为没有formValidation.js,它们的功能依然是完整的。
2)新添加的option
在validate.js中可以看到有一个DEFAULTS,来定义本文实现的组件模块的option,除了对jquery.validate插件相关的option进行覆盖,还增加了以下option,来完成更丰富的功能:
useTooltip: true,//配置是否启用气泡提示来显示校验失败的信息,默认启用 tipPlacement: 'right',//全局的气泡提示的位置 tooltipDuration: 2500,//多久自动隐藏tooltip fieldConfig: {},//按字段名称配置一些东西,如: /** * { * title: { * fvTipTarget: function($field){ return $field.closest(...);}, //配置气泡提示关联的DOM元素 * tipPlacement: 'top', //配置气泡提示的显示位置:上下左右 * tooltipClass: 'tooltip-name', //配置气泡提示组件需要添加的css类 * errorPlacement: function(error,element){}, //配置字段错误信息的插入位置 * fvRelatedTarget: function($field){return ...}, //配置校验时关联影响的DOM元素 * } * } * * 其中fvTipTarget fvRelatedTarget可以是function和jQuery对象两种形式 */ fieldTypeConfig: {},//按字段类型配置一些东西,如: /** * { * date: { * fvTipTarget: function($field){ return $field.closest(...);}, //配置date类型的字段校验失败时气泡提示关联的DOM元素 * tipPlacement: 'top', //配置date类型的字段校验失败时气泡提示的显示位置:上下左右 * tooltipClass: 'tooltip-name', //配置date类型的字段校验失败时气泡提示组件需要添加的css类 * errorPlacement: function(error,element){}, //配置date类型的字段的错误信息的插入位置 * fvRelatedTarget: function($field){return ...}, //配置date类型的字段时校验时关联影响的DOM元素 * } * } * 如果要为所有的类型定义一个配置,可把类型名称设置为all,如all: {errorPlacement: function(){..}} * 优先级: * fieldConfig > fieldTypeConfig<type> > Validation.defaultFieldTypeConfig > fieldTypeConfig<all> */
详细作用如下:
useTooltip决定了是否启用气泡校验的功能,默认为true,如果为false,validate.js提供的模块将使用默认的校验机制来显示校验逻辑;
tipPlacement: 全局的气泡提示显示的位置,用过bootstrap的tooltip就知道,它可以显示到一个元素的上下左右,通过这个可以改变气泡提示的默认位置;