基于angularJS的表单验证指令

做开发这么久一直被表单验证这个看似简单又不简单的东西搞得非常烦躁,于是写了个表单验证的框架,再也不用担心这个心烦的验证了。

这里使用angularJS的指令进行处理代码及其简洁明了

下面是指令JS代码

app.directive('ccForm',['$parse',function ($parse) {
    return {
        restrict:'A',
        link:function (scope,element,attrs) {
            var first=true;
            var errors=0;
            var checkInterval;
            function showError(input,errorIndex) {
                if(first){
                    errors++;
                    $parse(element.attr('cc-form')).assign(scope,false);
                    refreshScope(scope);
                    return;
                }
                input.addClass('hasError');
                input.closest('.form-group').addClass('hasError');
                input.next('.help-block').find('.cc-show').removeClass('cc-show');
                input.next('.help-block').find('[cc-error-'+errorIndex+']').addClass('cc-show');
                input.closest('.form-group').next('.help-block').find('.cc-show').removeClass('cc-show');
                input.closest('.form-group').next('.help-block').find('[cc-error-'+errorIndex+']').addClass('cc-show');
            }
            function  hidError(input,errorIndex) {
                errors--;
                if(errors==0){
                    $parse(element.attr('cc-form')).assign(scope,true);
                    refreshScope(scope);
                }
                input.removeClass('hasError');
                input.closest('.form-group').removeClass('hasError');
                input.next('.help-block').find('[cc-error-'+errorIndex+']').removeClass('cc-show');
                input.closest('.form-group').next('.help-block').find('[cc-error-'+errorIndex+']').removeClass('cc-show');
            }
            function checkInput(input) {
                var that=$(input);
                // $('[cc-email]')[0].attributes[0].name
                var attrs=input.attributes;
                var value=that.val();
                for(var i=0,attr;attr=attrs[i];i++){
                    if(attr.name=='cc-email'){
                        if(/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(value)){
                            hidError(that,attr.value)
                        }else{
                            showError(that,attr.value);
                            break;
                        }
                    }else  if(attr.name=='cc-phone'){
                        if(/\d{11}/.test(value)){
                            hidError(that,attr.value);
                        }else {
                            showError(that,attr.value);
                            break;
                        }
                    }else if(attr.name=='cc-max'){
                        if(value.length>attr.value){
                            showError(that,that.attr(attr.name+'-error'));
                            break;
                        }else {
                            hidError(that,that.attr(attr.name+'-error'));
                        }
                    }else if(attr.name=='cc-min'){
                        if(value.length<attr.value){
                            showError(that,that.attr(attr.name+'-error'));
                            break;
                        }else {
                            hidError(that,that.attr(attr.name+'-error'));
                        }
                    }else if(attr.name=='cc-regex'){
                        var patten=new RegExp(attr.value);
                        if(patten.test(value)){
                            hidError(that,that.attr(attr.name+'-error'));
                        }else {
                            showError(that,that.attr(attr.name+'-error'));
                            break;
                        }
                    }else if(attr.name=='cc-require'){
                        if(!value||value.trim()==''){
                            showError(that,attr.value);
                            break;
                        }else {
                            hidError(that,attr.value);
                        }
                    }
                }
            }
            function checkForm(form) {
                form.find('input,textarea').each(function () {
                    checkInput(this);
                });
            }
            element.find('input,textarea').focus(function (e) {
                var that=this;
                first=false;
                checkInterval=setInterval(function () {
                    checkInput(that);
                },500);
            });
            element.find('input,textarea').blur(function (e) {
                first=false;
                checkInput(this);
                clearInterval(checkInterval);
            });
            element.find('[cc-submit]').click(function (e) {
                first=false;
                clearInterval(checkInterval);
                checkForm(element);
            });
            //预检测时不显示错误提示
            checkForm(element);
        }
    }
}]);


对应的需要一点点CSS代码,下面是用LESS写的

.help-block {
  * {
    &:not(.cc-show) {
      display: none;
    }
  }
}
对应的CSS就是

.help-block *:not(.cc-show) {
    display: none;
}

用法1

<div>
    <h1>test</h1>
    <form cc-form="form1">
        <div class="from-group">
            <input type="password" ng-model="user.password" cc-max="16" cc-max-error="1" cc-min="6" cc-min-error="2">
            <div class="help-block">
                <p cc-error-1>密码长度不能超过16位</p>
                <p cc-error-2>密码最短为6</p>
            </div>
        </div>
        <div class="form-group">
            <input ng-model="user.phone" cc-regex="\d{11}" cc-regex-error="1">
            <div class="help-block">
                <p cc-error-1>请输入正确的手机号</p>
            </div>
        </div>
        <div class="form-group">
            <input ng-model="user.fax" cc-require="1">
            <div class="help-block">
                <p cc-error-1>请输入传真</p>
            </div>
        </div>
        <div class="form-group">
            <input ng-model="user.email" cc-email="1">
            <div class="help-block">
                <p cc-error-1>请输入正确的邮箱</p>
            </div>
        </div>
        <button type="button" cc-submit>提交</button>
    </form>
</div>

用法2

    <form class="form shadow-box" cc-form="form1">
        <h3>登录</h3>
        <div class="form-group">
            <div class="cellphone">
                <input placeholder="手机号" ng-model="user.loginName" name="loginName" cc-regex="\d{11}" cc-regex-error="1" cc-require="2"/>
            </div>
        </div>
        <div class="help-block">
            <p cc-error-1>请输入正确的手机号</p>
            <p cc-error-2>请输入手机号</p>
        </div>
        <div class="form-group">
            <div class="password">
                <input placeholder="密码" type="password" ng-model="user.password" name="password" cc-require="1"/>
            </div>
        </div>
        <div class="help-block">
            <p cc-error-1>请输入密码</p>
        </div>
        <div class="form-group">
            <div class="vcode">
                <input placeholder="验证码" ng-model="user.vcode" name="vcode" cc-require="1">
                <img src="">
            </div>
        </div>
        <div class="help-block">
            <p cc-error-1>请输入验证码</p>
        </div>
        <div class="checkbox">
            <label>
                <input type="checkbox" ng-model="user.rememberPass" ng-true-value="true" ng-false-value="false">自动登录
            </label>
        </div>
        <p class="to-register">没有账号?<a href="#/main/register">立即注册</a></p>
        <button type="button" ng-click="login(1)" cc-submit>登录</button>
    </form>

如此简洁明了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值