HTML5表单
一、HTML原有的表单
<form.../>元素用于生成输入表单,该元素不会生成可视化部分。
<form.../>除了基本属性外还可以定义如下属性:
- action:当点击“确定”按钮的时候,
- 表单被提交的地址;
- method:提交方式,属性值为POST或GET;
- enctype:指定对表单内容进行编码所使用的字符集;
- name:指定表单的唯一名称,建议该属性值与id属性值保持一致;
- target:指定使用哪种方式打开目标URL,与超链接的target可接受的属性值一致,该属性值可以为_blank、_parent、_self和_top四个值中之一。
<input.../>元素是表单控件中功能最丰富的,如下几种输入元素都是通过<input.../>元素生成的。
- 单行文本框:type="text";
- 密码输入框:type="password";
- 隐藏域:type="hidden";
- 单选框:type="radio";
- 复选框:type="checkbox";
- 图像域:type="image";
- 文件上传域:type="file";
- 提交、重设、无动作按钮:type="submit"; type="reset"; type="button";
下面代码使用了<input.../>元素定义了表单控件:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" /> 5 <meta http-equiv="Content-Type" content="text/html; charset=GBK" /> 6 <title> 表单 </title> 7 </head> 8 <body> 9 <form action="http://www.crazyit.org" method="get"> 10 单行文本框:<input id="username" name="username" type="text" /><br /> 11 不能编辑的文本框:<input id="username2" name="username" type="text" 12 readonly="readonly" /><br /> 13 密码框:<input id="password" name="password" type="password" /><br /> 14 隐藏域:<input id="hidden" name="hidden" type="hidden" /><br /> 15 第一组单选框:<br /> 16 <input id="color" name="color" type="radio" value="red"/> 17 <input id="color2" name="color" type="radio" value="green" /> 18 <input id="color3" name="color" type="radio" value="blue"/><br /> 19 第二组单选框:<br /> 20 <input id="gender" name="gender" type="radio" value="male"/> 21 <input id="gender2" name="gender" type="radio" value="female" /><br /> 22 两个复选框:<br /> 23 <input id="website" name="website" type="checkbox" 24 value="leegang.org" /> 25 <input id="website2" name="website" type="checkbox" 26 value="crazyit.org" /><br /> 27 文件上传域:<input id="file" name="file" type="file"/><br /> 28 图像域:<input type="image" src="images/wjc.gif" alt="疯狂Java联盟"/><br /> 29 下面是四个按钮:<br /> 30 <input id="ok" name="ok" type="submit" value="提交" /> 31 <input id="dis" name="dis" type="submit" value="提交" 32 disabled="disabled" /> 33 <input id="cancel" name="cancel" type="reset" value="重填"/> 34 <input id="no" name="no" type="button" value="无动作" /> 35 </form> 36 </body> 37 </html>
<label.../>标签的for属性:
让标签和表单关联有两种方式:
- 隐式使用for属性:指定<label.../>元素的for属性值为所关联表单控件的id属性值。
- 显式关联:将普通文本、表单控件一起放在<label.../>元素内部即可。
下面的表单代码分别使用了两种方式将标签和表单控件关联在一起。
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" /> 5 <meta http-equiv="Content-Type" content="text/html; charset=GBK" /> 6 <title> label元素 </title> 7 </head> 8 <body> 9 <form action="http://www.crazyit.org" method="get"> 10 <label for="username">单行文本框:</label> 11 <input id="username" name="username" type="text" /><br /> 12 <label>密码框:<input id="password" name="password" type="password" /> 13 </label><br /> 14 <input id='ok' type="submit" value="登录疯狂Java联盟" /> 15 </form> 16 </body> 17 </html>
注:尽量少用显式的关联方式,这种方式在IE浏览器没有很好地支持。
<textarea.../>定义的文本域
属性值:
- clos:指定文本域的宽度
- rows:指定文本域的高度
- disabled:指定禁用该文本域
- readonly:指定该文本域只读,该属性值也只能是readonly
下面页面代码定义了两个多行文本域:
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" />
5 <meta http-equiv="Content-Type" content="text/html; charset=GBK" />
6 <title> 多行文本域 </title>
7 </head>
8 <body>
9 <form action="http://www.crazyit.org" method="post">
10 简单多行文本域:<br />
11 <textarea cols="20" rows="2"></textarea><br />
12 只读的多行文本域:<br />
13 <textarea cols="28" rows="4" readonly="readonly">
14 你好,这个文本域设置了readonly属性,内容不能修改!
15 </textarea><br />
16 <button type="submit"><b>提交</b></button><br />
17 </form>
18 </body>
19 </html>
二、HTMl5新增的元素和属性
- form属性
在HTML5之前,所有表单必须放在<form.../>表单之内,表明该表单控件属于该表单;但是HTML5之后为表单控件增加了form属性,用于定义该表单控件所属的表单,该属性的值应该是他所属表单的id。
下面代码示范了form属性的用法:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" /> 5 <meta http-equiv="Content-Type" content="text/html; charset=GBK" /> 6 <title> form属性 </title> 7 </head> 8 <body> 9 <form id="addForm" action="add"> 10 物品名:<input type="text" name="name"/> 11 <input type="submit" value="添加"/> 12 </form> 13 物品描述:<textarea name="desc" form="addForm"></textarea> 14 </body> 15 </html>
- formaction属性
如果一个页面中的表单包含了两个及以上的提交按钮,但程序需要提交到不同的action,如果在以前需要通过javascript代码来实现,在HTML5中,formaction即可实现该功能
例如如下页面:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" /> 5 <meta http-equiv="Content-Type" content="text/html; charset=GBK" /> 6 <title> formaction属性 </title> 7 </head> 8 <body> 9 <form method="post"> 10 用户名:<input type="text" name="name"/><br/> 11 密码:<input type="password" name="name"/><br/> 12 <input type="submit" value="注册" formaction="regist"/> 13 <input type="submit" value="修改" formaction="login"/> 14 </form> 15 </body> 16 </html>
上面代码两个按钮的formaction属性不同,因此单击第一个按钮将会提交到regist,单击第二个按钮将会提交到login。
- autofocus属性,当浏览器打开该页面的时候,组件会自动获取焦点
- placeholder属性,用于设置单行文本框、多行文本域的提示信息,在Html5之前,需要用到javascript才能实现
- list属性:
list属性的值应该是一个<detailst.../>组件的id。也就是说,list属性值必须与<detailst.../>元素结合使用。
下面代码示范了list属性与<detalist.../>元素的用法。
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" /> 5 <meta http-equiv="Content-Type" content="text/html; charset=GBK" /> 6 <title> list属性 </title> 7 </head> 8 <body> 9 <form method="post" action="buy"> 10 请输入图书:<input type="text" name="name" list="books"/><br/> 11 <input type="submit" value="购买"/> 12 </form> 13 <datalist id="books"> 14 <option value="java">疯狂Java讲义</option> 15 <option value="ee">轻量级Java EE企业应用实战</option> 16 <option value="android">疯狂Android讲义</option> 17 </datalist> 18 </body> 19 </html>
功能丰富的input属性
HTML5为<input...>元素的type属性新增了如下几种类型。
- color:生成一个颜色选择器
- date:生成一个日期选择器
- time:生成一个时间选择器
- datetime:生成一个UTC日期时间选择器
- datetime-local:生成一个本地日期时间选择器
- week:生成一个用户选择第几周的文本框
- month:生成一个月份选择器
- email:生成一个E-mail输入框
- tel:生成一个只能输入电话号码的输入框
- url:生成一个URL输入框
- number:生成一个只能输入数字的文本框
- range:生成一个拖动条
- search:生成一个专门用于输入搜索关键字的文本框,这种文本框与type="text";的文本框没有太大区别!
下面代码示范了HTML5新增的各种<input.../>元素的用法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" /> 5 <meta http-equiv="Content-Type" content="text/html; charset=GBK" /> 6 <title> 功能丰富的input元素 </title> 7 </head> 8 <body> 9 <form action="do"> 10 type="color"的文本框:<br/><input name="color" type="color"/><p> 11 type="date"的文本框:<br/><input name="date" type="date"/><p> 12 type="time"的文本框:<br/><input name="time" type="time"/><p> 13 type="datetime"的文本框:<br/><input name="datetime" type="datetime"/><p> 14 type="datetime-local"的文本框:<br/><input name="datetime-local" type="datetime-local"/><p> 15 type="month"的文本框:<br/><input name="month" type="month"/><p> 16 type="time"的文本框:<br/><input name="time" type="time"/><p> 17 type="week"的文本框:<br/><input name="week" type="week"/><p> 18 type="email"的文本框:<br/><input name="email" type="email" multiple/><p> 19 type="tel"的文本框:<br/><input name="tel" type="tel"/><p> 20 type="url"的文本框:<br/><input name="url" type="url"/><p> 21 type="number"的文本框:<br/><input name="number" type="number"/><p> 22 type="range"的文本框:<br/><input name="range" type="range" min="0" max="100" step="5"/><p> 23 type="search"的文本框:<br/><input name="search" type="search"/><p> 24 <input value="提交" type="submit"/> 25 </form> 26 </body> 27 </html>
三、HTML5增强的文件上传域
在HTML5之前,文件上传有局限性,如下:
- 每次用户只能上传一个文件;
- 客户端代码只能获取被上传文件的文件路径,无法访问实际的文件内容。
HTML5规范改变了这个现状,HTML5允许同时选择多个文件进行上传,而且HTML5允许客户端JavaScript访问实际的文件内容。
1、FileList对象与File对象
HTML5为type="file"的<input.../>元素增加了如下两个属性。
- accept:该属性控制允许上传的文件类型。该属性值为一个或多个MIME类型字符串。多个MIME类型字符串之间应以逗号分隔。
- multiple:该属性设置是否允许选择多个文件。
JavaScript可以通过files属性访问type="file"的<input.../>元素生成的文件上传域内的所有文件,该属性返回一个FileList对象,FileList对象相当于一个数组,开发者可以使用类似于数组的方法来访问数组内的每一个对象。
File对象是一个JavaScript对象,JavaScript可以通过该对象获取用户浏览所有文件的信息。File对象包含如下常用属性:
- name:返回该File对象对应的文件的文件名,不包括文件路径部分。
- type:返回该File对象对应的文件的MIME类型字符串。
- size:返回该File对象对应的文件的大小。
下面代码示范了如何通过FileList、File对象来访问文件上传域内选择多个文件。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" /> 5 <meta http-equiv="Content-Type" content="text/html; charset=GBK" /> 6 <title> 文件上传域 </title> 7 </head> 8 <body> 9 浏览图片:<input id="images" type="file" multiple 10 accept="image/*"/> 11 <input type="button" value="显示文件" onclick="showDetails();"/> 12 <script type="text/javascript"> 13 var showDetails = function() 14 { 15 var imageEle = document.getElementById("images"); 16 // 获取文件上传域内输入的多个文件 17 var fileList = imageEle.files; 18 // 遍历每个文件 19 for(var i = 0 ; i < fileList.length ; i ++) 20 { 21 var file = fileList[i]; 22 div = document.createElement("div"); 23 // 依次读取每个文件的文件名、文件类型、文件大小 24 div.innerHTML = "第" + (i + 1) + "个文件的文件名是:" + file.name 25 + ",该文件类型是:" + file.type 26 + ",该文件大小为:" + file.size; 27 // 把div元素添加到页面中。 28 document.body.appendChild(div); 29 } 30 } 31 </script> 32 </body> 33 </html>
不要单靠accept属性来过滤文件的类型,因为这只是客户端的文件类型的过滤,这种文件类型的过滤是很脆弱的,如果开发者需要进行文件上传,则必须在服务器端对文件类型进行过滤。
2、使用FileReader读取文件内容
FileReader同样是一个JavaScript对象,开发者可以通过该对象在客户端读取文件上传域所选择的文件内容。
FileReader提供了如下的方法:
- readAsText(file,encoding):以文本文件的方式来读取该文件,其中encoding参数指定读取该文件时所用的字符集,该参数的默认值是UTF-8。
- readAsBinary(file):以二进制方式来读取文件。通过这种方式可以读取文件内容的二进制数据,这样就可以通过Ajax把数据上传到服务器。
- readAsDataURL(file):以DataURL的方式来读取文件。这种方式也可用于读取二进制文件,只是这种方式将会采用base64方式把文件内容编码成DataURL格式字符串。
- abort():停止读取。
- onloadstart:FileReader开始读取数据时触发该事件指定的函数
- onprogress:FileReader正在读取数据时触发该事件指定的函数
- onload:FileReader成功读取数据后触发该属性事件的函数
- onloadend:FileReader读取数据完成后触发该事件指定的函数,无论读取成功还是读取失败都将触发该事件指定的函数
- onerror:FileReader读取失败时触发该事件的函数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" /> 5 <meta http-equiv="Content-Type" content="text/html; charset=GBK" /> 6 <title> 文件上传域 </title> 7 </head> 8 <body> 9 浏览文件:<input id="file1" type="file"/><br/> 10 <div id="result"></div> 11 <input type="button" value="读取文本文件" onclick="readText();"/><br/> 12 <input type="button" value="读取二进制文件" onclick="readBinary();"/><br/> 13 <input type="button" value="以DataURL方式读取" onclick="readURL();"/><br/> 14 <script type="text/javascript"> 15 var reader = null; 16 // 如果浏览器支持FileReader对象 17 if(FileReader) 18 { 19 reader = new FileReader(); 20 } 21 // 如果浏览器不支持FileReader对象,弹出提示信息 22 else 23 { 24 alert("浏览器暂不支持FileReader"); 25 } 26 var readText = function() 27 { 28 // 通过正则表达式验证该文件是否为文本文件, 29 // 如果用户选择的第一个文件是文本文件 30 if(/text\/\w+/.test(document.getElementById("file1").files[0].type)) 31 { 32 // 以文本文件的方式读取用户选择的第一个文件 33 reader.readAsText(document.getElementById("file1").files[0] , "gbk"); 34 // 当reader读取数据完成时将会激发该函数 35 reader.onload = function() 36 { 37 document.getElementById("result").innerHTML = reader.result; 38 }; 39 } 40 else 41 { 42 alert("你选择的文件不是文本文件!"); 43 } 44 } 45 var readBinary = function() 46 { 47 // 以二进制流的方式读取用户选择的第一个文件 48 reader.readAsBinaryString(document.getElementById("file1").files[0]); 49 // 当reader读取数据完成时将会激发该函数 50 reader.onload = function() 51 { 52 document.getElementById("result").innerHTML = reader.result; 53 }; 54 } 55 var readURL = function() 56 { 57 // 以DataURL的方式读取用户选择的第一个文件 58 reader.readAsDataURL(document.getElementById("file1").files[0]); 59 // 当reader读取数据完成时将会激发该函数 60 reader.onload = function() 61 { 62 document.getElementById("result").innerHTML = reader.result; 63 }; 64 } 65 </script> 66 </body> 67 </html>
在上面的程序中,readText函数将会以文本的方式来读取文件的内容,在文件的上传域中选择一个文本文件,并单击“读取文本文件”按钮,将可以看到如下图所示的效果:
对于readAsBinaryString和readAsDataURL两种方式,他们都可以读取二进制文。例如,随便选择一个文件,并单击“读取二进制文件”按钮,将如下图的效果:
对于readAsDataURL方法,他可以读取二进制文件,但他返回的是该二进制文件编码成DataURL格式的字符串。可以看到如下效果:
FileReader在读取文件的过程中可能多次触发 onprogress 事件,通过该事件绑定监听器即可实现监控文件的读取速度。
例如:下面页面代码使用了<progress.../>元素来显示文件的读取进度。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" /> 5 <meta http-equiv="Content-Type" content="text/html; charset=GBK" /> 6 <title> 文件上传域 </title> 7 </head> 8 <body> 9 浏览文件:<input id="file1" type="file"/><br/> 10 上传进度:<progress id="pro" value="0"></progress> 11 <div id="result"></div> 12 <input type="button" value="读取二进制文件" onclick="readBinary();"/><br/> 13 <script type="text/javascript"> 14 var reader = null; 15 // 如果浏览器支持FileReader对象 16 if(FileReader) 17 { 18 reader = new FileReader(); 19 } 20 // 如果浏览器不支持FileReader对象,弹出提示信息 21 else 22 { 23 alert("浏览器暂不支持FileReader"); 24 } 25 var readBinary = function() 26 { 27 // 以二进制流的方式读取用户选择的第一个文件 28 reader.readAsBinaryString(document.getElementById("file1").files[0]); 29 var pro = document.getElementById("pro"); 30 pro.max = document.getElementById("file1").files[0].size; 31 // 当reader读取数据的过程中会不断激发该函数。 32 reader.onprogress = function(evt) 33 { 34 pro.value = evt.loaded; 35 }; 36 } 37 </script> 38 </body> 39 </html>
四、HTML5新增的客户端校验
1、属性校验
常用的属性有:required、pattern、min、max、step...
2、调用checkValidity方法进行校验
如果表单对象调用checkValidity()方法返回true,则表明该表单控件可以通过输入校验;否则返回false。
下面的代码使用了checkValidity()方法执行输入校验。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" /> 5 <meta http-equiv="Content-Type" content="text/html; charset=GBK" /> 6 <title> 通过checkValidity进行校验 </title> 7 </head> 8 <body> 9 <form action="add"> 10 生日:<input id="birth" name="birth" type="date"/><br/> 11 邮件地址:<input id="email" name="email" type="email"/><br/> 12 <input type="submit" value="提交" onclick="return check();"/> 13 </form> 14 <script type="text/javascript"> 15 var check = function() 16 { 17 return commonCheck("birth" , "生日" , "字段必须是有效的日期!") 18 && commonCheck("email" , "邮件地址" , "字段必须符合电子邮件的格式!"); 19 } 20 var commonCheck = function(field , fieldName , tip) 21 { 22 var targetEle = document.getElementById(field); 23 // 如果该字段的值为空 24 if (targetEle.value.trim() == "") 25 { 26 alert(fieldName + "字段必须填写!"); 27 return false; 28 } 29 // 调用checkValidity()方法执行输入校验 30 else if(!targetEle.checkValidity()) 31 { 32 alert(fieldName + tip); 33 return false; 34 } 35 return true; 36 } 37 </script> 38 </body> 39 </html>
3、自定义错误提示
可以借助HTML5为表单新增的setCustomValidity()来实现
例子如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" /> 5 <meta http-equiv="Content-Type" content="text/html; charset=GBK" /> 6 <title> 通过属性进行校验 </title> 7 </head> 8 <body> 9 <form action="add"> 10 图书名:<input id="name" name="name" type="text" required/><br/> 11 图书ISBN:<input id="isbn" name="isbn" type="text" 12 required pattern="\d{3}-\d-\d{3}-\d{5}"/><br/> 13 图书价格:<input id="price" name="price" type="number" 14 min="20" max="150" step="5"/><br/> 15 <input type="submit" value="提交" onclick="check();"/> 16 </form> 17 <script type="text/javascript"> 18 var check = function() 19 { 20 if(!document.getElementById("name").checkValidity()) 21 { 22 document.getElementById("name").setCustomValidity("图书名是必填的!"); 23 } 24 if(!document.getElementById("isbn").checkValidity()) 25 { 26 document.getElementById("isbn").setCustomValidity("图书ISBN必须填写," 27 + "\n而且必须符合xxx-x-xxx-xxxxx的格式(其中x代表数字)。"); 28 } 29 if(!document.getElementById("price").checkValidity()) 30 { 31 document.getElementById("price").setCustomValidity("图书价格必须填写," 32 + "\n而且必须在20~150之间,且是5的倍数。"); 33 } 34 }; 35 </script> 36 </body> 37 </html>
------------------------------转载请注明:http://www.cnblogs.com/zhjsll/p/3844040.html ------------------------------
作者:无言
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果您希望与我交流互动,欢迎微博互粉
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。