html约束验证的例子,HTML5利用约束验证API来检查表单的输入数据的代码实例

HTML5对于表单有着极大程度的优化,无论是语义,小部件,还是数据格式的验证。我猜你肯定会以浏览器兼容作为借口不愿意使用这些“新功能”,但这绝不应该成为使你停滞不前的原因,况且还有像Modernizr和ployfill这样的工具库帮助你在不支持Html5的浏览器上进行回退处理。当你真正试着使用这些表单的新功能时,我保证你会爱上它。如果说唯一的缺陷,就是提示框的样式是浏览器默认的,你无法改变,好吧,如果你相信浏览器厂商的设计师的审美水平的话(我相信他们的设计水平比绝大部分普通人要好,如果不考虑风格兼容的话),抓紧学就对了!

原生验证

input type

HTML5中为数据格式验证提供了很多原生的支持,例如:

当点击提交按钮时,如果你输入的格式不符合email,则会导致无法提交,浏览器会提示你错误信息。

比如在chrome下:

26539454db2902740204641e31a527e6.png

注意:

1、仅当你提交的时候会触发浏览器的验证

2、不同浏览器提示信息的行为样式不一样

3、当有多个input不符合要求时,只会提示一个错误,一般会提示表单中相对较前的Input的

不要理所应当的认为当input的type等于tel的时候,如果你输入的不是电话号码格式,在提交时也会被浏览器的阻挡并提示错误信息,type=’tel’在PC端只起到语义的作用,在移动端可以使产生的键盘为纯数字键盘,并不能起到数据验证的作用。

pattern

你可以使用pattern属性来对浏览器不提供原生验证的数据格式设置自定义格式验证。pattern属性的值是一个正则表达式(字符串):

点击提交时,如果你输入的数据不符合pattern里面正则的格式,那么浏览器会阻止表单提交,并提示:‘请与所请求的格式保持一致’+ title里的内容(小字)。但注意,当你的文本框中内容为空的时候,浏览器不会对其进行检查,会直接提交表单(因为浏览器认为这个框框不是必填项)。如果你想要这个框框必须有内容,请加上required属性。

通过HTML原生的验证系统,基本就能满足我们对表单提交的限定。但HTML5提供了更高级的功能来方便我们开发和提升用户体验。

约束验证API

默认提示信息

像‘请与所请求的格式保持一致’这样的浏览器提示信息字串藏在input DOM对象的validationMessage属性里,这个属性在大多数现代的浏览器中是只读的,即不可修改,比如下面的代码:

当提交时,如果Input内容为空,那么浏览器会提示‘请填写此字段’,我们可以在控制台把这句话打印出来:var input = document.getElementById('input')

input.validationMessage // =>'请填写此字段'

如果想修改其中的内容,可以调用setCustomValidity接口改变validationMessage的值input.setCustomValidity('这个字段必须填上哦');

// 下面这种做法适用于不支持setCustomValidity的浏览器,基本现代浏览器都不支持这样做

input.validationMessage = '这个字段必须填上哦'

注意,像required这样的HTML原生验证,虽然能改变其中信息,但无法把信息置为空字串,原因下面会讲到。

原理

HTML表单验证系统通过validationMessage属性检测该文本框的数据是否通过验证,如果其值为空字串,则表示通过了验证,否则,表示未通过,浏览器会把其值作为错误信息提示给用户。所以在原生验证时,用户无法把validationMessage的值设置为空字符串。

约束验证API的简单实例

约束验证API是在原生方法之上更灵活的表达方式,你可以自己设置数据是否通过,而不借助于正则表达式。原理很简单,通过if判断,如果数据格式使你满意,那么你就调用setCustomValidity使validationMessage的值为空,否则,你就调用setCustomValidity传入错误信息:input.addEventListener('input', function () {

if(this.value.length > 3){ // 判断条件完全自定义

input.setCustomValidity('格式不正确');

}else {

input.setCustomValidity('')

}

});

每次键盘输入,代码都会判断格式是否正确,然后调用setCustomValidity设置validationMessage的值。不要妄想每按下键浏览器都会提示你结果是否正确,浏览器只有在点击提交按钮的时候才会提示validationMessage里的值(如果有的话)。

如果你还没有走思的话,一定会问,既然这样,为什么要为input绑定键盘事件,每输入一下都要进行判断呢?直接为表单绑定提交事件,在提交时再判断多好,别急,这么做是有好处的。

随着输入判断格式与样式

作为用户,我们当然想在得知我输入了错误的格式之后,文本框变红(或者有别的提示)。而在我每次输入一个字符,如果对了,文本框就恢复正常。我们可以使用CSS伪类来实现这个功能:input:required {

background-color: #FFE14D;

}

/*这个伪类通过validationMessage属性进行判断*/

input:invalid {

border: 2px solid red;

}

