Modern input types: date, email, required, pattern and so on... automaticallly validated, automaticallly get navite error messagesjavascript
CSS :valid :invalidcss
Constraint Validation APIhtml
這些技術是否是就夠了,咱們表單驗證的問題就解決了?不是的...java
那麼問題來了:native CSS/API並無在blur時驗證,CSS是在onkeypress, 太早,並且過於頻繁;API是在onsubmit時驗證,這個時間又太晚了,畢竟表單都填好提交時,再報輸入的錯誤node
:valid :invalid瀏覽器
這兩個css僞類觸發的時機爲onkeypress, 也就是說每一次鍵盤的輸入,都會從新評估該域的validity, 因此域是否合法並無一個明確的狀態less
input:invalid:not(:focus)ui
這種寫法就把驗證時間延遲到了輸入完成,域blur狀態,但同時,這也使得用戶輸入時沒有狀態提示 spa
<input name="name" required> <span>This field is required</span>
input:invalid + span { display: block; }
一個required域要求有輸入值,也就是說,當尚未輸入的時候,它就是invalid的,這樣,貌似有些不合理code
提議的方案:
input:user-invalid (W3C) input:user-error (WHATWG)
The Idea API
經過validity properties找出域是valid或者invalid
field.validity
native error messages are useless
下面兩種方法能夠禁止native error messge
<form novalidate> field.oninvalid = function () {return false}
HTML
<form novalidate> <label> Your name <input name=「name」 required> <span>This field is required</span> </label> </form>
CSS
label.valid {} label.valid input {} label.valid span {} label.invalid {} label.invalid input {} label.invalid span {}
Javascript
// Suppress native error messages form.addEventListener(‘invalid', function (e) { e.preventDefault() },true); // Trigger validation onblur form.addEventListener(‘blur', function (e) { var tgt = e.target; if (tgt.nodeName === 'INPUT') { validateField(tgt); } },true); form.onsubmit = validateAll; // Actual validation if (!field.validity.valid) { // set class to invalid } else if (field.validity.valid && field.value) { // set class to valid } else { // remove both classes }
參考文章:https://quirksmode.org/forms/