手把手教你自己寫一個js表單驗證框架

2021-01-14 站長之家

其實我自己也就能簡單用用js而已,但是呢,相對很多初學者來說多懂了點,所以鬥膽孟浪一下,將一些所得記錄下來,以供更多的初學者能夠知道一個東西的實現過程,省去在源碼裡摸索的過程。

在表單程序中,在頁面上需要很多的Js代碼來驗證表單,每一個field是否必須填寫,是否只能是數字,是否需要ajax到遠程驗證,blablabla。如果一個一個單獨寫勢必非常的繁瑣,所以我們的第一個目標就是構建一個類似DSL的東西,用表述的語句而非控制語句來實現驗證。

其次一個個單獨寫的話還有一個問題就是必須全部驗證通過才能提交,但是單獨驗證會因為這個特徵而增加很多額外的控制代碼,且經常會驗證不全面。所以第二個目標就是能夠全面的整合整個驗證的過程。最後不能是一個無法擴展的一切寫死的實現,必要的擴展性還是要的。

首先,我們需要一個能夠描述對欄位驗證的類

1 function Field(params){
2     this.field_id=params.fid;     //要驗證的欄位的ID
3     this.validators=params.val;   //驗證器對象數組
4     this.on_suc=params.suc;       //當驗證成功的時候執行的事件
5     this.on_error=params.err;     //當驗證失敗的時候執行的事件
6     this.checked=false;           //是否通過驗證
7 }
8

關於驗證器對象我們在後面來討論,接下來我們擴展這個類,加入validate方法

 1 Field.prototype.validate=function(){
 2     //循環每一個驗證器
 3     for(item in this.validators){
 4         //給驗證器附加驗證成功和驗證失敗的回調事件
 5         this.set_callback(this.validators[item]);
 6         //執行驗證器上的Validate方法,驗證是否符合規則
 7         if(!this.validators[item].validate(this.data())){
 8             break; //一旦任意一個驗證器失敗就停止
 9         }
10     }
11 }

再加入一個獲取欄位值的方法:

1 //獲取欄位值的方法
2 Field.prototype.data=function(){
3     return document.getElementById(this.field_id).value;
4 }

設置驗證器回調函數的方法set_callback如下:

 1 Field.prototype.set_callback=function(val){
 2     var self=this;              //換一個名字來存儲this,不然函數的閉包中會覆蓋這個名字
 3     val.on_suc=function(){      //驗證成功執行的方法
 4         self.checked=true;      //將欄位設置為驗證成功       
 5         self.on_suc(val.tips);  //執行驗證成功的事件
 6     }
 7     val.on_error=function(){    //驗證失敗的時候執行的方法
 8         self.checked=false;     //欄位設置為驗證失敗
 9         self.on_error(val.tips);//執行驗證失敗的事件
10     }
11 }

接下來我們就來看看驗證器,驗證器是真正執行驗證過程的類,根據一般的驗證過程,我們可以將其分類成,長度驗證(包括必填驗證),正則表達式驗證,自定義函數驗證,Ajax遠程驗證這幾種,所以我們定義這幾種驗證器類,Ajax遠程驗證為了方便引用了jQuery,其他部分也有用到:

 1
 2 //長度驗證的驗證器類
 3 function Len_val(min_l,max_l,tip){
 4     this.min_v=min_l;
 5     this.max_v=max_l;
 6     this.tips=tip;
 7     this.on_suc=null;
 8     this.on_error=null;
 9 }
10 Len_val.prototype.validate=function(fd){
11     if(fd.length<this.min_v||fd.length>this.max_v){
12         this.on_error();
13         return false;
14     }
15     this.on_suc();
16     return true;
17 }
18 //正則表達式驗證器
19 function Exp_val(expresion,tip){
20     this.exps=expresion;
21     this.tips=tip;
22     this.on_suc=null;
23     this.on_error=null;
24 }
25 Exp_val.prototype.validate=function(fd){
26     if(!fd){
27         this.on_suc();
28         return true;
29     }
30     if(this.exps.test(fd)){
31         this.on_suc();
32         return true;
33     }else{
34         this.on_error();
35         return false;
36     }
37 }
38 //遠程驗證器
39 function Remote_val(url,tip){
40     this.p_url=url;
41     this.tips=tip;
42     this.on_suc=null;
43     this.on_error=null;
44 }
45 Remote_val.prototype.validate=function(fd){
46     var self=this;
47     $.post(this.p_url,{f:fd},
48         function(data){
49             if(data.rs){
50                 self.on_suc();
51                 return;
52             }else{
53                 self.on_error();
54             }
55         },"json"
56     );
57     return false;
58 }
59 //自定義函數驗證器
60 function Man_val(tip,func){
61     this.tips=tip;
62     this.val_func=func;
63     this.on_suc=null;
64     this.on_error=null;
65 }
66 Man_val.prototype.validate=function(fd){
67     if(this.val_func(fd)){
68         this.on_suc();
69     }else{
70         this.on_error();
71     }
72 }

