HTML5實戰應用:如何讓表單驗證更友好
HTML5表單驗證給前端人員帶來了便利,但是在用戶體驗上存在一些缺陷,默認的提示對用戶很不友好,無法準確的獲取想要的信息。好在大牛們在接口設計的時候提供了setCustomValidilty方法可以自定義提示信息。這是一個好消息,但也存在一些弊端,需要讓開人員做額外的一些處理才達到真正想要的目的。
接下來通過以下示例來闡述方法的應用。
未調用setCustomValidity)方法!DOCTYPE html>
html
hea
ata charset="utf-8
titleform test/title>
/head
body
form name="test action="" method="post>
input type="text" required pattern="^\d{4[ DISCUZ_CODE_21 ]quot; placeholder="請輸入代碼" >
button type="submit">Check/button>
/form>
/body>
/html>
複製代碼執行結果:
A:未輸入數據
B:不匹配
這兩個結果都匹配了。但是不匹配這裏的提示方案案與預想的不符合。
通過調用setCustomValidity方法來優化提示文案!DOCTYPE html>
html>
head>
mata charset="utf-8">
title>form test/title>
/head>
body>
form name="test" action="." method="post">
input type="text" required pattern="^\d{4}[ DISCUZ_CODE_22 ]quo; placeholder="請輸入代碼" >
button type="submit">Check/button>
/form>
script type="text/javascript">
document.querySelector"input").setCustomValidity("請輸入4位數字的代碼");
/script>
/body>
/html> 複製代碼執行結果:
A:爲空
B:不合法
C:合法
從三個操作來看,調用了setCustomValidity方法後,原生的表單驗證羅輯都返回false了。悲劇。
再看看接口屬性的變化
調用之前:
A)
B)
C)
調用之後:
A)
B)
C)
從上面的截圖可以看到validationMessage沒清空,valueMissing和patternMismatch都已經驗證通了。
總結一下:
從面上可以看出,驗證通過與否除了跟validity接口下的屬性相關外,還跟validationMessage是否有值有關係。只有當validity接口下的屬性(customError除外)都爲false並且validationMessage爲空時纔算驗證通過。
優化後的代碼:!DOCTYPE html>
html>
head>
mata charset="utf-8">
title>form test/title>
/head>
body>
form name="test" action="." method="post">
input type="text" required pattern="^\d{4}[ DISCUZ_CODE_23 ]quot; oninput="out(this)" placeholder="請輸入代碼" >
button type="submit">Check/button>
/form>
script type="text/javascript">
function out(i){
var v=i.validity;
if(true===v.valueMessing){
i.setCustomValidity("請填寫些字段");
}else{
if(true===v.patternMismatch){
i.setCustomValidity("請輸入4位數字的代碼");
}else{
i.setCustomValidity("");
}
}
}
/script>
/body>
/html>