創建通用的表單校驗邏輯庫


表單校驗一直是web開發中最基礎,也是最不好做的一個環節。相信很多初學web開發的人,第一課就是學習如果基於js、jQuery實現表單驗證工作,在10年前,甚至是5年前,JavaScript還是被多數工程師輕視的一門語言,那時候很多人認為JavaScript的出現充其量也就為了完成web頁面上的表單校驗的工作。由此可知表單校驗的確是web開發中相當基礎的一項工作。說它不好做,是因為一些項目中表單校驗往往工作量極大,一個字段要校驗的項目非常多,例如非空、字符串長度限制等等,正常來說任何一個字段都需要進行校驗,比如數據庫每個字段的長度是有限的,所以最起碼要校驗一下字段的長度吧。所以,表單校驗就是一項沒太大技術含量,但是又非常耗費體力的工作,尤其在一些對交互友好性、用戶體驗要求較高的項目中,表單校驗的開發就變得更繁瑣與枯燥。

於是我們往往依賴於一些現成的表單校驗框架,如:jquery-validation、validation-engine、easyui-validatebox等。

分析以上js庫,可以發現他們有個共同的特點,就是采用策略模式,將不同的表單校驗規則封裝成策略類,提高校驗邏輯的復用性;同時提供“規則字符串”的形式,讓用戶通過一個簡單的字符串來創建規則策略類的實例,來對表單的輸入項進行校驗,校驗的結果就是一個標志位加一個錯誤提示語句。這樣的設計使得表單校驗由一個體力活變成了一個配置項,大大降低了表單校驗相關的代碼量。

但是的以上控件都是按照這個邏輯實現的表單校驗,但是他們立足點卻是在表單的提示,與web頁面結合過於緊密,其邏輯部分無法單獨使用。而他們大多都是基於jQuery,現在很多web項目都不再依賴於jQuery;同時他們的提示方式也未必是我們想要的,對於如今的web項目而言,做將錯誤提示封裝成組件是一件很容易的事情,真正需要的反而是表單校驗的邏輯部分。

所以基於以上控件的表單驗證特點,筆者開發了一個表單校驗庫,更准確說是表單校驗邏輯庫——my-validation,這個庫僅提供表單校驗的邏輯,使用簡單的api可將復雜的表單驗證過程變得只需要配置一下就能完成,便於校驗的邏輯復用,並返回帶有提示語句的錯誤結果列表,方便嵌入到任何框架中,完成表單校驗的邏輯部分。


安裝方法:

webpack中使用:

npm install git://github.com/laden666666/my-validation --save

然后直接用reqiure引用即可

var myValidation = require("my-validation");

如果是瀏覽器環境直接script標簽引用my-validation.js或者my-validation.min.js文件即可。 


使用方法:

1.根據規則字符串校驗:

共提供兩個兩個重載api:

myValidation.validation(ruleStringString, valueString)
參數 參數描述
ruleStringString 規則的字符串
valueString 要校驗的字符串
MyValidation.validation(ruleStringJson, values, isStringPath) 
參數 參數描述
ruleStringJson 規則的字符串的集合
values 要校驗的字符串的集合
isStringPath 啟用子對象key的路徑的做key的模式,校驗路徑對應子對象的屬性


這里解釋一下規則的字符串,它是校驗的核心,格式是

規則1名[參數1,參數2…];規則2名[參數1,參數2…]…

如:“required;minSize[5]”表示使用required規則校驗,校驗非空;然后再使用minSize規則校驗,參數是5,表示字符串長度不能小於5 
規則的字符串中特殊字符有“;”、“,”兩個,需要轉義,轉義字符分別為“;;”、“;,”。

使用的時候可以直接校驗一個字符串,如:

var result = myValidation.validation("required;sizeMax[16]", "test"); 

也可以根據一json,完成對一個對象的校驗,並且支持微信小程序那種使用過子對象key的路徑的key的功能,如:

var result = myValidation.validation({ "user.name" : "required;sizeMax[16]", },{ user : { name : "test" } },true) 

myValidation.validation返回的結果是校驗規則結果的數組。 

 

2.注冊自定義規則:

校驗規則相當於一個策略模式的實現,如果不能自定義規則,這個校驗系統就相當於斷了翅膀的鳥,沒有任何自由度可言。所以能夠提供動態擴展規則的api是非常重要的,擴展的api如下:

myValidation.registerRule(name, validationFn, msg)
參數 參數描述
name 規則的名稱
validationFn 校驗函數
msg 默認的錯誤提示語句,支持字符串或函數

校驗結果有兩個:boolean型校驗結果和一個字符串型的錯誤提示語

這個錯誤提示語句可以動態生成,也可以指定為通用的形式,如:

myValidation.registerRule("minSize", function (value, object, count) { return !!value && value.length >= parseInt(count); },function (value, object, count) { return "最少輸入" + count + "個字符數"; });

指定默認錯誤提示的例子:

myValidation.registerRule("integer", function (value, object) { return !!value && /^[-+]?\d+$/.test(value); }, "必須是整數");

boolean型校驗結果的生成就要用到校驗函數validationFn。校驗函數是表單校驗的核心,通過上面的兩個例子我們能夠校驗函數的定義方式,他的具體參數如下: 

參數 參數描述
value  要校驗的值
object  校驗的對象,包括校驗字符串,和用戶其他自定義屬性 
params  校驗字符串的參數列表,是rest參數。如xx[a,b,c],這里會解析出3個參數,分別為:“a”、“b”、“c”

需要注意的是,校驗失敗的情況下必須返回fals或者是調用myValidation.result生成的返回結果,否則視為校驗成功。

 

3.自定義返回錯誤提示:

有時候需要在驗證的時候動態的生成返回錯誤,而不是返回默認錯誤,此時可以使用以下api:

myValidation.result (result, msg)

 

參數 參數描述
result boolean型,校驗的結果,僅當false時候表示驗證失敗
msg 驗證失敗的字符串,提示這個字符串的優先級比默認字符串高

如:

myValidation.registerRule("returnMsg", function () { return myValidation.result(false, "自定義錯誤提示"); }, "此為默認提示,會被覆蓋掉");

上面規則的錯誤返回提示語會是校驗時候生成的“自定義錯誤提示”這句話,而不是注冊時候設置的默認的提示語。

 

4.分析驗證結果:

驗證結果是個錯誤信息的數組,或者是一個key、value形式的json,但是表單驗證的結果究竟是成功還是失敗,我們無法馬上得知。你可以通過遍歷各個驗證項的result字段,不斷一個個相與來獲得結果的boolean值,也可以直接使用我們的api函數:

myValidation.analyseResult (result)
參數 參數描述
result validation的驗證結果

如:

var result = myValidation.validation({
    "user.name" : "required;sizeMax[16]",
},{
     user : {
          name : "test"
     }
},true);

result = myValidation.analyseResult(result) //result被轉為boolean型

默認校驗庫:

參數 參數描述 例子
required 必填 required
minSize 要求字符串長度不大於指定值 minSize[5]
maxSize 要求字符串長度不小於指定值 maxSize[5]
min 必須是數字,並要求不小於指定值 min[5]
max 必須是數字,並要求不大於指定值 max[5]
number 必須是數字 number
integer 必須是整數 integer
regex 正則表單式 regex[^\\S{2,4}$,i]

目前僅提供幾個筆者馬上要使用的規則,其他規則大家可以自己通過myValidation.registerRule注冊。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM