自己动手写javascript前端验证框架

  前段时间做网站需要很多的验证,第一时间想到的是去网上找一些验证控件。一搜还真不少,但是很沮丧,网上大多数验证控件都自带样式,而客户的验证提醒方式很特别。一怒之下小编自己写了一个简易的验证框架。

需求分析:

  1. 逻辑与页面设计相分离,网页设计师现在都疯了,各种花哨的提醒方式,好多验证控件却自认为自己做的样式可以得到设计师的芳心。。。
  2. 支持自定义正则与常用正则
  3. 支持提醒文本标记 记住我们的控件的唯一功能就是验证,UI神马的要给用户自由选择权,自然也包含提醒文本
  4. 支持控件值比较 
  5. 支持多种控件  text  checkbox  等
  6. 支持忽略值  例如  请输入姓名 之类的提示符号

页面结构

    jquery类库这个是基础 适合做精细化dom操作

    

<script src="jquery.js"/>

 验证引擎,这是核心的js文件 随意起一个名字吧 validate.js 

<script src="validate.js"/>

提醒框文件,用于实现设计师的设计 就叫 validateBox.js

<script src="validateBox.js"/>

 

在实现具体代码之前,我们应该先设计我们的代码如何工作。

第一种应用场景HTML代码:必选项

<input type="text" spacemsg="请输入用户名" class="userCtr">

这是最简单应用场景,spacemsg 为自定义标记(也可以称为编译指令) 告诉 验证引擎 如果 这个控件的值如果为空或长空格 则提取spacemsg内容到提醒队列。

第二种应用场景HTML代码:格式化文本+必选验证

<input type="text" spacemsg="请输入年龄"  rule="\\d+$" rulemsg="年龄必须为数字" class="userCtr"/>

大家看到在这里 我们使用 rule标记 内容的格式验证 已经格式验证 提醒文本 , 必填验证优先级>格式验证

大家看到这里的正则我们可以自由填写,但是无法达到重用的效果所以我们也要支持 格式类型

<input type="text" spacemsg="请输入邮箱"  ruleMod="email" rulemsg="请输入正确的邮箱格式" class="userCtr"/>

在工作的时候引擎会将ruleMod 转为对应的rule,在用法上这只不过是语法糖而已但对用户来讲方便不少哦

有些验证只有当控件有值的时候才会引发验证,那么只需要

<input type="text"   ruleMod="mobile" rulemsg="请输入正确的联系方式" class="userCtr"/>