相關焦點

  • 15個最佳的 JavaScript 表單驗證庫
    1.ApproveJSapprovejs不會自動附加到輸入變化的事件或表單提交事件。它也不會通過自動顯示錯誤來操作DOM。這允許您處理您想要的驗證。approvejs暴露一個單一的方法,value()讓你決定當一個值驗證錯誤顯示的方式。如果你喜歡控制或有點強迫症一樣,approvejs是給你的。
  • 10個強大的Javascript表單驗證插件推薦
    實際上一個優秀的程式設計師不僅是技術高手,也應該是善假於外物的。本文介紹了10個不錯的JavaScript表單驗證插件,使用它們完全可以節省你的時間!希望你喜歡。1. validate.jsValidate.js是一個非常不錯的JavaScript表單驗證庫,源於CodeIgniter API。該庫相當輕巧(不到1KB),不要求任何JavaScript框架,可以在所有主流瀏覽器中運行(包括IE 6)。
  • 強力推薦10款Javascript表單驗證插件
    【IT168 技術】創建一個JavaScript表單驗證插件,可以說是一個繁瑣的過程,涉及到初期設計、開發與測試等等環節。實際上一個優秀的程式設計師不僅是技術高手,也應該是善假於外物的。本文介紹了10個不錯的JavaScript表單驗證插件,使用它們完全可以節省你的時間!希望你喜歡。
  • 用戶體驗超棒且功能強大使用簡單的javascript表單驗證 - Parsley.js
    用戶體驗超棒且功能強大使用簡單的javascript表單驗證 - Parsley.js 大家還記得我們曾經介紹過的表單驗證jquery插件jquery.validationEngine
  • 實戰jQuery和PHP CodeIgniter表單驗證
    【IT168 專稿】        前言  在Web建站中,表單的合法性驗證是十分重要的一個環節,其中包括客戶端瀏覽器的Javascript的驗證和服務端的驗證。
  • 手把手教你寫網絡爬蟲(5):PhantomJS實戰
    本系列:《手把手教你寫網絡爬蟲(1):網易雲音樂歌單》《手把手教你寫網絡爬蟲(2):迷你爬蟲架構》
  • Vue 騷技巧,策略模式實現動態表單驗證
    4.2 表單驗證除了表格中的 formatter 之外,策略模式也經常用在表單驗證的場景,這裡舉一個 Vue + ElementUI 項目的例子,其他框架同理。ElementUI 的 Form 表單 具有表單驗證功能,用來校驗用戶輸入的表單內容。實際需求中表單驗證項一般會比較複雜,所以需要給每個表單項增加 validator 自定義校驗方法。
  • 使用React和HTML5表單驗證API處理表單
    我們在任何地方都使用它們,幾乎每個庫和框架。但是React呢?Facebook就如何處理表單提供了有限的意見。主要是為交互事件訂閱表單和控制項,並通過「value」屬性傳遞狀態。因此表單驗證和提交邏輯取決於您。體面的用戶界面意味著你可以覆蓋「on submit」/「on input」欄位驗證,內聯錯誤消息,根據有效性切換元素,「原始」,「提交」狀態等邏輯。
  • 手把手教你pytest測試框架(7)-fixture裝飾器
    文 | 遠山近海手把手教你pytest測試框架(1)-初識框架手把手教你pytest測試框架(2)-參數講解手把手教你pytest測試框架(3)-用例失敗重跑手把手教你pytest測試框架(4)-前置和後置手把手教你pytest測試框架(5)-mark標記裝飾器概念fixture用來完成那些需要多次重複執行的用例
  • js期中大作業第二題——表單驗證中的即時錯誤提醒
    題目是:完成表單驗證中的即時錯誤提醒。要求用戶名可包含字母、數字和下劃線;密碼至少有6位;再次輸入密碼和上一次需要一致;出生日期是四位年份且以20開頭,日期需在0-31之間。每個文本框都必須填寫,不能空。
  • 基於Nest.js + React 的開發框架 Notadd 2.0 Beta2 發布
    前言    大多數 node.js 框架都沒解決架構問題,使得 node.js 沒能像 spring
  • 手把手教你用JS/Vue/React實現幸運水果機(80後情懷之作)
    項目體驗地址免費視頻教程分別使用原生JS,Vue和React,手把手教你開發一個H5小遊戲,快速上手Vue和React框架的使用。項目截圖在線體驗在線體驗遊戲介紹幸運水果機是一款街機遊戲,遊戲界面由24個方格拼接成一個正方形,每個方格中都有一個不同的水果圖形,方格下都有一個小燈。
  • 一個非常強大完整的web表單驗證程序
    表單的驗證一直是網頁設計者頭痛的問題,表單驗證類 Validator就是為解決這個問題而寫的,旨在使設計者從紛繁複雜的表單驗證中解放出來,把精力集中於網頁的設計和功能上的改進上。Validator是基於JavaScript技術的偽靜態類和對象的自定義屬性,可以對網頁中的表單項輸入進行相應的驗證,允許同一頁面中同時驗證多個表單,熟悉接口之後也可以對特定的表單項甚至僅僅是某個字符串進行驗證。因為是偽靜態類,所以在調用時不需要實例化,直接以"類名+.語法+屬性或方法名"來調用。此外,Validator還提供3種不同的錯誤提示模式,以滿足不同的需要。
  • 5款最火的Node.js框架,你都用過嗎?
    Node.js已經誕生10年,在這10年裡,它因後端簡化並發編程而被關注,因作為前端輔助開發工具而流行。今天,小編就給大家介紹5款最火的Node.js框架,來看看你有沒有用過吧。2、xpress.js 第二個推薦的框架,是針對Node.js新手的,這個框架也是很有名了,它的特點有:擁有小且靈活的Node.js Web應用程式框架;帶有MVC(模型-視圖-控制器);允許用戶動態呈現大型HTML頁面;允許通過設置中間件來響應HTTP請求;有一組路由庫,這些庫集基於HTTP方法執行各種web操作;帶有多視圖支持系統
  • 10個強大的Node.JS框架,加速您的Web開發
    Hapi.js提供諸如使用JOI的輸入驗證、緩存、日誌記錄、配置和錯誤處理等功能,所有這些功能都旨在構建具有乾淨代碼並提供高性能的Web應用程式和API。Sails.jsSails.js是Node.js的另一個強大的框架,也是最受歡迎的MVC框架之一。它用於構建自定義、企業級和實時應用程式。
  • 2020年的前端工程師請收下這幾個Vue.js開源框架
    vue是一套用於構建用戶界面的漸進式JavaScript框架,簡單說Vue是類似於view的前端框架。目前vue技術社區在英文或中文都非常豐富,社區都有很多經驗豐富的開發人員,其功能也非常豐富與使用性,屬於輕量級框架。vue還有一個優點是容易學習,有前端經驗的開發者容易上手,所以請前端開發者要掌握幾個實用的Vue.js開源框架。
  • 最受歡迎的 HTML、CSS 和 JS 框架
    前段時間,小編複習了一下前端框架--bootstrap,今天給大家分享一下!
  • 在 Vue.js 中集成 CSS 框架
    npm install bootstrap jquery --save你需要在自己的 Vue 的 main.js 文件中添加 Bootstrap 依賴項,這樣就可以在整個程序中全局使用。安裝併集成 FoundationFoundation 是一個優秀的 CSS 框架。它有兩個框架:一個用於電子郵件,一個用於網站。我們需要的是 Foundation Sites 框架,因為我們只關心在 Web 中使用 Foundation。
  • Ember.js和Vue.js,哪種框架更適合前端開發?
    作為一個流行的前端開發框架,學習指南必不可少。Ember.js明確了一般應用程式的組織和結構,確保你不會犯任何錯誤。Ember.js的模板基於Handlebar 語法,藉助它可以使你輕鬆閱讀和理解模板,同樣也能使頁面加載速度變得更快。除此之外,你不必每次在頁面上添加或刪除數據時都更新模板,因為這一切,語言本身已自動為你完成。
  • 基於Nest.js 的開發框架 Notadd 2.0 Beta1 發布
    [開發快] 像搭積木一樣快速滿足自己的開發需求[高性能] 單機並發輕鬆上萬[