37

checkValidity等form原生JS验证方法和属性详细介绍

 4 years ago
source link: https://www.tuicool.com/articles/BBnERna
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

byzhangxinxu from https://www.zhangxinxu.com/wordpress/?p=8895

本文欢迎分享与聚合,全文转载就不必了,尊重版权,圈子就这么大,若急用可以联系授权。

background-thumb.png

一、先从form内置验证的外部表现说起

说起form内置验证,很多人想到的是设置 required 这样的HTML属性,然后表单提交的时候出现这样的提示效果:

2019-08-18_193750.png

实际上,这只是表象,只是form表单原生验证的一小部分。form内置验证的精髓其实不止这点表面的东西。

例如CSS侧有诸多匹配的伪类,如 :required 伪类, :optional 伪类或是 :valid:invalid 伪类等。

又例如JS DOM事件这块表单元素可以监听 'invalid''valid' 事件。

又例如JS DOM API这一块则有诸多内置的验证方法和属性,这就是本文要介绍的知识点。

二、form表单元素内置验证方法和属性

开门见山不打弯,共3个方法和1个属性。

3个方法分别是 checkValidity() , reportValidity() , setCustomValidity() 方法,1个属性是 validity 属性。

具体如下:

checkValidity()方法

checkValidity() 方法可以用来验证当前表单控件元素,或者整个表单是否验证通过,返回值是布尔值, true 或者 false

例如,某下拉框元素是否验证通过:

var isSelectPassing = document.querySelector('select').checkValidity();    // true或false

2019-08-18_195012.png

或者整个表单元素是否验证通过:

var isFormPassing = document.forms[0].checkValidity();    // true或false

2019-08-18_195215.png

reportValidity()方法

reportValidity() 方法可以触发浏览器的内置的验证提示交互,返回布尔值, true 或者 false 。例如:

document.querySelector('select').reportValidity()

会触发下拉框的错误提示,如下图所示:

2019-08-18_201410.png

另外, reportValidity() 方法IE浏览器并不支持,Edge 17+开始支持。

setCustomValidity()方法

顾名思义就是设置自定义的验证,我们可以使用这个方法自定义提示文字。

语法如下:

ele.setCustomValidity(str);

其中, str 为字符串,表示出错提示的文字信息,如果是空字符串,则表示不使用自定义的错误提示。

例如上面的 reportValidity() 方法的下拉出错提示是“请在列表中选择一项”。

如果我们希望改成“请选择城市”,则可以下面这样:

var eleSelect = document.querySelector('select');
if (eleSelect.validity.valueMissing == true) {
    eleSelect.setCustomValidity('请选择城市');
}
eleSelect.reportValidity();

此时,提示效果就是:

2019-08-18_204144.png

validity属性与ValidityState对象

每一个标准的表单控件,例如输入框,下拉框以及单复选框都内置一个 validity 属性,这是个只读属性,可以返回当前元素各种验证状态,例如:

console.dir(document.querySelector('select').validity);

在Chrome浏览器下返回的结果是一个ValidityState对象,包含的属性和属性值如下:

badInput: false
customError: false
patternMismatch: false
rangeOverflow: false
rangeUnderflow: false
stepMismatch: false
tooLong: false
tooShort: false
typeMismatch: false
valid: false
valueMissing: true

控制台输出截图如下:

2019-08-18_200146.png

其中

badInput 只读。属性值为布尔类型。输入框里面的值浏览器没办法进行转换。例如 'number' 类型输入框里面是中文字符(MDN上说法,但是自己测试无法复现),此时值是 true 。此属性IE浏览器并不支持。此属性建议了解即可。 customError 只读。属性值为布尔类型。如果元素调用 setCustomValidity() 方法设置了自定义的验证信息则值是 truepatternMismatch 只读。属性值为布尔类型。和指定的 pattern 正则属性值不匹配的时候值是 true 。会匹配 :invalid 这个CSS伪类。 rangeOverflow 只读。属性值为布尔类型。超过 max 属性设置的值的时候会是 true 。同时会匹配CSS :invalid:out-of-range 伪类。 rangeUnderflow 只读。属性值为布尔类型。小于 min 属性设置的值的时候会是 true 。同时会匹配CSS :invalid:out-of-range 伪类。 stepMismatch 只读。属性值为布尔类型。输入框当前值和 step 属性值不匹配的时候 stepMismatch 的值会是 true 。同时元素会匹配CSS :invalid:out-of-range 伪类。 tooLong 只读。属性值为布尔类型。输入内容长度超出 maxlength 的限制时候会是 true 。同时会匹配CSS :invalid:out-of-range 伪类。 tooShort 只读。属性值为布尔类型。输入内容长度不足 minlength 的限制时候会是 true 。同时会匹配CSS :invalid:out-of-range 伪类。此属性IE浏览器并不支持,因为不支持 minlength 属性。 typeMismatch 只读。属性值为布尔类型。输入框的值和输入框类型不匹配的时候该属性值会是 true 。例如输入框type类型是email或者url时候。如果值是 true ,会匹配 :invalid 这个CSS伪类。 valid 只读。属性值为布尔类型。当前元素是否完全验证通过,通过是 true ,会匹配 :valid 这个CSS伪类;不通过是 false ,会匹配 :invalid 这个CSS伪类。 valueMissing 只读。属性值为布尔类型。如果元素设置了 required 属性,同时输入框的值为空,则该属性值是 true 。如果值是 true ,会匹配 :invalid 这个CSS伪类。

三、IE9浏览器的polyfill

以上所有原生的表单验证方法和属性IE9浏览器都不支持,IE10+浏览器都支持。

2019-08-18_223358.png

如果想要IE9浏览器也支持,需要写个polyfill,我大概搜索了下, checkValidity() 等几个方法并没有合适的polyfill,已有的一些项目为了兼容IE8,更像是shim,没有专门为IE9打造了polyfill。

倒是validity属性找到个看上去有些靠谱的polyfill。您可以狠狠地点击这里(可以右键→另存为):validity-polyfill.js。这个polyfill出自 这里 ,不过我并没有仔细验证过其正确性。

之后我会自己针对IE9浏览器吧 checkValidity() 等几个方法给补上。

四、写着写着就成了文档

本文下笔之处还以为会发现一些好玩的东西,例如自定义表单验证逻辑,后来发现自己想多了, setCustomValidity() 方法并没有自己预想的那么强大,就是个改变提示文字信息的方法。

整理来整理去,最后就成了一个比较详尽的关于表单原生验证的文档了。

之后写验证组件,我会借助这些原生的已经内置好的验证方法来实现,可以省去不少功夫,会很有意思。

日后的精彩演绎源自平时平淡的积累。

对于大部分的人,对于本文这些API是无感的,想不到如何在实际项目中应用,觉得很鸡肋,实际上大有可为的,我已经想要跃跃欲试了,嘿嘿。

1f913.svg

本文为原创文章,欢迎分享,勿全文转载,如果内容你实在喜欢,可以加入收藏夹,永不过期,而且还会及时更新知识点以及修正错误,阅读体验也更好。

本文地址: https://www.zhangxinxu.com/wordpress/?p=8895

(本篇完)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK