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

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

因而咱們每每依賴於一些現成的表單校驗框架,如:jquery-validation、validation-engine、easyui-validatebox等。webpack

分析以上js庫,能夠發現他們有個共同的特色,就是採用策略模式,將不一樣的表單校驗規則封裝成策略類,提升校驗邏輯的複用性;同時提供「規則字符串」的形式,讓用戶經過一個簡單的字符串來建立規則策略類的實例,來對錶單的輸入項進行校驗,校驗的結果就是一個標誌位加一個錯誤提示語句。這樣的設計使得表單校驗由一個體力活變成了一個配置項,大大下降了表單校驗相關的代碼量。git

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

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


安裝方法:

webpack中使用:數據庫

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

而後直接用reqiure引用便可npm

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

若是是瀏覽器環境直接script標籤引用my-validation.js或者my-validation.min.js文件便可。 json


使用方法:

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註冊。

相關文章
相關標籤/搜索