码云笔记前端博客
Home > 前端技术 > checkValidity等form原生JS验证方法和属性详细介绍

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

2019-08-20 分类:前端技术 作者:码云 阅读(149)

本文共计3316个字,预计阅读时长需要9分钟。

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

说起form内置验证,很多人想到的是设置required这样的HTML属性,然后表单提交的时候出现这样的提示效果:
checkValidity等form原生JS验证方法和属性详细介绍
实际上,这只是表象,只是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。

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

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

checkValidity()方法
或者整个表单元素是否验证通过:

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

checkValidity()方法

reportValidity()方法

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

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

会触发下拉框的错误提示,如下图所示:
会触发下拉框的错误提示
另外,reportValidity()方法IE浏览器并不支持,Edge 17+开始支持。

setCustomValidity()方法

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

语法如下:

1
ele.setCustomValidity(str);

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

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

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

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

此时,提示效果就是:
checkValidity等form原生JS验证方法和属性详细介绍

validity属性与ValidityState对象

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

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

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

1
2
3
4
5
6
7
8
9
10
11
badInput: false
customError: false
patternMismatch: false
rangeOverflow: false
rangeUnderflow: false
stepMismatch: false
tooLong: false
tooShort: false
typeMismatch: false
valid: false
valueMissing: true

控制台输出截图如下:
checkValidity等form原生JS验证方法和属性详细介绍
其中,

badInput

只读。属性值为布尔类型。输入框里面的值浏览器没办法进行转换。例如'number'类型输入框里面是中文字符(MDN上说法,但是自己测试无法复现),此时值是true。此属性IE浏览器并不支持。此属性建议了解即可。

customError

只读。属性值为布尔类型。如果元素调用setCustomValidity()方法设置了自定义的验证信息则值是true。

patternMismatch

只读。属性值为布尔类型。和指定的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浏览器的polyfill
如果想要IE9浏览器也支持,需要写个polyfill,我大概搜索了下,checkValidity()等几个方法并没有合适的polyfill,已有的一些项目为了兼容IE8,更像是shim,没有专门为IE9打造了polyfill。

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

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

结束语

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

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

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

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

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

文章来源:https://www.zhangxinxu.com/wordpress/2019/08/js-checkvalidity-setcustomvalidity/

「除特别注明外,本站所有文章均为码云笔记原创,转载请保留出处!」

赞(8) 打赏

觉得文章有用就打赏一下文章作者

支付宝
微信
8

觉得文章有用就打赏一下文章作者

支付宝
微信

上一篇:

下一篇:

你可能感兴趣

共有 0 条评论 - checkValidity等form原生JS验证方法和属性详细介绍

博客简介

码云笔记网 mybj123.com,一个专注Web前端开发技术的博客,主要记录和总结博主在前端开发工作中常用的实战技能及前端资源分享,分享各种科普知识和实用优秀的代码,以及分享些热门的互联网资讯和福利!码云笔记网有你更精彩!
更多博客详情请看关于博客

精彩评论