上面的required伪类会给所以必填但值空的input提供一个黄色的背景色,而下面的invalid伪类则会为所有未通过验证的input添加一个2px的红边边。我们现在给我们的Input框加上input类即可。

这些伪类的判断条件正与浏览器判断你能否提交表单的条件一样,看validationMessage里的值,所以,我们上面设置每次键盘输入事件都会触发一次判断从而改变CSS伪类样式的渲染,用意正在于此。

更好的用户体验

还有一个缺点,就是当一个input设置为required的时候,在初始化时,因为其本身是空的,所以invalid伪类会对它起作用,这不是我们想看到的,因为我们什么还都没有干。

我们可以并在这些伪类前加上父选择器.invalid,这样,只有在父元素具有invalid类时,这些伪类才会起作用。可以设置一个submit事件,在表单提交因验证失败后,会触发input的invalid事件,给form添加invalid类:

form.addEventListener('invalid', function() {this.className = 'invalid'}, true)因为invaild是Input的事件,而不是form的事件,所以这里我们设置第三个参数为true采用事件捕获的方式处理之。这样,就大功告成了。

最终实例

好了,现在是时候总结一下我们所学的知识并创造最佳实践了:

form

input:required{

background-color: #DCD4CE;

}

.invalid input:invalid{

border: 2px solid red;

}

email:

IDCard:

var email = document.getElementById('email');

var IDCard = document.getElementById('IDCard');

var form = document.getElementById('form');

IDCard.addEventListener('input', function () {

if(this.value.length != 6) {

this.setCustomValidity('IDCard的长度必须为6')

}else{

this.setCustomValidity('')

}

});

form.addEventListener('invalid', function () {

this.className = 'invalid';

}, true)

运行后截图如下:

b00f20fde0080428f5830f7eb0d155b5.png

以上就是HTML5利用约束验证API来检查表单的输入数据的代码实例 的内容,更多相关内容请关注PHP中文网(www.php.cn)!

声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338571.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言经典题(1)

输入某年某月某日,判断这一天是这一年的第几天?程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天#include int mai…

jpg图片使用pil的resize后_如何使用PIL调整图像大小并保持其纵横比?

是否有一种显而易见的方法可以解决这个问题? 我只是想制作缩略图。#1楼PIL已经可以选择裁剪图像img ImageOps.fit(img, size, Image.ANTIALIAS)#2楼我丑陋的例子。函数获取文件如:“pic [0-9a-z]。[extension]”,将它们调整为120x120&#x…

