核心要點
.willValidate
、.checkValidity()
、.validity
和.setCustomValidity()
。這些分別用於檢查是否將驗證字段、驗證字段、檢查字段的有效性以及設置自定義有效性消息。但是,並非所有屬性都受所有瀏覽器支持。 本文是關於HTML5網絡表單的三部分系列文章中的最後一篇,我們將討論JavaScript集成和約束驗證API。如果您尚未閱讀標記和CSS文章,請先閱讀以確保您熟悉這些概念。 HTML5允許我們在無需任何JavaScript代碼的情況下實現客戶端表單驗證。但是,在實現更複雜的表單時,我們需要增強原生驗證,因為:
:invalid
和:required
樣式在用戶與表單交互之前就在頁面加載時應用。 一些JavaScript代碼和約束驗證API可以改善用戶體驗。請注意,如果您想支持各種瀏覽器和輸入類型,這可能會變得有點混亂,我們將努力做到這一點。
攔截表單提交
在HTML5之前,客戶端驗證涉及將提交處理程序附加到表單,該處理程序將驗證字段、顯示錯誤並阻止提交事件。在HTML5中,瀏覽器將首先執行其自身的驗證——只有在表單有效時才會觸發提交事件。因此,如果您想執行一些複雜的操作,例如顯示您自己的錯誤、比較或自動填充字段,則必須通過將表單的noValidate
屬性設置為true
來關閉原生驗證:
var form = document.getElementById("myform"); form.noValidate = true; // 设置处理程序以在提交时验证表单 // onsubmit 用于更轻松的跨浏览器兼容性 form.onsubmit = validateForm;
當然,這意味著您必須在代碼中檢查字段錯誤,但我們很快就會看到,仍然可以使用原生的瀏覽器驗證。
字段.willValidate
屬性
每個輸入字段都有一個.willValidate
屬性。這將返回:
true
:當瀏覽器將原生驗證字段時;false
:當瀏覽器不會驗證字段時;undefined
:當瀏覽器不支持原生HTML5驗證時,例如IE8。 由於我們上面禁用了原生驗證,因此每個字段都將返回false
。讓我們創建我們的validateForm
處理程序,它將循環遍歷所有字段並檢查原生驗證是否可用:
var form = document.getElementById("myform"); form.noValidate = true; // 设置处理程序以在提交时验证表单 // onsubmit 用于更轻松的跨浏览器兼容性 form.onsubmit = validateForm;
循環迭代表單elements
集合中的所有字段,並檢查它們是輸入而不是其他類型,例如按鈕和字段集。下一行很重要……
function validateForm(event) { // 获取跨浏览器事件对象和表单节点 event = (event ? event : window.event); var form = (event.target ? event.target : event.srcElement), f, field, formvalid = true; // 循环所有字段 for (f = 0; f < form.elements.length; f++) { // 获取字段 field = form.elements[f]; // 忽略按钮、字段集等 if (field.nodeName !== "INPUT" && field.nodeName !== "TEXTAREA" && field.nodeName !== "SELECT") continue; // 原生浏览器验证可用吗? if (typeof field.willValidate !== "undefined") { // 原生验证可用 } else { // 原生验证不可用 } } }
false
和undefined
都是虛假值,因此您不能只檢查field.willValidate
!我們現在知道第一個代碼塊內的代碼將在可以使用原生驗證時進行評估。但是……
瀏覽器是否支持輸入類型?
如果您閱讀第一部分,您會記得不支持的輸入類型會回退到文本。例如:
// 原生浏览器验证可用吗? if (typeof field.willValidate !== "undefined") { // 原生验证可用 } else { // 原生验证不可用 }
在Firefox 29或IE11中不受原生支持。這些瀏覽器將(有效地)呈現:
<input type="date" name="dob" />
但是,這兩個瀏覽器都支持文本類型的驗證,因此field.willValidate
不會返回undefined
!因此,我們必須檢查我們的type
屬性是否與對象的.type
屬性匹配——如果它們不匹配,我們需要實現舊版回退驗證,例如:
<input type="text" name="dob" />
字段.checkValidity()
方法
如果原生驗證可用,則可以執行.checkValidity()
方法來驗證字段。如果沒有任何問題,則該方法返回true
,否則返回false
。還有一個類似的.reportValidity()
方法,它返回當前狀態而無需重新檢查,儘管這不太有用,並且並非所有瀏覽器都支持。這兩種方法也會:
.validity
對象,以便可以更詳細地檢查錯誤;invalid
事件。這可以用來顯示錯誤、更改顏色等。請注意,沒有相應的valid
事件,因此請記住如有必要重置錯誤樣式和消息。 字段.validity
對象
.validity
對象具有以下屬性:
.valid
– 如果字段沒有錯誤,則返回true
,否則返回false
。
.valueMissing
– 如果字段是必需的但未輸入值,則返回true
。
.typeMismatch
– 如果值不是正確的語法(例如,格式錯誤的電子郵件地址),則返回true
。
.patternMismatch
– 如果值與pattern
屬性的正則表達式不匹配,則返回true
。
.tooLong
– 如果值長於允許的maxlength
,則返回true
。
.tooShort
– 如果值短於允許的minlength
,則返回true
。
.rangeUnderflow
– 如果值低於min
,則返回true
。
.rangeOverflow
– 如果值高於max
,則返回true
。
.stepMismatch
– 如果值與step
不匹配,則返回true
。
.badInput
– 如果條目無法轉換為值,則返回true
。
.customError
– 如果字段設置了自定義錯誤,則返回true
。
並非所有屬性都受所有瀏覽器支持,因此請注意不要做太多假設。在大多數情況下,.valid
或.checkValidity()
的結果應該足以顯示或隱藏錯誤消息。
(後續內容與原文相同,篇幅過長,此處省略。 請根據需要自行調整輸出內容的長度和細節。)
以上是HTML5表格:JavaScript和約束驗證API的詳細內容。更多資訊請關注PHP中文網其他相關文章!