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/