openshift_OpenShift上的Java EE工作流(技术提示#64)

openshift该网络研讨会展示了如何使用WildFly , JBoss Tools , Forge , Arquillian和OpenShift在OpenShift上创建Java EE工作流。 具体来说,它谈论: 如何使用JBoss Developer Studio轻松开发Java EE应用程序并将其直接…

C语言面试-指针和引用的使用场景?

先解决两个疑问◆ 指针和引用的不同之处是什么?◆ 何时用用指针?何时用引用?指针和引用的不同之处看如下代码:指针是用来表示内存地址的,而指针这个整数正是被指向的变量地址。而引用就是给变量重新起了一个名字&#…

排序算法html,排序算法总结.html

排序算法总结 | borens blog排序算法总结borens blog首页所有文章关于作者排序算法总结Apr 6, 2018| 技术人生| 阅读排序,顾名思义,将数据按照某种规则排列起来.这种规则可以是根据基本的数值大小排序,也可以是通过字符串长度比较来排序,又或者是优先根据两个字符串的第一个不…

win10商店下载位置_win10应用商店下载的东西在哪

win10应用商店下载的东西在哪?我们都知道,微软从win8开始,就推出了应用商店,到现在的win10,还是一样。现在的win10应用商店里的东西也越来越丰富了。但是有些win10新用户朋友们在win10应用商店下载了东西,准…

异步http 超时_具有CompletableFuture的异步超时

异步http 超时有一天&#xff0c;我重写了执行不佳的多线程代码&#xff0c;该代码在Future.get()某个时刻被阻塞&#xff1a; public void serve() throws InterruptedException, ExecutionException, TimeoutException {final Future<Response> responseFuture async…

C语言指针变量与一维数组

数组元素之间的地址是相连的&#xff1b;变量地址绝对不是相连的&#xff0c;如果找到规律那也只是一个偶然的&#xff0c;不是必然的&#xff1b;1. 指针变量和一位数组下面对指针数组进行分析&#xff0c;index(小标是从0开始)&#xff0c;array数组是int类型&#xff0c;每一…

天干地支计算公式_高大上:天干地支计算方法

天干地支是我国古代计算年月日的重要依据&#xff0c;作为现代人的我们&#xff0c;有必要去了解一下&#xff0c;他们&#xff0c;以备不时之需。首先介绍一下&#xff0c;天干和地支。共有十天干和十二地支。十天干&#xff1a;甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊(…

input发送a.jax_JAX-RS 2.0:服务器端处理管道

input发送a.jax这篇文章的灵感来自JAX-RS 2.0规范文档 &#xff08;附录C&#xff09;中的Processing Pipeline部分。 我喜欢它的原因在于它提供了JAX-RS中所有模块的漂亮快照-以准备好吞咽的胶囊形式&#xff01; 礼貌– JAX-RS 2.0规范文档 因此&#xff0c;我想到了使用此…

html 登录失败,qq音乐登录失败 QQ音乐总是显示登录失败是怎么回事

urlproc.exe是什么进程?没见过&#xff0c;请前辈们指点&#xff1f;造成QQ音乐登录不上现象的原因有如下三种可能&#xff1a; 一、木马病毒对QQ音乐的必要组件或文件进行破坏&#xff0c;导致QQ音乐登录失败&#xff0c;登陆不上的情况发生。 二、Windows系统防火墙(或其他安…

C 常对象成员

C 常对象成员在C 中&#xff0c;可以将对象的成员声明为const&#xff0c;包括常数据成员和常成员函数C 常数据成员 常数据成员的作用与一般常变量相似&#xff0c;用关键字const来声明常数据成员。常数据成员的值是不能改变的&#xff0c;只能通过构造函数的参数初始化表对常数…

python gitlab_Python Gitlab Api 使用方法

简述公司使用gitlab 来托管代码,日常代码merge request 以及其他管理是交给测试&#xff0c;鉴于操作需经常打开网页,重复且繁琐,所以交给Python 管理。安装pip install python-gitlab环境: py3DEMO# -*- coding: utf-8 -*-__Author__ "xiewm"__Date__ 2017/12/26 …

tomee_Apache TomEE + JMS。 从未如此简单。

tomee我记得J2EE &#xff08;1.3和1.4&#xff09;的过去&#xff0c;使用JMS启动项目非常困难。 您需要安装JMS 代理 &#xff0c;创建主题或队列 &#xff0c;最后使用服务器配置文件和JNDI开始自己的战斗。 感谢JavaEE 6及其它&#xff0c;使用JMS确实非常简单。 但是&…

娄底二中高考2021成绩查询,2021年娄底高考状元名单公布,娄底高考状元学校资料及最高分...

2019年高考已经落下帷幕&#xff0c;高考放榜时刻就要到来&#xff0c;每年的高考状元都会被各界高度关注&#xff0c;那么今年娄底高考状元花落谁家呢&#xff1f;娄底高考状元会给人带来惊喜吗&#xff0c;让我们一起期待2019年娄底高考状元的诞生。下面小编为给为梳理下历年…

C 常指针

C 指向对象的常指针C 定义指向对象的常指针的一般形式为 类名 * const指针变量名&#xff1b;也可以在定义指针变量时使之初始化在C 中&#xff0c;虽然指向对象的常指针变量的值不能改变&#xff0c;但可以改变其所指向对象的值&#xff0c;如果想将一个指针变量固定地与一个对…

microsoftexchange邮箱容量怎样看_企业邮箱申请注册的要求有哪些?_网站建设_创客网络...

随着现在互联网信息化发展的速度不断加快&#xff0c;企业邮箱作为企业之间信息传输的重要工具&#xff0c;其重要性不亚于企业网站&#xff0c;但市场上企业邮箱种类繁多&#xff0c;包含的功能也各不相同&#xff0c;稍有差异&#xff0c;你知道怎么去选择好企业邮箱吗&#…

java 登陆验证失败_使用Java 8流进行快速失败的验证

java 登陆验证失败我已经失去了看过使用快速失败验证代码状态的代码的次数&#xff0c;方法如下&#xff1a; public class PersonValidator {public boolean validate(Person person) {boolean valid person ! null;if (valid) valid person.givenName ! null;if (valid) v…

Unity中Shader观察空间推导(在Shader中实现)

文章目录 前言一、观察空间矩阵推导1、求观察空间基向量2、求观察空间的基向量在世界空间中的矩阵 的 逆矩阵2、求平移变换矩阵3、相乘得出 观察空间转化矩阵4、得到顶点的世界空间坐标&#xff0c;然后转化到观察空间5、把观察空间坐标转化为齐次裁剪坐标输出到屏幕 二、最终效…

计算机应用技术一级考试成绩,《计算机应用基础》课程与等级考试成绩的关系...

《闽南师范大学关于计算机应用基础课程成绩的暂行规定》(闽南师大〔2016〕197号)已于2016年7月12日下发&#xff0c;但在执行过程总有包括教务员及学生在内各种人员的种种疑问及错误理解与传达&#xff0c;现在梳理如下&#xff1a;一、开设有《计算机应用基础》课程的学生&…