表單校驗一直是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注冊。