`
weimou66
  • 浏览: 1246976 次
文章分类
社区版块
存档分类
最新评论

HTML5表单及其验证

阅读更多

HTML表单一直都是Web的核心技术之一,有了它我们才能在Web上进行各种各样的应用。HTML5 Forms新增了许多新控件及其API,方便我们做更复杂的应用,而不用借助其它Javascript框架,先说下表单的几个基本知识点:

表单仍是以<form>元素作为容器,我们可在其中设置基本的提交特性;

当用户提交页面时,表单仍然向服务器发送表单控件的值;

之前老版本中的表单控件,如text radio checkbox等等,都可以按原有方式使用,尽管增加了新的功能;

仍然可以使用javascript操作表单控件。

下面详细说下HTML5中表单新增功能

1.输入型控件

Input type

用途

说明

email

电子邮件地址文本框

 

url

网页URL文本框

 

number

数值的输入域

属性 值 描述

max number 规定允许的最大值

min number 规定允许的最小值

step number 规定合法的数字间隔(如果 step="3",则合法的数是 -3,0,3,6 等)

value number 规定默认值

range

特定值的范围的数值,以滑动条显示

属性 值 描述

max number 规定允许的最大值

min number 规定允许的最小值

step number 规定合法的数字间隔(如果 step="3",则合法的数是 -3,0,3,6 等)

value number 规定默认值

Date pickers

日期,时间选择器

仅Opera9+支持,包含date, month, week, time, datetime, datetime-local

search

用于搜索引擎,比如在站点顶部显示的搜索框

与普通文本框用法一样,只不过这样更语文化

color

颜色选择器

仅Opera支持

将原本type为text的input控件声明为以上特殊类型,是为了给用户呈现不同的输入界面(移动平台上支持这些不同的输入界面,这里就不细说),而且表单提交时会对其值做进一步的验证。下面展示这些新表单元素,请用支持这些表单元素的浏览器查看,IE对其支持最差。

E-mail:

date:

range: number: color:

2. 表单新特性和函数

2.1 placeholder

当用户还没有输入值时,输入型控件可能通过placeholder向用户显示描述性说明文字或者提示信息,这在目前网站中很常见,一些JS框架都会提供类似功能,简单的说下在旧版本中常用的解决方案,为输入控件创建一个label,然后通过CSS控制些label的位置使之覆盖在输入控件上面,当label获得焦点时,浏览器会把焦点指向输入控件。不过有了placeholder,新的浏览器就内置了这一功能,其特性值会以浅灰色样式显示在输入框中,当输入框获得焦点并有值后,该提示信息自动消失。

如:

< p >< label for = "runnername" >Runner:</ label >
              < input id = "runnername" name = "runnername" type = "text" placeholder = "First and last name" />
           </ p >

Runner:

2.2 autocomplete

其实在IE6中,autocomplete就已经实现,不过现在这一特性终于标准化了,浏览器通过autocomplete特性能够知晓是否应该保存输入值以备将来使用,autocomplete应该用一保护用户敏感数据,避免本地浏览器对它们进行不安全的存储。

类型

作用

on

该字段无需保护,值可以被保存和恢复

off

该字段需要保护,值不可以保存

unspecified

包含<form>的默认设置,如果没有被包含在表单中或没有指定值,则行为表现为on

如:

< form action = "" method = "get" autocomplete = "on" >
Name:< input type = "text" name = "name" />< br />
E-mail: < input type = "email" name = "email" autocomplete = "off" />< br />
< input type = "submit" />
</ form >

当用户提交过一次表单后,再次访问,name的输入框会提示你曾输入的值,而email则不会提示。

2.3 autofocus

页面载入时,我们通过autofocus指定某个表单元素获得焦点,但每个页面只允许出现一个autofocus ,如果设置多个则相当于未指定些行为。目前Opera10,Chromet和Safari浏览器支持。如果用户有希望焦点转移的情况下,使用使用autofocus会惹恼用户。

2.5 list特性和datalist

通过使用list,开发人员能够为某个输入型控件构造一个选值列表,其使用方法:

Webpage: < input type = "url" list = "url_list" name = "link" />
< datalist id = "url_list" >
     < option label = "W3School" value = "http://www.w3school.com.cn " />
     < option label = "Google" value = "http://www.google.com " />
     < option label = "Microsoft" value = "http://www.microsoft.com " />
</ datalist >

Webpage:

请在Opera9+或Firefox10+浏览器中查看。

2.6 required

required 属性规定必须在提交之前填写输入域(不能为空)。它是表单验证最简单的一种方式方法,使用方法:

Name: < input type = "text" name = "usr_name" required = "required" />

2.7 pattern

pattern 属性规定用于验证 input 域的模式(pattern),模式(pattern) 是正则表达式。那些type为email或url的输入控件内置相关正则表达式,如果value不符合其正则表达式,那表单将通不过验证,无法提交。使用方法:

Country code: < input type = "text" name = "country_code"
pattern = "[A-z]{3}" title = "Three letter country code" />

2.8 novalidate

novalidate 属性规定在提交表单时不应该验证 form 或 input 域。

如:

< form action = "demo_form.asp" method = "get" novalidate = "true" >
E-mail: < input type = "email" name = "user_email" />
< input type = "submit" />
</ form >

3. 表单验证

表单验证是一套系统,它为终端用户检测无效的数据并标记这些错误,是一种用户体验的优化,让web应用更快的抛出错误,但它仍不能取代服务器端的验证,重要数据还要要依赖于服务器端的验证,因为前端验证是可以绕过的。

目前任何表单元素都有八种可能的验证约束条件:

名称

用途

用法

valueMissing

确保控件中的值已填写

将required属性设为true,

<input type= "text"required= "required"/>

typeMismatch

确保控件值与预期类型相匹配

<input type= "email"/>

patternMismatch

根据pattern的正则表达式判断输入是否为合法格式

<input type= "text" pattern= "[0-9]{12}"/>

toolong

避免输入过多字符

设置maxLength,<textarea id= "notes" name= "notes" maxLength= "100"></textarea>

rangeUnderflow

限制数值控件的最小值

设置min,<input type= "number" min= "0" value= "20"/>

rangeOverflow

限制数值控件的最大值

设置max,<input type= "number" max= "100" value= "20"/>

stepMismatch

确保输入值符合min,max,step的设置

设置max min step,<input type= "number" min= "0" max= "100" step= "10" value= "20"/>

customError

处理应用代码明确设置能计算产生错误

例如验证两次输入的密码是否一致,等会DEMO细说

下面展现浏览器自带的验证功能请在Chrome、Opera或Firefox中查看:

源代码:

< form name = "register1" id = "register1" >
           < p >< label for = "runnername" >RunnerName:</ label >
              < input id = "runnername" name = "runnername" type = "text" placeholder = "First and last name" required = "required" autofocus = "autofocus" />
           </ p >
           < p >< label for = "phone" >Tel #:</ label >
              < input id = "phone" name = "phone" type = "text" pattern = "\d{3}-\d{4}-\d{4}"
                     placeholder = "xxx-xxxx-xxxx" /></ p >
           < p >< label for = "emailaddress" >E-mail:</ label >
              < input id = "emailaddress" name = "emailaddress" type = "email"  
                     placeholder = "For confirmation only" /></ p >
           < p >< label for = "dob" >DOB:</ label >
              < input id = "dob" name = "dob" type = "date"
                     placeholder = "MM/DD/YYYY" /></ p >
           < p >Count:< input type = "number" id = "count" name = "count" min = "0" max = "100" step = "10" /></ p >
           < p >< label for = "style" >Shirt style:</ label >
                < input id = "style" name = "style" type = "text" list = "stylelist" title = "Years of participation"  
                 autocomplete = "off" /></ p >
             < datalist id = "stylelist" >
              < option value = "White" label = "1st Year" />
              < option value = "Gray" label = "2nd - 4th Year" />
              < option value = "Navy" label = "Veteran (5+ Years)" />
             </ datalist >
             
          < fieldset >
             < legend >Expectations:</ legend >
             < p >
             < label for = "confidence" >Confidence:</ label >
             < input id = "confidence" name = "level" type = "range"
                    onchange = "setConfidence(this.value)"
                    min = "0" max = "100" step = "5" value = "0" />
             < span id = "confidenceDisplay" >0%</ span ></ p >
             < p >< label for = "notes" >Notes:</ label >
                < textarea id = "notes" name = "notes" maxLength = "100" ></ textarea ></ p >
          </ fieldset >
   
          < p >< input type = "submit" name = "register" value = "Submit" onclick = " checkForm()" /></ p >
         </ form >

可是各个浏览器验证行为不一致,我们可能需要统一其验证行为,借助javascript我们可以统一浏览器的验证行为。

还是以上上述HTML为基础,我们为其加上相关javascript:

//自定义表单控件验证行为
             var checkvalue = function (e){
                 var el = e.target;
                 var isvalid = el.checkValidity();
                 if (isvalid){
                     el.className= "" ;
                     el.parentElement.getElementsByTagName( "label" )[0].className= "" ;
                 } else {
                     el.className= "error" ;
                     el.parentElement.getElementsByTagName( "label" )[0].className= "error" ;
                 }
                 e.stopPropagation();
                 e.preventDefault();
             }
             //定义表单验证方法
             function invalidHandler(evt) {
                 checkvalue(evt);
             }
             function loadDemo() {
                var myform = document.getElementById( "register1" );
                //注册表单的oninvlid事件
                myform.addEventListener( "invalid" , invalidHandler, true );
                 for ( var i=0;i< myform.elements.length-1;i++){
                     //注册表单元素的onchange事件,优化用户体验
                     myform.elements[i].addEventListener( "change" ,checkvalue, false );
                 }
             }
             //在页面初始化事件(onload)时注册的自定义事件
             window.addEventListener( "load" , loadDemo, false );

最后说下输入两次密码匹配的验证,写的很简单:

< form name = "passwordChange" >
     < p >< label for = "password1" >New Password:</ label >
     < input type = "password" id = "password1" onchange = "checkPasswords()" ></ p >
     < p >< label for = "password2" >Confirm Password:</ label >
     < input type = "password" id = "password2" onchange = "checkPasswords()" ></ p >
</ form >
< button onclick = "document.passwordChange.password1.checkValidity()" >Check Validity</ button >
function checkPasswords() {
         var pass1 = document.getElementById( "password1" );
         var pass2 = document.getElementById( "password2" );
   
         if (pass1.value != pass2.value)
             pass1.setCustomValidity( "两次输入的密码不匹配" );
         else
             pass1.setCustomValidity( "" );
     }
0
10
分享到:
评论

相关推荐

    html5表单元素及验证

    自己总结的一些html5表单元素以及表单验证,希望对大家有用!!

    HTML5表单及其8种验证方法

    HTML5表单及其8种验证方法 非常的简单实用

    ASP中JavaScript处理复杂表单的生成与验证第1/3页

    如果有一个动态生成表单及其验证脚本的程序,可以大大减少制作这些表单的工作量。 在本文的动态表单生成与验证示例中,我们使用一个Access数据库来存储有关表单的定义信息,同时为简单计,用户在表单中输入的数据也...

    jquery-form-manager:jQuery 插件框架为 HTML 表单及其输入提供全面的界面

    jQuery 表单管理器插件提供了一个综合框架,不仅可以处理标准 HTML 表单及其输入,还可以处理用户定义的输入元素。 ###Overview 一段时间以来,W3C 一直致力于提供有意义且功能上有用的表单输入控制和验证规范。 就...

    marionette-formview:Marionette.LayoutView 通过提供简单的配置允许表单数据绑定和自定义验证

    如果所有都通过,则在验证结束时调用success回调,并具有解析fields的列表及其值和 jQuery 元素 HTML : &lt; script type =" text/template " , id =" my-formview-template " &gt; &lt; form id = "my-form-id...

    php表单敏感字符过滤类

    * 表单生成验证文件 */ $_form = new formHtmlFind(); class formHtmlFind{  /**  * 输出表单函数  * $formKey 表单键  * $infoArray 更新时的原始信息数组  */    public function formHtml($...

    bootstrap_form:bootstrap_form gem的官方存储库,这是一个Rails表单生成器,可以使使用Bootstrap 4创建外观精美的表单变得非常容易

    开箱即用HTML 5客户端验证和Rails验证不能很好地协同工作。 是对挑战的讨论和一些解决方案 在必填字段上自动。 一种在字段上始终显示文本的简便方法。 如果需要的话,可以为(它们的字段左侧的标签,如传统的桌面...

    bd-form:该项目受到Angular处理表单的方式的极大启发,旨在帮助执行复杂的表单逻辑

    该库还旨在消除HTML表单API中的不一致之处。 该库不使用本地HTML验证,因此在HTML中放置required属性不会影响其工作方式。 该库具有表单组和表单控件的概念。 控件是单个输入/选择/文本区域,而组是一组控件。 要...

    Java Web应用详解.张丽(带详细书签).pdf

    6.4 HTML表单验证 6.5 FCKeditor 框架应用 第7章 JDBC数据库连接 7.1 JDBC 概述 7.2 JDBC的工作原理 7.3 数据库的安装与使用 7.4 JDBC 编程 7.5 网络留言板V1.0 第8章数据库连接池技术 8.1 数据库连接池 ...

    struts+hibernate课件

    d、表单验证解决了请求数据的验证问题,增强了系统健壮性。 e、便于团队开发 Struts缺点: a、大量的使用标签,对于初学者难度较大。 b、ActionForms使用不便、无法进行单元测试(StrutsTestCase只能用于集成) ...

    ASP.NET MVC 3高级编程

    第5章 表单和html辅助方法 89 5.1 表单的使用 89 5.1.1 action和method特性 90 5.1.2 get方法还是post方法 90 5.2 html辅助方法 94 5.2.1 自动编码 95 5.2.2 辅助方法的使用 95 5.2.3 html辅助方法的工作原理...

    struts 教程 很好很详细

    有关Struts Controller及其相关的的配置描述 13 有关struts tag lib的配置描述 14 有关Struts Action Mapping的配置描述 14 Form-bean元素 15 Action元素 15 Struts高级特性(Struts Advanced Feature) 17 验证 17 ...

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    3.1.1 HTML表单 3.1.2 动态用户界面 3.1.3 ASP.NET事件模型 3.1.4 自动回送 3.1.5 视图状态 3.1.6 XHTML兼容性 3.1.7 客户端控件ID 3.2 Web窗体处理阶段 3.2.1 页面框架初始化 3.2.2 用户代码...

    JavaScript详解(第2版)

     11.4.1 为表单及其输入类型(控件)命名   11.4.2 表单中的传统DOM   11.4.3 为表单及按钮命名   11.4.4 提交填写完成的表单   11.4.5 this关键字   11.4.6 submit()及reset()方法   11.5 输入...

    Java-PHP正则表达式的使用

     在使用RegularExpressionValidator验证控件时的验证功能及其验证表达式介绍如下:  只能输入数字:“^[0-9]*$”  只能输入n位的数字:“^d{n}$”  只能输入至少n位数字:“^d{n,}$”  只能输入m-n位的数字...

    java Struts教程

    有关Struts Controller及其相关的的配置描述 13 有关struts tag lib的配置描述 14 有关Struts Action Mapping的配置描述 14 Form-bean元素 15 Action元素 15 Struts高级特性(Struts Advanced Feature) 17 验证 17 ...

    struts 入门教程

    有关Struts Controller及其相关的的配置描述 13 有关struts tag lib的配置描述 14 有关Struts Action Mapping的配置描述 14 Form-bean元素 15 Action元素 15 Struts高级特性(Struts Advanced Feature) 17 验证 17 ...

    struts的教程.doc

    有关Struts Controller及其相关的的配置描述 13 有关struts tag lib的配置描述 14 有关Struts Action Mapping的配置描述 14 Form-bean元素 15 Action元素 15 Struts高级特性(Struts Advanced Feature) 17 ...

    ASP.NET4高级程序设计(第4版) 3/3

    3.1.1 HTML表单 59 3.1.2 动态用户界面 60 3.1.3 ASP.NET事件模型 61 3.1.4 自动回送 62 3.1.5 视图状态 63 3.1.6 XHTML兼容性 66 3.1.7 客户端控件ID 71 3.2 Web窗体处理阶段 73 3.2.1 页面框架...

Global site tag (gtag.js) - Google Analytics