nice-validator表單驗證外掛的簡單使用
前言
前端表單校驗是過濾無效資料、假資料、有毒資料的第一步,是資料安全的第一道關卡,雖然我們不能100%相信客戶端提交的資料(真正的校驗還得在服務端進行),但設定前端表單校驗也是至關重要的,自己寫邏輯程式碼一個一個表單欄位去校驗不現實,又不想自己造輪子,使用jquery外掛是不錯的選擇,這裡記錄一下在專案中使用到的nice-validator表單驗證外掛的簡單使用
nice-validator,簡單、智慧、令人愉悅的表單驗證方案,使用簡單、配置項豐富、自由度高,對開發者友好,更多介紹請看官網:https://validator.niceue.com/
程式碼編寫
我們在IM系統的登入、登錄檔單作為例子,測試使用nice-validator進行表單校驗
點選下載(https://github.com/niceue/nice-validator/releases/tag/1.1.4)下載nice-validator-1.1.4.zip,下載下來後只留下有關鍵檔案即可,其他的都刪掉,然後在公用頭部head.html引入
使用方法
nice-validator有兩種使用方式:
(1)、DOM 繫結規則,無需 JS 程式碼,參考:https://validator.niceue.com/docs/dom-bindings.html,一般使用第二種,在js配置規則
(2)、JS 配置規則,無侵入 DOM
//提交登入 function login() { $("#loginForm").validator({ rules: {//定製規則 }, fields: {//配置規則 userName:'required;', password:'required;' }, messages: {//定製校驗失敗提示 }, valid: function () {//驗證通過,回撥 $.post(ctx + "/imsUser/login", $("#loginForm").serializeObject(), function (data) { if (data.flag) { window.location.href = ctx + "/imsUser/socketChart/" + data.data.userName + ".html" } else { // tip提示 tip.msg(data.msg); } }); } }).trigger("validate"); }
內建規則
外掛內建 8 個規則:
- required - 使欄位必填
- checked - 必選,還可以控制選擇專案的數量
- match - 當前欄位與另一個欄位比較
- remote - 獲取伺服器端驗證的結果
- integer - 只能填寫整數
- range - 只能填寫指定範圍的數
- length - 欄位值必須符合指定長度
- filter - 過濾當前欄位的值,不做驗證
自定義規則如果與內建規則同名,則自定義規則優先
自定義規則
$("#myForm").validator({ rules: {//定製規則 一、直接使用正則,適用於使用單個正則能搞定的驗證 // 1、使用陣列包裹正則和錯誤訊息,規則不通過時提示該訊息 mobile: [/^1[3458]\d{9}$/, '請檢查手機號格式'], // 2、或者,直接定義正則,需要另外定義錯誤訊息(寫在下方的messages引數裡),否則提示預設訊息 mobile: /^1[3458]\d{9}$/ 二、使用函式,函式方式具有最大的靈活性,搞定任何驗證。不同返回值,導致不同驗證結果: // 1、使用內建的 .test() 方法檢測是否符合某個規則,如果通過返回true,否則返回錯誤訊息 mobile: function(element, params) { return /^1[3458]\d{9}$/.test(element.value) || '請檢查手機號格式'; } // 2、自定義 ajax 驗證 // 你只需要將 $.ajax 返回,並且保證 response 符合上面的返回值說明,其他的外掛都會自動處理。 // 當然,你也可以加上 success 回撥做點別的,或者自己加上自定義 header mobile: function(element){ return $.ajax({ url: 'check/username.php', type: 'post', data: element.name +'='+ element.value, dataType: 'json' }); } 更多方式請參閱 自定義規則之函式:https://validator.niceue.com/docs/custom-rules.html }, fields: {//配置規則(使用規則) phone:'required;mobile', username:'required;' }, messages: {//定製校驗失敗提示 mobile:'請檢查手機號格式' }, valid: function () {//驗證通過的回撥 } }).trigger("validate");
自定義主題
自帶的規則比較少,樣式比較醜,好在在我們引入的語言檔案裡面(zh-CN.js)定義了部分規則,已經部分主題
有幾種主題(效果請戳:):https://validator.niceue.com/releases/1.1.4/demo/option-theme.html,我們使用yellow_right_effect,有個動畫效果,比較好看
但放到我們專案時發現超出div框的部分被遮擋
因此我們參考zh-CN.js,在head.html宣告一個自定義主題,並進行全域性配置
<!-- nice validator--> <script> //宣告一個自定義主題 $.validator.setTheme({ 'hz-theme': { formClass: 'n-yellow', msgClass: 'n-bottom', msgArrow: '<span class="n-arrow"><b>◆</b><i>◆</i></span>', msgShow: function ($msgbox, type) { var $el = $msgbox.children(); if ($el.is(':animated')) return; if (type === 'error') { if ($el.parents('.input-group').length) { $el.parent().css({position: 'initial'}); } $el.css({left: '20px', opacity: 0}).addClass('keep-front') .delay(100).show().stop() .animate({left: '-4px', opacity: 1}, 150) .animate({left: '3px'}, 80) .animate({left: '0px'}, 80); } else { $el.css({left: 0, opacity: 1}).fadeIn(200); } }, msgHide: function ($msgbox, type) { var $el = $msgbox.children(); $el.stop().delay(100).show() .animate({left: '20px', opacity: 0}, 300, function () { $msgbox.hide(); }); } } }); //全域性配置 $.validator.config({ timely: 2,//觸發時機 theme: 'hz-theme',//使用自定義主題 rules: {//定製規則 //郵箱格式 email: /^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$/, //限制輸入整數 integer: function (element, params) { //刪除非整數字符 element.value = element.value.replace(/[^0-9]/g, ''); //預設規則 var re, z = '0|', p = '[1-9]\\d*', key = params ? params[0] : '*'; switch (key) { case '+': re = p; break; case '-': re = '-' + p; break; case '+0': re = z + p; break; case '-0': re = z + '-' + p; break; default: re = z + '-?' + p; } re = '^(?:' + re + ')$'; return new RegExp(re).test(this.value) || (this.messages.integer && this.messages.integer[key]); } } }); </script>head.html
規則作用範圍
(1). 全域性
使用 $.validator.config()
,建議配置在 local 配置檔案(如:zh-CN.js)中,任何例項,任何欄位都能訪問到該規則
$.validator.config( rules: { mobile: [/^1[3-9]\d{9}$/, "請填寫有效的手機號"], chinese: [/^[\u0391-\uFFE5]+$/, "請填寫中文字元"] } );
(2). 當前例項
在呼叫初始化驗證的時候傳參,只對呼叫時的例項有效
$("#myForm").validator( rules: { mobile: [/^1[3-9]\d{9}$/, "請填寫有效的手機號"], chinese: [/^[\u0391-\uFFE5]+$/, "請填寫中文字元"] } );
(3). 當前欄位
只能通過 DOM 方式在表單元素上定義
<input name="demo" data-rule="required;xxx" data-rule-xxx="[/^\d{6}$/, '請輸入6位數字']">
效果演示
登入表單
登入校驗簡單一點,就一個非空校驗就OK了
//提交登入 function login() { $("#loginForm").validator({ rules: {//定製規則 }, fields: {//配置規則(使用規則) userName: 'required;', password: 'required;' }, messages: {//定製校驗失敗提示 }, valid: function () {//驗證通過,回撥 $.post(ctx + "/imsUser/login", $("#loginForm").serializeObject(), function (data) { if (data.flag) { window.location.href = ctx + "/imsUser/socketChart/" + data.data.userName + ".html" } else { // tip提示 tip.msg(data.msg); } }); } }).trigger("validate"); }
效果
登錄檔單
註冊的時候判斷賬號是否已經存在,我們之前是這樣做的
現在做如下修改,先在controller新增一個查詢介面,去掉儲存方法裡面的校驗
修改js程式碼
//提交註冊 function register() { $("#registerForm").validator({ rules: {//定製規則 reusername: function (element) { return _ajax({ url: ctx + '/imsUser/reusername', type: 'post', data: element.name +'='+ element.value, dataType: 'json' }); } }, fields: {//配置規則(使用規則) userName: 'required;reusername', password: 'required', nickName: 'required', email: 'required;email', phone: 'required;mobile', }, messages: {//定製校驗失敗提示 reusername:"賬號已存在!!!" }, valid: function () {//驗證通過,回撥 let newTime = commonUtil.getNowTime(); $("#createdTime").val(newTime); $("#updataTime").val(newTime); $("#avatar").val("/image/logo.png"); $.post(ctx + "/imsUser/save", $("#registerForm").serializeObject(), function (data) { if (data.flag) { switchover(); } // tip提示 tip.msg(data.msg); }); } }).trigger("validate"); }
效果
後記
文章到這裡結束,更多nice validator校驗外掛的引數配置、方法、事件等介紹請具體查閱官方文件:https://validator.niceue.com/d