|
1 | 1 | /************************************** |
2 | 2 | @Name: jQuery-Validator 基于jQuery的前端验证框架 |
3 | | - @Version: 1.3.6 |
| 3 | + @Version: 1.3.7 |
4 | 4 | @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 |
8 | 7 | @Email: CodePlayer360@gmail.com |
9 | 8 | @Licence: https://www.apache.org/licenses/LICENSE-2.0.html |
10 | 9 | */ |
|
101 | 100 | }, |
102 | 101 | // 后置处理 |
103 | 102 | afterHandler: function(result, context){ |
104 | | - var handler = context.rule.after; |
| 103 | + var handler = context.rule && context.rule.after; |
105 | 104 | if(handler && $.isFunction(handler)) handler.call(this, result, context); |
106 | 105 | 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 | + } |
107 | 115 | }, |
108 | 116 | // 元素值预处理器,必须返回值 |
109 | 117 | pre: { |
|
513 | 521 | }, |
514 | 522 | // 执行单个校验 |
515 | 523 | 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; |
517 | 525 | 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); |
521 | 532 | } |
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 ); |
526 | 535 | 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; |
530 | 549 | } |
531 | 550 | context.value = value, done = { }; |
532 | 551 | // 如果设置了条件预过滤器,只有在匹配条件时才执行后续校验 |
|
676 | 695 | }, |
677 | 696 | // 渲染错误 |
678 | 697 | renderError: function(message, $target, context){ |
679 | | - if($target && $.isFunction($target.tips)){ |
| 698 | + if($target && $target.length && $.isFunction($target.tips)){ |
680 | 699 | $target.tips(message); |
681 | 700 | }else { |
682 | 701 | alert(message); |
|
0 commit comments