[代碼筆記]原生JS實現驗證框架 checkFun(待優化)

来源:https://www.cnblogs.com/moqiutao/archive/2018/01/23/7977259.html
-Advertisement-
Play Games

css代碼: html代碼: JS調用: ...


;(function(){

    
/** 驗證框架 checkFun
* 使用方法:        
* <input class="required" type="text" data-valid="isNonEmpty||isEmail" data-error="email不能為空||郵箱格式不正確" id="" />    
* 1、需要驗證的元素都加上【required】樣式,當然這個required可以當參數傳遞,也可以自定義class類名
* 2、@data-valid        驗證規則,驗證多個規則中間用【||】隔開,更多驗證規則,看rules和rule,後面遇到可繼續增加
* 3、@data-error        規則對應的提示信息,一一對應
* 調用方式

checkFun({
    formId:'verifyCheck', //<驗證formId內class為required的元素
    checkClass:'required', //<需要驗證的DOM元素上預設class類名>
    onBlur:function(el,state){console.log(state)}, //<被驗證元素失去焦點的回調函數,回調函數中包括當前輸入框失焦後是否通過驗證的狀態true表示通過,false表示未通過>
    onFocus:null, //<被驗證元素獲得焦點的回調函數>
    onChange: null, //<被驗證元值改變的回調函數>
    successTip: true, //<驗證通過是否提示>
    resultTips:null, //<顯示提示的方法,參數obj[當前元素],isRight[是否正確提示],value[提示信息]>
    clearTips:null //<清除提示的方法,參數obj[當前元素]>            
 })
 
 下麵列舉下實現的調用
 
 //1.實現isNonEmpty,郵箱格式isEmail
<input class="required" type="text" data-valid="isNonEmpty||isEmail" data-error="email不能為空||郵箱格式不正確" id="" />    

//2.驗證最小長度minLength與最大長度maxLength
<input type="password" placeholder="密碼" value="" class="required password" id="password" data-valid="isNonEmpty||minLength:3" data-error="密碼不能為空||密碼長度至少為3位"/>

//3驗證某個範圍內between
<input type="password" placeholder="密碼" value="" class="required password" id="password" data-valid="isNonEmpty||between:3-5" data-error="密碼不能為空||密碼長度在3-5位"/>

//4.驗證兩次密碼是否輸入一致isRepeat
<div class="same">
    <input type="password" placeholder="密碼" value="" class="required password" id="password" data-valid="isNonEmpty||between:3-5" data-error="密碼不能為空||密碼長度在3-5位"/>
    <label class="focus valid"></label>
</div>
<div class="same">
    <input type="password" placeholder="重覆密碼" value="" class="required password2" id="password2" data-valid="isNonEmpty||isRepeat:password" data-error="密碼不能為空||兩次輸入的密碼不一致"/>
    <label class="focus valid"></label>
</div>

//5.驗證密碼強度level (使用方式跟minLength一樣 level:3)
//6.驗證是否為手機號碼isPhone
//7.驗證是否為純中文isZh
//8.驗證身份證號碼isCard

    
//下麵的方式原生調用方式,當然可以使用jquery觸發點擊事件
document.getElementById('submitBtn').addEventListener('click',function(){ //點擊提交按鈕時驗證
         if(!checkFun.click()) return;
  },false)
*/
    /** 深度拷貝
     * @param p 拷貝的對象
     * @param c c預設傳遞的對象,也可以不傳
     * @result 返回拷貝後的對象
     * */
    var extendCopy = (function f(p,c){
        var c = c || {};
        for (var i in p) {
            if(typeof p[i] === 'object'){
                c[i] = (p[i] instanceof Array) ? [] : {};
                f(p[i],c[i]);
            }else{
                         c[i] = p[i];
            } 
        }
        return c;
    });
    
    var opts;
    var checkFun = function(config){    
        opts = extendCopy(config || {},ValCheck.defaults);
        return (new ValCheck())._init(opts);
    }
    
    function ValCheck(){
        //驗證規則
        var rule = {
            phone:/^1\d{10}$/,
            email:/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
            card:/^((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|71|(8[12])|91)\d{4}(((((19|20)((\d{2}(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(\d{2}(0[13578]|1[02])31)|(\d{2}02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[48])0229)))|20000229)\d{3}(\d|X|x))|(((\d{2}(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(\d{2}(0[13578]|1[02])31)|(\d{2}02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[48])0229))\d{3}))$/, //身份證號    
            zh:/^[\u4e00-\u9fa5]+$///純中文
        };
        
        this.rules = {
            isNonEmpty: function(value, errorMsg) {//不能為空     
                errorMsg = errorMsg||" ";         
                if (!value.length) return errorMsg;           
            },
            minLength: function(value, length, errorMsg) { //大於     
                errorMsg=errorMsg||" ";              
                if (value.length < length) return errorMsg;            
            },
            maxLength: function(value, length, errorMsg) {//小於  
                errorMsg=errorMsg||" ";               
                if (value.length > length) return errorMsg;
            },
            between: function(value, range, errorMsg) {//大於小於 
                errorMsg=errorMsg||" ";           
                var min = parseInt(range.split('-')[0]);
                var max = parseInt(range.split('-')[1]);            
                if (value.length < min || value.length > max) return errorMsg;
            },
            isRepeat:function(value, range, errorMsg){ //重覆密碼    
                errorMsg=errorMsg||" ";    
                var curPswDomVal = document.getElementById(range).value;
                if(value!==curPswDomVal) return errorMsg;
            },    
            isPhone: function(value, errorMsg) {    
                errorMsg=errorMsg||" ";              
                if (value!=null && value!='' && !rule.phone.test(value)) return errorMsg;
            },
            isEmail: function(value, errorMsg) {    
                errorMsg=errorMsg||" ";              
                if (value!=null && value!='' && !rule.email.test(value)) return errorMsg;
            },
            level:function(value,range,errorMsg){//密碼複雜程度
                errorMsg=errorMsg||" ";
                var r=checkFun.pwdStrong(value);                        
                if(range>4) range=3;
                if(r<range)  return errorMsg;            
            },
            isZh: function(value, errorMsg) {
                errorMsg=errorMsg||" ";                
                if (!rule.zh.test(value)) return errorMsg;
            },
            isCard: function(value, errorMsg) {
                errorMsg=errorMsg||" ";
                if (!rule.card.test(value)) return errorMsg;
            },
            
        };
    }
    
    //預設配置
    ValCheck.defaults = {
        formId:'verifyCheck',    //驗證的ID
        checkClass:'required', //需要驗證的DOM元素上預設class類名
        onBlur:null,//被驗證元素失去焦點的回調函數
        onFocus:null,//被驗證元素獲得焦點的回調函數
        onChange: null,//被驗證元素值改變的回調函數,回調參數為當前DOM元素
        successTip: true,//驗證通過是否有提示
        resultTips:null,//驗證提示的回調函數,傳回參數obj[當前元素],isRight[驗證是否通過],value[提示的值]
        clearTips:null //清空提示的回調函數,傳回參數obj[當前元素]
    };
    
    //驗證初始化
    ValCheck.prototype._init = function(config){
        var self = this;
        self.allinputs = document.getElementsByClassName(ValCheck.defaults.checkClass);
        self.allinputs = Array.prototype.slice.call(self.allinputs,0);
        for(var item =0, len = self.allinputs.length; item < len; item++){
            (function(i){
                self.allinputs[i].addEventListener('blur',function(e){
                    e.preventDefault();
                    var state = self.formValidator(self.allinputs[i]);
                    config.onBlur ? config.onBlur(self.allinputs[i],state) : '';    
                },false);
                
                self.allinputs[i].addEventListener('focus',function(e){
                    e.preventDefault();
                    if(config.onFocus){
                        config.onFocus(self.allinputs[i]);
                    }else{
                        var matched = []; //存放兄弟節點
                        var n = (self.allinputs[i].parentNode || {}).firstChild;
                        for(; n; n = n.nextSibling){
                            if(n.nodeType === 1 && n !== self.allinputs[i]){
                                n.innerHTML = '';
                            }
                        }
                    }
                },false);
                
                self.allinputs[i].addEventListener('change',function(e){
                    e.preventDefault();
                    config.onChange ? config.onChange(self.allinputs[i]) : '';
                },false);
            })(item);        
        }
    }
    
    /** 驗證規則
     * @param el 當前被驗證的DOM元素
     * */
    ValCheck.prototype.formValidator = function(el){
        var self = this;
        var validataString = el.getAttribute('data-valid');
        if(validataString === undefined){
            return false;
        }
        var validArray = validataString.split('||');
        
        var errorString = el.getAttribute('data-error');
        if(errorString === undefined){
            return false;
        }
        var errorArray = errorString.split('||');
        var ruleArray = [];
        for(var i =0, j = validArray.length; i < j; i++){
            ruleArray.push({
                funTitle:validArray[i],
                errorMsg:errorArray[i]
            });
        }
        return self.validataResult(el,ruleArray);
    }
    
    /** 驗證結果
     * @param el 驗證的DOM元素
     * @param ruleArray 需要逐一驗證的數組規則
     * */
    ValCheck.prototype.validataResult = function(el,ruleArray){
        var self = this;
        for(var i = 0, rule; rule = ruleArray[i++];){
            var applyArgs = rule.funTitle.split(':');
            var errorMsg = rule.errorMsg;
            var ruleFun = applyArgs.shift();//得到匹配刪除的函數名
            applyArgs.unshift(el.value);// 數組第一位插入value值
            applyArgs.push(errorMsg); //最後插入出錯信息
            applyArgs.push(el);
            var result = self.rules[ruleFun].apply(el, applyArgs);
            if(result){
                opts.resultTips ? opts.resultTips(el, false, result) : self.resultTips(el, false, result);
                return false;
            }
            
        }
        opts.successTip ? (
            opts.resultTips ? opts.resultTips(el,true) : self.resultTips(el, true)
        ) : self.clearTip(el);
        return true;    
    }
    
    /** 驗證信息的顯示
     * @param el 當前被驗證的DOM元素
     * @param isRight 驗證是否通過, false=未通過  true=驗證通過
     * @param value 提示信息
     * */
    ValCheck.prototype.resultTips = function(el, isRight, value){
        var cls = 'el_error';
        var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)',"g");
        value = value || '';
        if(!isRight){
            if(!el.className.match(reg)){
                el.className += ' ' + cls;
            }
        }else{
            if(el.className.match(reg)){
                el.className = el.className.replace(reg,'');
            }
        }    
        var matched = []; //存放兄弟節點
        var n = (el.parentNode || {}).firstChild;
        for(; n; n = n.nextSibling){
            if(n.nodeType === 1 && n !== el){
                n.innerHTML = value; //賦值提示信息
            }
        }
    };
    
    /** 清空提示
     * @param el 清空提示的DOM元素
     */
    ValCheck.prototype.clearTip = function(el){
        var cls = 'el_error';
        var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
        el.className.replace(reg,'');    
    };
    
    /****************對外開放方法******************/
    
    /** 外部可調用click方法,比如點擊事件時候調用checkFun.click(),驗證成功返回true
     * @param formId 驗證DOM為formId區域下的表單
     * @result {boolen} true or false
     * */
    checkFun.click = function(formId){
        formId = formId || opts.formId;
        var resultObj = []; //存放需要驗證的DOM對象
        var rangeobj = document.getElementById(formId);
        if(rangeobj.getElementsByClassName){
            rangeobj = [].slice.apply(rangeobj.getElementsByClassName(ValCheck.defaults.checkClass));
        }else{
            var tags = rangeobj.getElementsByTagName("*");  
            //遍歷每個DOM元素
            for(var i = 0, len = tags.length; i < len; i++){
                // 獲取到當前遍歷元素所使用的所有類名  
                var classNames = tags[i].className.split(" ");  
                for(var j = 0, l=classNames.length; j < l; j++){
                    if(classNames[j] == ValCheck.defaults.checkClass){
                        rangeobj.push(tags[i]);
                        break;
                    }
                }
            }
        }
        var check = new ValCheck();
        var checkResultNumber = 0; //檢測結果,檢查通過的數目
        var resultState = true;
        //開始驗證所有DOM元素
        for(var domNumber = 0, domlen = rangeobj.length; domNumber < domlen; domNumber++){
            everyResultState = check.formValidator(rangeobj[domNumber]);
            if(resultState){
                checkResultNumber ++;
            }
        }
        if(checkResultNumber !== domlen ){
            resultState = fasle;
        }
        return resultState;
    };
    
    /** 判斷密碼強度
     * @param val 當前DOM元素的value值
     * @return {number} 返回數字等級
     * */
    checkFun.pwdStrong = function(val){
        var lv=0;
        if(val.match(/[a-z]/g)){lv++;}
        if(val.match(/[A-Z]/g)){lv++;}
        if(val.match(/[0-9]/g)){lv++;}
        if(val.match(/(.[^a-z0-9A-Z])/g)){lv++;}    
        if(lv > 4){lv=4;}
        if(lv===0) return false;
        return lv;
    }
    
    window.checkFun = checkFun;
})();

css代碼:

.same{margin-bottom: 30px;position:relative;}
.same input{border:1px solid #ccc;width:200px;height:30px;line-height: 30px;padding-left:10px;}
.valid{color:red;position:absolute;}
.submitBtn{cursor: pointer;}

html代碼:

<div id="verifyCheck">
    <div class="same">
        <input type="text" placeholder="郵箱" value="" class="required email" id="email" data-valid="isNonEmpty||isEmail" data-error="email不能為空||郵箱格式不正確"/>
        <label class="focus valid"></label>
    </div>
    <div class="same">
        <input type="password" placeholder="密碼" value="" class="required password" id="password" data-valid="isNonEmpty||between:3-5" data-error="密碼不能為空||密碼長度在3-5位"/>
        <label class="focus valid"></label>
    </div>
    <div class="same">
        <input type="password" placeholder="重覆密碼" value="" class="required password2" id="password2" data-valid="isNonEmpty||isRepeat:password" data-error="密碼不能為空||兩次輸入的密碼不一致"/>
        <label class="focus valid"></label>
    </div>
    <button class="submitBtn" id="submitBtn">提交</button>
</div>

JS調用:

checkFun({
        onBlur:function(el,state){
            console.log($(el));
        }
   });
   
  document.getElementById('submitBtn').addEventListener('click',function(){
         checkFun.click();
  },false)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1:字元串 JS中的任何數據類型都可以當作對象來看。所以string既是基本數據類型,又是對象。 2:聲明字元串 var sStr = ‘字元串’; var oStr = new String(‘字元串’); 3:字元串屬性 1.length 計算字元串的長度(不區分中英文)。 2.construc ...
  • 模塊載入過程: 路徑分析 文件定位 模塊編譯 Node對引入過的模塊都會進行緩存,以減少二次引入時的開銷。緩存的是編譯和執行之後的對象。require時對緩存中的模塊是第一優先順序的 路徑分析 模塊標識符:require的參數,按書寫形式可以分成以下幾類: 核心模塊:如http,fs,path 文件模 ...
  • 轉載請註明出處: "Generator函數非同步應用" 上一篇文章詳細的介紹了Generator函數的語法,這篇文章來說一下如何使用Generator函數來實現非同步編程。 或許用Generator函數來實現非同步會很少見,因為ECMAScript 2016的async函數對Generator函數的流程式控制 ...
  • 介紹HTTP緩存之前先簡單說一下Web緩存 Web緩存是一種保存Web資源副本併在下次請求時直接使用該副本的技術。        Web緩存可以分為這幾種:瀏覽器緩存、CDN緩存、伺服器緩存、資料庫數據緩存 。因為可能會直接使用副 ...
  • 本文設計到常見對文檔的處理樣式,和塊,行標簽的特點。 沒用什麼重要內容,只是自己的一些知識點的回憶,對以前知識的一個梳理過程,望某懶蟲加油!!! ...
  • classList屬性的方法:add();remove();toggle(); 描述,在一些頁面我們需要使用兩個按鈕來回切換,如圖: 我們要使用到add()和remove()方法 html部分: <div class="login-title"> <a href="javascript:void(0 ...
  • 2017年npm上最熱門的項目之一——Pkg,可以直接將node.js項目打包成windows可以直接執行的exe文件(也支持FreeBSD、linux、macos、arm系統),並且無須修改你項目中的任何代碼。本文對該項目作了簡要說明與教程,並提供了一個簡單示例來說明其使用場景。 ...
  • CreateJS介紹請看CreateJS中文網或者官方網站 一.使用EaselJS 先到官網下載easeljs,也可以點這裡 1.得到easeljs-0.8.1.min.js後,新建一個HTML5文件並導入: 2.入口函數和創建canvas標簽: 3.創建舞臺: 二.使用EaselJS創建圖形和文字 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...