Skip to content

Commit c02ef77

Browse files
committed
提高容错性,增加允许为空的快捷定义支持,详见更新日志
1 parent 0a527c6 commit c02ef77

File tree

4 files changed

+50
-25
lines changed

4 files changed

+50
-25
lines changed

CHANGELOG.MD

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# 1.3.7
2+
3+
* 【新增】 在为每个表单元素指定验证规则时,支持直接在现有规则名称后直接加后缀 "?", 表示允许当前表单元素为空(相当于强制添加了 `required: false` )。
4+
* 【新增】 `V.fn.isRequired(value, context)` 方法API,允许重写该方法以自定义实现如何指示当前元素是否允许为空。请注意:只有返回明确的 `true``false` 时,才会设置允许对应的表单元素是否 非空 或 允许为空,其他任何返回值均 **不影响** 原规则校验。
5+
6+
默认实现下,如果表单元素上存在属性(attribute) `optional`,其值为 `true` 则表示允许当前表单元素为空(也相当于强制添加了 `required: false` );其值为 `false` 则表示该表单元素不能为空(相当于强制添加了 `required: true` );其他任何值均不作处理。
7+
* 【优化】 非严格模式下,调整表单验证的底层代码执行顺序,当表单元素不存在时,如果对应的规则名称未定义也不会报错。

demo/index.html

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,15 @@
88
<meta http-equiv="expires" content="0">
99
</head>
1010
<body>
11-
<form action="http://www.365mini.com/">
11+
<form action="https://codeplayer.vip/">
1212
<div><label>用户名</label><input id="username" name="username" type="text" /></div>
1313
<div><label>密码</label><input id="password" name="password" type="password" /></div>
1414
<div><label>年龄</label><input id="age" name="age" type="text" /></div>
1515
<div><label>出生日期</label><input id="birthday" name="birthday" type="text" /></div>
1616
<div><label>手机号码</label><input id="cellphone" name="cellphone" type="text" /></div>
1717
<div><label>兴趣爱好</label><input name="hobby" type="checkbox" value="0" /> 足球 <input name="hobby" type="checkbox" value="1" />篮球 </div>
1818
<input type="submit" value="提交" />
19-
</form>
20-
<script type="text/javascript" src="http://libs.baidu.com/jquery/1.11.3/jquery.min.js"></script>
19+
</form><script type="text/javascript" src="http://libs.baidu.com/jquery/1.11.3/jquery.min.js"></script>
2120
<script type="text/javascript" src="layer/layer.js"></script>
2221
<script type="text/javascript" src="../jquery-validator.js"></script>
2322
<script type="text/javascript">

jquery-validator.js

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
/**************************************
22
@Name: jQuery-Validator 基于jQuery的前端验证框架
3-
@Version: 1.3.6
3+
@Version: 1.3.7
44
@Author: Ready
5-
@Date: 2018-08-01
6-
@Documentation: http://www.365mini.com/page/jquery-validator-quickstart.htm
7-
@Copyright: CodePlayer( Ready )
5+
@Date: 2020-08-24
6+
@Documentation: https://codeplayer.vip/p/j7sud
87
@Email: CodePlayer360@gmail.com
98
@Licence: https://www.apache.org/licenses/LICENSE-2.0.html
109
*/
@@ -101,9 +100,18 @@
101100
},
102101
// 后置处理
103102
afterHandler: function(result, context){
104-
var handler = context.rule.after;
103+
var handler = context.rule && context.rule.after;
105104
if(handler && $.isFunction(handler)) handler.call(this, result, context);
106105
return result;
106+
},
107+
/**
108+
* 指示当前元素是否必须非空(只有对表单元素进行校验时,才会被框架调用)。只有返回 true 或 false 时,才会设置允许对应的表单元素是否 非空 或 允许为空,其他任何返回值均不影响原规则校验
109+
*/
110+
isRequired: function(val, context){
111+
var optional = context.$dom.attr('optional');
112+
if( optional == 'true' || optional == 'false' ){
113+
return optional == 'true';
114+
}
107115
},
108116
// 元素值预处理器,必须返回值
109117
pre: {
@@ -513,20 +521,31 @@
513521
},
514522
// 执行单个校验
515523
validate: function(value, rule, event){
516-
var me = this, context, is$, done;
524+
var me = this, context, is$ = value instanceof $, ruleName, $dom = is$ ? value : null, done, required;
517525
if( typeof rule === "string" ){
518-
context = me.getRule(rule);
519-
if( !context ) throw "validate rule not found:" + rule;
520-
rule = context;
526+
ruleName = rule;
527+
if(ruleName.slice(-1) == '?'){
528+
ruleName = ruleName.slice(0, -1);
529+
required = false;
530+
}
531+
rule = me.getRule(ruleName);
521532
}
522-
context = V.context = { origin: rule };
523-
rule = context.rule = me.clipRule( rule );
524-
is$ = value instanceof $;
525-
V.debug && log( "current validate context [" + (is$ ? value.prop("name") : value) + "]:" , context );
533+
context = V.context = { ruleName: ruleName, origin: rule, $dom: $dom, rule: rule };
534+
V.debug && log( "current validate context [" + (is$ ? $dom.selector : value) + "]:" , context );
526535
if( is$ ){
527-
if(!value.length && !this.strict) return me.afterHandler(true, context); // 非严格模式,直接跳过校验
528-
context.$dom = value;
529-
value = me.getValue(value, context);
536+
if(!$dom.length && !me.strict) return me.afterHandler(true, context); // 非严格模式,直接跳过校验
537+
value = me.getValue($dom, context);
538+
if( required == null ){
539+
var r = me.isRequired(value, context);
540+
if( typeof r === 'boolean' ){
541+
required = r;
542+
}
543+
}
544+
}
545+
if( !rule ) throw "validate rule not found:" + ruleName;
546+
rule = context.rule = me.clipRule( rule );
547+
if( required != null ){
548+
rule.required = required;
530549
}
531550
context.value = value, done = { };
532551
// 如果设置了条件预过滤器,只有在匹配条件时才执行后续校验
@@ -676,7 +695,7 @@
676695
},
677696
// 渲染错误
678697
renderError: function(message, $target, context){
679-
if($target && $.isFunction($target.tips)){
698+
if($target && $target.length && $.isFunction($target.tips)){
680699
$target.tips(message);
681700
}else {
682701
alert(message);

0 commit comments

Comments
 (0)