台中前端社群
Taichung Frontend Group
TALK #3
使用Jquery Validation
成為表單驗證的高手
黃竹藝
- a.k.a Chuyi Huang
- ROR開發者
- 朝成為前端工程師的目標前進
前端與後端的搭配
前後端獨立
前後端同人
前後端同組
表單是前台與後台的交接點 (後端)
- 送出欄位內容的值是否正確必須以後台為主
- 內容處理的結果必須以後台為主
- 如果有錯誤,錯誤訊息的內容以後台為主
表單是前台與後台的交接點 (前端)
- 表單的輸入界面與細節(label, input...)以前台為主
- 表單的外觀風格,欄位順序以前台為主
- 提示與錯誤訊息顯示方式以前台設計為主
表單驗證到底是誰的工作?
-
前端的立場:
- 是後端的工作,因為我不知道使用者會輸入什麼
- 是後端的工作,因為我不做跟伺服器溝通的工作
- 是後端的工作,因為表單的內容最後是送到後端
-
後端的想法:
- 前台要分擔,因為正確的提示可以減少表單輸入的錯誤
- 前台要分擔,因為錯誤訊息的顯示都沒有考量
- 前台要分擔,因為在使用者送出表單前就可以做驗證
表單的UI
從前端那裡拿到的表單
實際表單運作的UI
如果是Ajax表單,那loading時的提示呢?
實際表單運作的UI
- Form表提交成功或失敗訊息,樣式? 位置?
- 各個欄位需要的資料格式,是否必填?
- 各個欄位是否有提示,預設值或placeholder
- 表單送出後發生錯誤,各個欄位錯誤原因顯示
- 錯誤欄位是否highlight顯示?
- 按下鈕的前後是否有提示,是否能夠送出
- 按下鈕後是否將按鈕disabled避免重複送出?
- Ajax表單在送出時是否提示使用者loading中
談談Jquery Validation
- 搭配Jquery,歷史悠久
- 容易上手,內建許多檢查方法
- 驗證成功前不送出表單
- 可依照事件處理訊息
- 可自訂錯誤訊息
- 可自訂錯誤訊息樣式
- 可使用ajax驗證遠端邏輯
安裝方式
- <script src="/jquery.js"></script>
- <script src="/jquery.validate.min.js"></script>
- <-- 非必要 -->
- <script src="/jquery.additional_methods.js"></script>
使用方式
- $("#form_id").validate();
- 使用rules定義欄位規則
- 使用messages客制錯誤訊息
- 可設定debug模式,無需送出表單
- 有callback可在驗證後處理特殊功能
- 使用errorElement, errorClass, validClass, errorContainer與wrapper設定錯誤樣式,用showErrors設定主要訊息
使用方式
在送出Submit前會檢查,如果有錯誤便會停止送出表單
驗證規則
- required: 是否必填
- url: 驗證網址格式正確性
- number: 是否數字
- email: 是否Email格式
- minlegnth: 最短長度
- maxlength: 最長長度
- rangelength: 長度範圍
- remote: 使用ajax驗證遠端
- equalTo: 比較兩欄位
- require_from_group method: 多選一必填
- 外掛additional-methods驗證US電話,郵遞區號
遠端驗證
- 輸入資料是否存在
- 需要驗證使用者權限
- 需要比對資料庫內容
錯誤訊息 - 預設錯誤訊息
直接在原始檔內修改
錯誤訊息 - 客制錯誤訊息
事件處理
啟動與取消特定事件
另外支持onkeyup, onfocusout, onclick, onsubmit等事件
Callback
- submitHandler: 按下submit時客制處理特定事件
- invalidHandler: 錯誤發生時的處理機制
- success: 單欄位驗證成功時的處理
- highlight: 單欄位驗證錯誤時的處置,e.g加入class
- unhighlight: highlight的反向操作
- showErrors: 整體表單任一欄位發生事件時顯示
- errorPlacement: 錯誤訊息擺放位置
客制驗證
- 可參考additional-methods裡面的寫法
- 特殊輸入值的處理,例如郵遞區號,統編身份證等計算
- 搭配正規表示式Regexp做驗證
- 返回true才算驗證過,反之跳出錯誤
錯誤樣式
- errorLabelContainer:
- errorElement: 錯誤訊息的顯示標籤
- errorClass: 錯誤訊息的class
- validClass: 驗證過時的class
- errorContainer: 錯誤訊息包住在某特定selector中
- wrapper: 包住errorElement的標籤
注意事項
- *注意: 欄位的"name"屬性是必要的
- 避免重複id
- 更多驗證: https://github.com/jzaefferer/jquery-validation/tree/master/src/additional
其他form表驗證工具
- Happy.js
- Parsleyjs
- Jquery Form Validator
- 很多...
囧rz 不會寫javascript,能夠做表單驗證嗎?
使用HTML5的input新屬性
- <input type="email" name="email">
- <input type="number" name="quantity">
- <input type="search" name="googlesearch">
- <input type="url" name="homepage">
- <input type="time" name="enrolltime">
- range, month, tel, color, week, datetime...
- required, step, min, max與pattern屬性
顯示方式 以Chrome為例
瀏覽器支援度
Thank You