如今,在实现前端图片即时预览,能够说是一件很简单的事情了。javascript
咱们只须要用file对象和FileReader对象,既能够轻松实现,无需下载类库。html
HTML代码前端
<!DOCTYPE html>
<html>
<body>
<img src="">
<form>
<input type="file" name="image" />
</form>
</body>
</html>
先来讲说input,input这个元素,具备一个files属性,该属性是一个filelist对象,是file对象的集合。java
你能够经过input.files[0]的语法形式拿到这个file对象,不过遗憾的是,这个对象仅仅包含了用户选择的文件的相关信息,如文件名,大小,类型,最后修改时间等,并不直接提供文件的数据。程序员
程序员只能经过这些信息对用户选择的文件进行一些限制。ide
因此,咱们要使用另外一个对象FileReader来读取到用户选择的文件的数据this
咱们初始化一个FileReader对象spa
var x=new FileReader;
这是一个初始化完成的FileReader对象具备的一些属性和支持的事件code
相似于Ajax,FileReader提供了readyState来查看读取的状态,不过并无什么卵用orm
由于FileReader还提供了onloadend这样的事件,来处理数据读取完成后该干些什么,onprogress是最有趣的,只要在读取数据,那么这个事件会被不停的触发,能够实现那种进度条效果。
还有一个极其重要的属性result,初始化完成时,该值是null,当读取数据后,该值就是所得到的数据。
接下来,咱们就可使用这个对象读取用户选择的图片了,没有错就是这么简单
当用户选择了某一个文件时,就会在input上触发change事件,这意味着咱们能够开始读取数据了
document.forms[0].elements[0].onchange=function(){ x.readAsDataURL(this.files[0]); }
readASDateURL这个方法,能够读取一个file对象,并把数据以base64的格式填充到FileReader对象中的result属性中去。
当数据读取完毕,就会触发onloadend事件,在这个事件中,就能够把数据填到img标签中去
x.onloadend=function(){ document.images[0].src=this.result; }
完整版代码
<!DOCTYPE html>
<html>
<body>
<img src="">
<form>
<input type="file" name="image" />
</form>
<script type="text/javascript">
var x=new FileReader; document.forms[0].elements[0].onchange=function(){ x.readAsDataURL(this.files[0]); } x.onloadend=function(){ document.images[0].src=this.result; } </script>
</body>
</html>
固然,这里只是一个小小的Demo,仅仅实现了本地预览,抛砖引玉,你还能够在此基础上轻松实现对上传文件的一些判断和限制,或者是UI上的提高。
FileReader的能力并不止步于此,不单单有readASDataURL这种方法。
不只是图片,音乐,视频均可以实现对于的本地预览,只要把result属性的值,赋值给对应的audio或video标签的src属性便可,不过由于内存限制,读取视频每每失败。