<!DOCTYPE html>
<html>
<head>
<title>
加强的HTML文件上传</title>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312"/>
</head>
<body>
<!--1.FileList对象和File对象
两个属性:
accept:指定上传文件类型(指定MIME类型)
不要单靠accept过滤文件,这只是客户端过滤,很脆弱,若是要过滤,还须要在服务器端设置过滤
multiple:容许上传多个文件
javascript经过files属性访问上传文件返回一个FileList对象,FileList对象相对于一个数组,开发者能够经过相似访问数组的方式访问每个File对象
File对象包含以下属性:name、type、size等
若是要访问文件具体内容(二进制数据),须要借助FileReader等对象
-->
<input type="file" id="images" name="images" multiple accept="image/*"/><br/>
<input type="button" value="显示文件" onClick="showDetails()"/>
<script type="text/javascript">
var showDetails=function(){
var imageEle=document.getElementById('images');
var fileList=imageEle.files;
for(var i=0;i<fileList.length;i++){
var file=fileList[i];
div=document.createElement('div');
div.innerHTML="第"+(i+1)+"文件的文件名是:"+file.name+"---文件类型是:"+file.type+"---文件大小是:"+file.size;
document.body.appendChild(div);
}
}
</script> javascript
<!--使用FileReader读取文件内容
FileReader一样是一个js对象
提供了三个读取文件的方式:
readAsText(file,encoding),以文本文件的方式读
readAsBinaryString(file),以二进制方式读取
readAsDataURL(file),以base64方式把文本内容编码成DataURL格式字符串
-->
<input type="file" id="file"/><br/>
<progress id="pro" value="0"></progress>
<div id="result"></div>
<input type="button" value="读取文本文件" onClick="readText()"/><br/>
<input type="button" value="读取二进制文件" onClick="readBinary()"/><br/>
<input type="button" value="以DataURL方式读取" onClick="readURL()"/><br/>
<script type="text/javascript">
var reader=null;
//若是浏览器支持FileReader对象
if(FileReader){
reader=new FileReader();
}
//若是浏览器不支持FileReader对象
else{
alert("浏览器不支持FileReader对象");
}
var readText=function(){
//经过正则表达式验证该文件是不是文本文件
var isText="text\/\w+";
var fileList=document.getElementById('file').files;
//if(isText.test(fileList[0].type)){
reader.readAsText(fileList[0],"utf-8");
reader.onload=function(){
document.getElementById('result').innerHTML=reader.result;
}
//}
//else{
//alert("选择文件不是文本文件");
//}
}
var readBinary=function(){
var fileList=document.getElementById('file').files;
var pro=document.getElementById('pro');
pro.max=fileList[0].size;
reader.readAsBinaryString(fileList[0]);
reader.onprogress=function(evt){
pro.value=evt.loaded;
}
reader.onload=function(){
document.getElementById('result').innerHTML=reader.result;
}
}
var readURL=function(){
var fileList=document.getElementById('file').files;
reader.readAsDataURL(fileList[0]);
reader.onload=function(){
document.getElementById('result').innerHTML=reader.result;
}
}
</script> html
<!--4、HTML5新增的客户端校验
1.使用校验属性执行校验
<required>:指定该控件必须填写
<pattern>:指定该控件必须符合的正则表达式
min/max/step:只对数字类型、日期类型有效
-->
<form action="add">
图书名:<input name="name" type="text" required/><br/>
图书ISBN:<input name="isbn" type="text" required pattern="\d{3}-\d-\d{3}-\d{5}"/><br/>
图书价格:<input name="price" type="number" min="20" max="50" step="5"/><br/>
<input type="submit" value="提交"/>
</form>
<!--2.调用checkValidity方法进行校验-->
<form action="abc">
生日:<input name="birth" type="date" id="birth"/><br/>
电邮:<input id="email" name="email" type="email"/><br/>
<input type="submit" value="提交" onClick="return check()"/>
<script type="text/javascript">
var check=function(){
return commonCheck("email","电邮","字段必须符合电邮格式");
}
var commonCheck=function(field,fieldName,tip){
var targetEle=document.getElementById(field);
if(targetEle.value.trim()==""){
alert(fieldName+"不能为空!");
return false;
}
else if(!targetEle.checkValidaty()){
alert(fieldName+tip);
return false;
}
}
</script>
</form>
<!--除此以外,HTML5为全部表单、表单控件提供了一个validity属性,该属性的值是一个ValidityState对象,该对象表明了表单、表单控件的输入校验状态,其中ValidityState的valid属性能够表示该表单、表单控件是否经过输入校验
3.自定义错误提示
setCustomValidity()方法
调用了某个控件的该方法意味着该表单控件没有经过输入校验。所以只有当表单控件自己没有经过输入校验时才能调用该方法,而不能随便直接调用该方法,不然可能致使原本能够经过校验的表单控件也变成了不能经过校验了
-->
<form action="asdf" >
图书名:<input name="a" type="text" required placeholder="input bookname"/><br/>
<input type="submit" value="提交" onclick="checkInput()"/>
</form>
<!--目前浏览器对自定义错误的支持不是很理想-->
<script style="text/javascript">
var checkInput=function(){
if(!document.getElementById('a').checkValidity()){
document.getElementById('a').setCustomValidity("图书名不能为空!");
}
}
</script>
<!--4.关闭校验
为<form>元素增减novalidate属性,该属性的值要么是novalidate要么是省略属性值
为<input>或<button>元素设置formnovalidate属性,该属性的值要么是novalidate要么是省略属性值
第一种方式将会关闭表单的输入校验功能,第二种方式则是指定的按钮或表单失去校验检验
-->
<body>
</html> java