咱们先完善一下咱们的页面,默认的input-file标签很是丑,咱们美化一下它,不会的能够百度一下,就是外面套个盒子,设置input的opacity为0,而后外面的盒子设计成咱们喜欢的样式便可,我就随便作了一下。css
仍是放一下源码,只谈效果,不放源码的都是耍流氓
这是bodyhtml
<body> <div class="uploadImgBtn" id="uploadImgBtn"> <input class="uploadImg" type="file" name="file" multiple id="file"> </div> </body>
这是css的样式前端
.uploadImgBtn { width: 100px; height: 100px; cursor: pointer; position: relative; background: url("img/plus.png") no-repeat; -webkit-background-size: cover; background-size: cover; } .uploadImgBtn .uploadImg { position: absolute; right: 0; top:0; width: 100%; height: 100%; opacity: 0; cursor: pointer; } //这是一个用作回显的盒子的样式 .pic{ width: 100px; height: 100px; } .pic img { width: 100%; height: 100%; }
代码的量并无多少,接下来咱们就分析一下如何让图片回显;我知道有两种方式,一种是先上传到服务器,并返回该图片的url,而后渲染在页面中;另外一种呢,是利用h5的FileReader对象直接在本地预览图片,用户确认后再上传服务器。jquery
<script> $(document).ready(function(){ //为外面的盒子绑定一个点击事件 $("#uploadImgBtn").click(function(){ /* 一、先获取input标签 二、给input标签绑定change事件 三、把图片回显 */ // 一、先回去input标签 var $input = $("#file"); // 二、给input标签绑定change事件 $input.on("change" , function(){ //补充说明:由于咱们给input标签设置multiple属性,所以一次能够上传多个文件 //获取选择图片的个数 var files = this.files; var length = files.length; console.log("选择了"+length+"张图片"); //三、回显 for( var i = 0 ; i < length ; i++ ){ var fr = new FileReader(), div = document.createElement("div"), img = document.createElement("img"); div.className = 'pic'; fr.onload = function(e){ console.log("回显了图片") img.src = this.result; div.appendChild(img) document.body.appendChild(div); } fr.readAsDataURL(files[i]);//读取文件 } }) }) }) </script>
咱们选择了三张图片,却显示了一张,话说咱们在for循环里建立了三个div和img却只显示了一张图片,这里面确定有蹊跷。web
<script> $(document).ready(function(){ //为外面的盒子绑定一个点击事件 $("#uploadImgBtn").click(function(){ /* 一、先获取input标签 二、给input标签绑定change事件 三、把图片回显 */ // 一、先回去input标签 var $input = $("#file"); // 二、给input标签绑定change事件 $input.on("change" , function(){ //补充说明:由于咱们给input标签设置multiple属性,所以一次能够上传多个文件 //获取选择图片的个数 var files = this.files; var length = files.length; console.log("选择了"+length+"张图片"); //三、回显 $.each(files,function(key,value){ //每次都只会遍历一个图片数据 var div = document.createElement("div"), img = document.createElement("img"); div.className = "pic"; var fr = new FileReader(); fr.onload = function(){ img.src=this.result; div.appendChild(img); document.body.appendChild(div); } fr.readAsDataURL(value); }) }) }) }) </script>
在看一下运行的效果
编程
<script> $(document).ready(function(){ //为外面的盒子绑定一个点击事件 $("#uploadImgBtn").click(function(){ /* 一、先获取input标签 二、给input标签绑定change事件 三、把图片回显 */ // 一、先回去input标签 var $input = $("#file"); console.log($input) // 二、给input标签绑定change事件 $input.on("change" , function(){ console.log(this) //补充说明:由于咱们给input标签设置multiple属性,所以一次能够上传多个文件 //获取选择图片的个数 var files = this.files; var length = files.length; console.log("选择了"+length+"张图片"); //三、回显 $.each(files,function(key,value){ //每次都只会遍历一个图片数据 var div = document.createElement("div"), img = document.createElement("img"); div.className = "pic"; var fr = new FileReader(); fr.onload = function(){ img.src=this.result; div.appendChild(img); document.body.appendChild(div); } fr.readAsDataURL(value); }) }) //四、咱们把当前input标签的id属性remove $input.removeAttr("id"); //咱们作个标记,再class中再添加一个类名就叫test var newInput = '<input class="uploadImg test" type="file" name="file" multiple id="file">'; $(this).append($(newInput)); }) }) </script>