`
xsh5324
  • 浏览: 71581 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Mootools之FormCheck的扩展

阅读更多

本文章对mootools formcheck插件进行改进,//注意,这里不对FormChekc源码做详细分析,仅仅简单介绍下怎么扩展的,且后面会付上扩展后的js文件和使用手册。

 

Mootools FormCheck 下载地址:http://mootools.floor.ch/en/download/

 

去年进公司的时候接触到了一种新的JS前端框架技术Mootools,它的语法与JQuery比较相似,个人觉得它与JQuery最大的区别在于Mootools提供面向对象的编程方式。作为应用系统基本上大部分页面都有表单,而对表单的较验则是用的FormCheck插件,我在用FormCheck插件的时候发现以下不爽的问题:

 

1、验证表达式的配置太难看了。validate['required'] 我觉得里面这个单引号多余.

2、在有的情况下想自定义一个Function来处理数据的验证,这个FormCheck冒似没有提供。因为FormCheck是使用正则表达式来验证的数据的,它无非就是调用正则的test方法来验证,也许你会想到用下面这种方式来变通:

//...省略了其它配置
regexp:{
	customValidate:{
		test:function(v){
			//do something...
			return true/false;
		}
	}
}
//...省略了其它配置
//这样配置验证表达式:class="validate['customValidate']"

 这样做确实可以,我一开始就是这样做的,但是后来发现有些需求需要根据输入的值做一些更人性化的提示,完蛋了,它彻底的不支持,没办法只好看源代码改咯....

 

 

第一步:去掉那讨厌的单引号。

找到register : function(el, position)方法//这个方法是给当前的输入框注册验证器的

在这个方法的下面添加如下方法代码:

/**
* 从这类字符串( "required",c{validatePassword} )中分割出表达式列表
* @param exps
* @param splitChar
* @returns {Array}
* @private
*/
_getExpressions:function(exps,splitChar){
        splitChar=splitChar||',';
        var expressions=new Array(),sb=new Array(),methodCount=0,blockCount=0,arrayCount=0,c;
        for(var i=0;i<exps.length;i++){
            c=exps.charAt(i);
            if(c=='('){
                methodCount++;
            }else if(c==')'){
                methodCount--;
            }else if(c=='{'){
                blockCount++;
            }else if(c=='}'){
                blockCount--;
            }else if(c=='['){
                arrayCount++;
            }else if(c==']'){
                arrayCount--;
            }else if(c==splitChar&&methodCount==0&&blockCount==0&&arrayCount==0){
                expressions.push(sb.join(''));
                sb.splice(0,sb.length);
                continue;
            }
            sb.push(c);
        }
        if(sb.length!=0){
            expressions.push(sb.join(''));
        }
        return expressions;
    },

 然后修改register : function(el, position)方法内的代码如下:

register : function(el, position) {
		el.validation = [];
		el.getProperty("class").split(' ').each(function(classX) {
			if (classX.match(/^validate(\[.+\])$/)) {
				var valid = true;

                /******************* Modify BEGIN*************************/
                //注掉下面这行代码
                //var validators = eval(classX.match(/^validate(\[.+\])$/)[1]);//正是因为这句话导致validate中的表达式一定得用引号括住
                 var validators=[];
                 var vStr = classX.match(/^validate\[(.+)\]$/)[1];
                this._getExpressions(vStr).each(function(item){
					if(item.charAt(0)=="'" || item.charAt(0)=='"'){//忽略引号 做兼容
						validators.push(item.substring(1,item.length-1));
					}else{
						validators.push(item);
					}
				});
                 delete vStr;
                 /*******************Modify END*************************/
//...这里省略了其余的代码

 

 

第二步:增加自定义验证方式

在类的options下面加入如下属性

customValidation:{
            _compare:function(v1,v2,exp){
                if(v1&&v1!=''&&v2&&v2!=''){
                    var numRgx=/^\d+$/;
                    if(numRgx.test(v1)&&numRgx.test(v2)){
                        if(eval([v1,exp,v2].join('')))return true;
                    }else{
                        if(eval(["'",v1,"'",exp,"'",v2,"'"].join('')))return true;
                    }
                    return false;
                }
                return true;
            },
            gt:{
                msg:"当前值必需大于 \"%{minValue}\".",
                fn:function(v,minValue,el){
                    if(!this.options.customValidation._compare(v,minValue,">=")){
                        return {minValue:minValue};
                    }
                    return true;
                }
            },
            ge:{
                msg:"当前值必需大于等于 \"%{minValue}\".",
                fn:function(v,minValue,el){
                    if(!this.options.customValidation._compare(v,minValue,">=")){
                        return {minValue:minValue};
                    }
                    return true;
                }
            },
            eq:{
                msg:"当前值必需是 \"%{value}\".",
                fn:function(v,newValue,el){
                    if(!this.options.customValidation._compare(v,newValue,"==")){
                        return {value:newValue};
                    }
                    return true;
                }
            },
            nq:{
                msg:"当前值不能等于 \"%{value}\".",
                fn:function(v,value,el){
                    if(!this.options.customValidation._compare(v,value,"!=")){
                        return {value:value};
                    }
                    return true;
                }
            },
            lt:{
                msg:"当前值必需小于 \"%{value}\".",
                fn:function(v,newValue,el){
                    if(!this.options.customValidation._compare(v,newValue,"<")){
                        return {value:newValue};
                    }
                    return true;
                }
            },
            le:{
                msg:"当前值必需小于等于 \"%{value}\".",
                fn:function(v,newValue,el){
                    if(!this.options.customValidation._compare(v,newValue,"<=")){
                        return {value:newValue};
                    }
                    return true;
                }
            },
            range:{
				msg:"当前值需在\"%{begin}\"至\"%{end}\"之间.",
				fn:function(v,begin,end){
					if(v!=''){
						if(v>=begin&&v<=end){
							return true;
						}else{
							return {begin:begin,end:end};
						}
					}
					return true;
				}
			},
            fileSuffix:{
				msg:"文件类型必需是 %{suffixes} 文件.",
				fn:function(v,suffix){
					suffix=$splat(suffix);
					var suf=v.lastIndexOf('.');
					if(suf!=-1){
						suf=v.substr(suf+1).toLowerCase();
						if(suffix.some(function(sf){
							return suf==sf.toLowerCase();
						})){
							return true;
						}
					}
					return {suffixes:suffix.join("、")};
				}
			}
        }

 

找到validate : function(el)方法//此方法在el需要被验证的时候触发

在此validate 方法下面加入以下方法:

 

/**
     * 这个Function负责执行验证函数里面的参数
     */
    _EXPRESSION_EXECUTE_FN:new Function("return eval(arguments[0])"),
    /**
     * 从表达式中获取结果
     * @param exp
     * @param scope
     * @returns {*}
     * @private
     */
    _getResultByExp:function(exp,scope){
        return this._EXPRESSION_EXECUTE_FN.call(scope||window,exp);
    },

 找到validate方法下的el.validation.each(function(rule) {代码段

 

在第一个else的最后面加入如下代码:

/************************** Modify Begin ****************************/
                var customExpRegx=/^c{(.+)}/i;
                var cExp=rule.match(customExpRegx),me=this;
                if(cExp){
                    var exp=cExp[1];
                    var exps=me._getExpressions(exp);
                    exps.each(function(e){
                        var v,vh,vr,args=[el.get('value')];
                        if(e.indexOf('(')!=-1){//处理传参的情况
                            exr=e.match(/^(\S+?)\((.+)\)/);
                            v=exr[1];
                            me._getExpressions(exr[2]).each(function(arg){
                                args.push(
                                    me._getResultByExp(arg,el)
                                );
                            },me);
                        }else{
                            v=e;
                        }
                        args.push(el);
                        vh=me.options.customValidation[v];//从配置中取得验证器方法
                        if(vh){
                            if($type(vh)=='function'){
                                vr=vh.apply(me,args);
                            }else{
                                vr=vh.fn.apply(me,args);
                            }
                            if(vr===true){
                                el.isOk=el.isOk&&true;
                            }else{
                                el.isOk=false;
                                if($type(vr)=='object'){//处理提示消息绑定值的情况
                                    el.errors.push(vh.msg.replace(/\%{(\w+)}/g,function(){
                                        var vm=vr[arguments[1]];
                                        if($type(vm)=='array'){
                                            return vm.join(',');
                                        }else{
                                            return vm;
                                        }
                                    }));
                                }else if($type(vr)=='string'){//返回字符串直接将其作为提示信息
                                    el.errors.push(vr);
                                }else{
                                    el.errors.push(vh.msg||'当前值不合法');
                                }
                            }
                        }
                    },this);
                }
                /************************** Modify End ****************************/

 完事...

 

示例:

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>test</title>
    <script type="text/javascript" src="mootools-1.2.5-core-yc.js"></script>
    <script type="text/javascript" src="mootools-1.2.5.1-more.js"></script>
    <link media="screen" rel="stylesheet" href="theme/blue/formcheck.css" type="text/css">
    <script type="text/javascript" src="lang/en.js"></script>
    <script type="text/javascript" src="formcheck.js"></script>
    <script type="text/javascript">
        window.addEvent("domready",function(){
            new FormCheck('form', {
                submitReload:1,
                display : {
                    showErrors:1,
                    indicateErrors : 1,
                    fadeDuration : 1000
                },
                customValidation:{
                    validatePassword:function(v){
                        if(v==null||v=='')return true;
                        if(v.length<6){
                            return "密码长度要大于6位哦,亲";
                        }
                        var pl=0;
                        if(/\d/.test(v)){
                            pl++;
                        }
                        if(/[a-zA-Z]/.test(v)){
                            pl++;
                        }
                        if(/[!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]/.test(v)){
                            pl++;
                        }
                        if(pl<=1){
                            return "密码再设复杂点吧,亲";
                        }
                        return true;
                    }
                }
            });
        });
    </script>
</head>
<body>
    <div style="position: absolute; left:30%;top:30%">
        <form id="form" action="http://www.baidu.com" method="POST">
            <lable>
                email:<input type="text" name="email" class="validate[required,email]"/></br>
                password:<input type="text" class='validate["required",c{validatePassword}]' name="password" id="password" /><br/>
                confirmation:<input type="text" class="validate[c{eq($('password').get('value'))}]" name="confirm" /> <br/>
                <input type="submit" value="submit"/>
            </lable>
        </form>
    </div>
</body>
</html>

 效果如下:

 




详细的使用示例请参看rar附件中的使用文档....

 

将FormCheck1.6.rar中的formcheck.js替换原来1.6版本下的forcheck.js(不用担心,完全兼容原来的)

  • 大小: 12.8 KB
  • 大小: 13.1 KB
1
3
分享到:
评论

相关推荐

    mootools

    这个库的设计理念是为开发者提供一种优雅、高效的方式来编写可维护的前端代码,它强调代码的组织结构和模块化,使得大型项目能够更易于管理和扩展。 MooTools的核心特点包括: 1. **面向对象编程**:MooTools基于...

    mootools tree and table

    开发者可能定义了自定义的MooTools类,扩展了MooTools的内置组件,或者实现了特定的事件处理逻辑。阅读和理解这些代码对于深入学习MooTools的使用和优化至关重要。 总的来说,MooTools为开发者提供了强大而灵活的...

    MooTools1.4中文PDF手册+MooTools-Core-1.5.1.js

    - **与其他库的关系**:MooTools与jQuery、Prototype等其他JavaScript库在功能上有许多相似之处,但MooTools更注重代码的组织结构和可维护性。 - **互操作性**:MooTools允许在项目中与其他库共存,通过NoConflict...

    Mootools 1.2.1 API 文档

    对于Joomla爱好者而言,Mootools不仅是Joomla自带的JS库,而且是开发Joomla扩展和模板时不可或缺的一部分。 Mootools的核心理念是模块化设计,它将JavaScript的功能拆分成一系列可复用的模块,如核心、DOM、事件、...

    MooTools 帮助文档 中文

    它能够帮助你更快,更简单地编写可扩展和兼容性强的JavaScript代码。Mootools从Prototype.js中汲取了许多有益的设计理念,语法也和其极其类似。但它提供的功能要比Prototype.js多,整体设计也比Prototype.js要相对...

    mootools源码分析.rar

    2. **Class系统**:MooTools的`Class`系统是其核心之一,它允许创建可复用的面向对象结构。`Class`支持继承、混入(mixins)以及初始化和清理方法,使得类的设计更加灵活。源码分析可以帮助我们理解类是如何被实例化...

    mootools详细教程chm

    **MooTools 详解** MooTools 是一个轻量级且功能强大的JavaScript库,它提供了一种优雅的方式来处理DOM操作、事件、动画效果以及Ajax交互。这个“mootools详细教程chm”包含了丰富的资源,旨在帮助开发者深入理解和...

    Mootools UI 框架

    Mootools本身是一个轻量级、模块化的JavaScript库,强调代码的优雅和性能,而Mootools UI则进一步扩展了这个库的功能,专注于UI层面的开发。 Mootools UI框架的核心特性包括: 1. **组件化设计**:Mootools UI提供...

    mootools 1.2 中文文档

    MooTools是一个轻量级的JavaScript库,设计思想源自于Prototype,但两者在实现和功能上有许多不同之处。MooTools 1.2是该库的一个稳定版本,它提供了丰富的功能集,包括DOM操作、事件处理、动画效果、Ajax交互等。这...

    mootools开发手册中文版

    开发者可以通过`extend`方法来扩展已有类,通过`implement`方法添加新方法或属性。此外,`Object`类是所有MooTools类的基础,提供了便利的操作如`keys`(获取对象所有键)和`values`(获取对象所有值)。 2. **DOM...

    Mootools v1.11 文档 pdf html Mootools v1.2.1 js

    MooTools 是一个轻量级、模块化的JavaScript...通过阅读文档,开发者可以找到特定功能的使用方法,通过HTML文件查看效果并模仿实现,而源代码则有助于理解MooTools的内部机制,对于定制和扩展MooTools功能非常有帮助。

    MooTools.Essentials

    8. **插件机制**:MooTools的插件机制允许开发者轻松扩展框架功能,创建自定义组件,满足特定项目需求。 9. **兼容性**:MooTools致力于跨浏览器兼容性,确保在多种浏览器环境下运行良好,减少了开发者处理兼容问题...

    前端项目-mootools-more.zip

    **前端项目-mootools-more.zip** 是一个包含MooTools扩展库的压缩包,主要针对的是使用MooTools JavaScript框架进行前端开发的项目。MooTools是一个轻量级且高度模块化的JavaScript库,旨在提高开发效率,提供面向...

    mootools.js插件 1.4.5 core下载.zip

    比prototypejs更丰富、更强大的mootools.js插件 1.4.5 core下载。mootools.js可以生成较为复杂的、动态的网页交互效果,和jquery一样强大。。Mootools从Prototype.js中汲取了许多有益的设计理念,语法也和其极其类似...

    Mootools1.2.3各版本下载

    MooTools是一个轻量级的JavaScript库,设计用于简化Web开发中的DOM操作、事件处理、动画效果以及Ajax交互。1.2.3是MooTools的一个稳定版本,它提供了丰富的功能集,同时保持了高性能和良好的浏览器兼容性。在本文中...

    MooTools 1.2 中文手册

    MooTools 是一个轻量级且模块化的JavaScript库,旨在提供高效和可扩展的Web开发工具。它遵循了“More, Please”的理念,强调优雅的代码和强大的功能。MooTools 1.2 是这个库的一个重要版本,提供了许多改进和优化,...

    mootools1.2 core

    - **自定义扩展**:MooTools允许用户扩展其核心功能,创建自己的类和插件,以适应特定项目需求。 5. **与其他库的比较** - **与jQuery**:MooTools和jQuery都是流行的JavaScript库,但MooTools更注重面向对象编程...

    MooTools 1.2 参考文档 (中文版)

    - **类与对象**:MooTools的核心特性之一是其面向对象的编程模型,它允许创建类并实例化对象,提供继承、封装和多态性。 - **DOM操作**:MooTools提供了简洁的API来查找、添加、删除和修改HTML元素,简化了DOM操作...

    mootools中午手册

    它能够帮助你更快,更简单地编写可扩展和兼容性强的JavaScript代码。Mootools从Prototype.js中汲取了许多有益的设计理念,语法也和其极其类似。但它提供的功能要比Prototype.js多,整体设计也比Prototype.js要相对...

    mootools动态下拉菜单dropdown

    7. **模块化**:MooTools遵循CommonJS模块规范,开发者可以通过`.extend()`方法将功能扩展到核心类,或者创建自定义的类来封装特定的下拉菜单逻辑。 8. **可扩展性**:Mootools的动态下拉菜单设计可以轻松适应不同...

Global site tag (gtag.js) - Google Analytics