文档章节

HTML5实战应用:如何让表单验证更友好

lotozhou
 lotozhou
发布于 2015/11/27 15:01
字数 569
阅读 251
收藏 7

        HTML5表单验证给前端人员带来了便利,但是在用户体验上存在一些缺陷,默认的提示对用户很不友好,无法准确的获取想要的信息。好在在接口设计的时候提供了setCustomValidilty方法可以自定义提示信息。这是一个好消息,但也存在一些弊端,需要让开人员做额外的一些处理才达到真正想要的目的。
接下来通过以下示例来阐述方法的应用。

未调用setCustomValidity()方法

<!DOCTYPE html>  

 <html>  

 <head>  

     <mata charset="utf-8">  

     <title>form test</title>  

 </head>  

 <body>  

     <form name="test" action="." method="post">  

         <input type="text" required pattern="^\d{4}[        DISCUZ_CODE_21        ]quot; placeholder="请输入代码" >  

         <button type="submit">Check</button>  

     </form>  

 </body>  

 </html> 

执行结果:
A:未输入数据

1336530769_261.jpg

B:不匹配

1336530790_161.jpg

这两个结果都匹配了。但是不匹配这里的提示方案案与预想的不符合。

通过调用setCustomValidity方法来优化提示文案

<!DOCTYPE html>  

 <html>  

 <head>  

     <mata charset="utf-8">  

     <title>form test</title>  

 </head>  

 <body>  

     <form name="test" action="." method="post">  

         <input type="text" required pattern="^\d{4}[        DISCUZ_CODE_22        ]quot; placeholder="请输入代码" >  

         <button type="submit">Check</button>  

     </form>  

 <script type="text/javascript">  

     document.querySelector("input").setCustomValidity("请输入4位数字的代码");  

 </script>  

 </body>  

</html> 

执行结果:
A:为空

1336531076_33.jpg

B:不合法

1336531092_68.jpg

C:合法

1336531105_8.jpg

从三个操作来看,调用了setCustomValidity方法后,原生的表单验证罗辑都返回false了。悲剧。
再看看接口属性的变化

调用之前:
A)

1336531622_37.jpg

B)

1336531668_55.jpg

C)

1336531785_56.jpg

调用之后:
A)

1336531871_90.jpg

B)

1336531922_37.jpg

C)

1336531977_93.jpg

从上面的截图可以看到validationMessage没清空,valueMissing和patternMismatch都已经验证通了。

总结一下:
从面上可以看出,验证通过与否除了跟validity接口下的属性相关外,还跟validationMessage是否有值有关系。只有当validity接口下的属性(customError除外)都为false并且validationMessage为空时才算验证通过。

优化后的代码:

<!DOCTYPE html>  

 <html>  

 <head>  

     <mata charset="utf-8">  

     <title>form test</title>  

 </head>      

 <body>  

     <form name="test" action="." method="post">  

         <input type="text" required pattern="^\d{4}[        DISCUZ_CODE_23        ]quot; oninput="out(this)" placeholder="请输入代码" >  

         <button type="submit">Check</button>  

     </form>  

 <script type="text/javascript">  

 function out(i){  

     var v = i.validity;  

     if(true === v.valueMessing){  

         i.setCustomValidity("请填写些字段");  

     }else{  

         if(true === v.patternMismatch){  


             i.setCustomValidity("请输入4位数字的代码");  

         }else{  

             i.setCustomValidity("");  

         }  

     }  

 }  

 </script>  

 </body>  

 </html> 







© 著作权归作者所有

共有 人打赏支持
lotozhou
粉丝 8
博文 51
码字总数 51524
作品 0
苏州
程序员
加载中

评论(1)

命运交响
命运交响
不错,值得收藏!

暂无文章

Bash各类扩展详解

Bash各类扩展详解 Bash中主要包括大括号扩展、波浪号扩展、变量扩展、子命令扩展、文件名扩展和算数扩展。这些扩展组合在一起为Bash带来了极大的易用性。掌握这些扩展的用法和功能,能够为B...

小陶小陶
43分钟前
1
0
EventBus原理深度解析

一、问题描述 在工作中,经常会遇见使用异步的方式来发送事件,或者触发另外一个动作:经常用到的框架是MQ(分布式方式通知)。如果是同一个jvm里面通知的话,就可以使用EventBus。由于Event...

yangjianzhou
今天
5
0
OpenCV图像处理实例:libuv+cvui显示摄像头视频

#include <iostream>#include <opencv2/opencv.hpp>#define CVUI_IMPLEMENTATION#include <cvui.h>extern "C"{#include <uv.h>}using namespace std;#define WINDOW_NAM......

IOTService
今天
3
0
openJDK之JDK9的String

1.openJDK8的String 先来看下openJDK8的String的底层,如下图1.1所示: 图1.1 底层上使用的是char[],即char数组 每个char占16个bit,Character.SIZE的值是16。 2.openJDK9中的String 图2.1...

克虏伯
今天
3
0
UEFI 模式下如何安装 Ubuntu 16.04

作者:知乎用户 链接:https://www.zhihu.com/question/52092661/answer/259583475 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 针对UEFI模式下安装U...

寻知者
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部