------------------------昨天有事没有更新,今天先把代码给你们贴上来,博主不是标题党  :‘(-------------------------------

validate.js
if (!String.prototype.replaceAll) {
    String.prototype.replaceAll = function (str1, str2) {
        if (str1 == "\\") {
            if (this.indexOf("\\") == -1) {
                return this;
            }
            var newstr = "";
            for (var i = 0; i < this.length; i++) {
                if (this[i] == "\\") {
                    newstr += str2;
                } else {
                    newstr += this[i];
                }
            }
            return newstr;
        }

        var exp = eval(‘( /‘ + str1 + ‘/g )‘);
        return this.replace(exp, str2);
    };
}
(function ($) {

    var textCheckFucntion = function (E_this, spaceAttr, ruleAttr, ruleMessageAttr, ruleElement, ruleMod, richMessage, success, isArguments) {
        var _this = $(E_this);
        var t = _this.val();
        if ($.trim(t).length === 0) {

            if (isArguments) {
                if (spaceAttr) {
                    if (_this.attr(spaceAttr)) {
                        richMessage.push({ "element": _this, "message": _this.attr(spaceAttr) });
                    }
                }
            } else {
                success = success && false;
            }
        } else {
            if (isArguments) {
                if (ruleAttr) {
                    if (_this.attr(ruleElement)) {
                        if (t != $(_this.attr(ruleElement)).val()) {
                            richMessage.push({ "element": _this, "message": _this.attr(ruleMessageAttr) });
                        }

                    } else {
                        var ruleStr = _this.attr(ruleAttr);
                        if (ruleStr) {
                            var rule = new RegExp(ruleStr);
                            if (!rule.test(t)) {
                                richMessage.push({ "element": _this, "message": _this.attr(ruleMessageAttr) });
                            }
                        } else {
                            if (_this.data(ruleMod)) {
                                var rulem = _this.data(ruleMod);
                                if (!rulem.test(t)) {
                                    richMessage.push({ "element": _this, "message": _this.attr(ruleMessageAttr) });
                                }
                            }
                        }
                    }
                }
            }

        }

    }
   

    $.fn.extend({
        //检查必填项支持 input checkbox  textarea  password  hidden
        requiredCheck: function (setting) {
            var spaceAttr, ruleAttr, ruleMessageAttr, ruleElement,ruleMod;
            if (setting) {
                spaceAttr = setting["spaceMessage"];
                ruleAttr = setting["rule"];
                ruleMessageAttr = setting["ruleMessage"];
                ruleElement = setting["ruleElement"];
                ruleMod=setting["ruleMod"];
            }
            var richMessage = [];
            var isArguments = arguments.length === 0 ? false : true;
            var success = true;
            var $textinputCollection = this.filter("[type=text]");
            //没有type属性则按 input type="text"处理
            var $notType = this.filter("input").not("[type]");
            if ($notType.length) {
                $textinputCollection.push($notType);
            }          
            var $checkboxCollection = this.filter("[type=checkbox]");
            var $textAreaCollection = this.filter("textarea");
            var $passwordCollection = this.filter("[type=password]");
            var $hiddenCollection = this.filter("[type=hidden]");
            var textDege = function (E_this) {
                textCheckFucntion(E_this, spaceAttr, ruleAttr, ruleMessageAttr, ruleElement, ruleMod, richMessage, success, isArguments);
            }
            if ($textinputCollection.length) {
                $textinputCollection.each(function () {                  
                    textDege(this);
                });
            }           
            if ($textAreaCollection.length) {
                $textAreaCollection.each(function () {
                    textDege(this);
                });
            }
            if ($passwordCollection.length) {
                $passwordCollection.each(function () {
                    textDege(this);
                });
            }
            if ($hiddenCollection.length) {
                $hiddenCollection.each(function () {
                    textDege(this);
                });
            }
            if ($checkboxCollection.length) {
                $checkboxCollection.each(function () {
                    var _this = $(this);
                    if (!_this.get(0).checked) {
                        if (isArguments) {
                            if (spaceAttr) {
                                richMessage.push({ "element": _this, "message": _this.attr(spaceAttr) });
                            }
                        } else {
                            success = success && false;
                        }
                    }

                });

            }
            if (richMessage.length) {
                return richMessage;
            } else {
                return success;
            }
        }    });})(jQuery);
validateBox.js
(function ($) {
    if ($.fn.requiredCheck) {
        var setting = {
            "spaceMessage": "spacemsg",
            "rule": "rule",
            "ruleMessage": "spacemsg",
            "ruleElement": "confirmElement",
            "ruleMod": "ruleMod"
        };
        var rgModel = {
            "email": "^([a-zA-Z0-9_\\.\\-])+\\@(([a-zA-Z0-9\\-])+\\.)+([a-zA-Z0-9]{2,4})+$",
            "mobile": "^1[3458]\\d{9}$",
            "natureNumber": "^\\d+$"
        };
        this.CommonVaildate = function (selector, errorhandler) {
            var $selector = $(selector);
            $selector.each(function () {
                var _thisRuleMod = $(this).attr("rulemod");
                if (_thisRuleMod) {
                    var frxp = rgModel[_thisRuleMod];
                    if (frxp) {
                        $(this).data("ruleMod", new RegExp(frxp));
                    }
                }
            });
            var res = $selector.requiredCheck(setting);
            var handler = errorhandler || alert;
            var msg = [];
            if (res.join) {               
                for (var i = 0; i < res.length; i++) {
                    msg.push(res[i]["message"]);
                }
                handler(msg.join("\n"));
                msg = null;
                return false;
            }
            msg = null;
            return true;
        }
    } else {
        this.CommonVaildate = function () {
            throw Error("请引用jquery.enterprise.js");
        };
    }

}).apply(window, [jQuery]);

测试HTML

<input type="text" spacemsg="请输入邮箱"  ruleMod="email" rulemsg="请输入正确的邮箱格式" class="userCtr"/>
<script>
var result=CommonVaildate(".userCtr");
<script>

----------------------------后续篇章将详细解释源代码 博主上班去喽-----------------

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。