jQuery实现input[type=file]多图预览上传删除等功能


Posted in jQuery onAugust 02, 2019

下面我们了解一下,多图上传时,怎么实现预览、上传、删除等功能。下图是功能实现的预览效果,虽然样式有点丑,不过功能还是实现了。话不多说,直接看代码会更直观一些。

jQuery实现input[type=file]多图预览上传删除等功能

首先定义一下基本格式,样式代码自行脑补:

<body>
 <div class="upload-header">
 <input id="upload" type="file" accept="image/*" multiple="multiple">
 <button class="btn">点击上传</button>
 </div>
 <div class="img-box">
 <!-- 存放预览图片 -->
 </div>
</body>

接着定义看一下具体的js实现代码,我是基于JQ做的开发,方便DOM的操作。

1. 预览功能的实现

这里监听input[type=file]的change事件,在回调函数中,取到暂存区的文件e.target.files,通过遍历files 文件属性,使用FileReader 函数读取文件的值,然后使用append方法把图片放入指定盒子中。备注::FileReader是一种异步文件读取机制,结合input:file可以很方便的读取本地文件。

imgPreview: function () {
 var that = this;
 $('.upload-header').on('change', '#upload', function(e) {
  var files = e.target.files;
  if (files.length > 0) {
  for (var i = 0; i < files.length; i++) {
   var reader = new FileReader();
   reader.onload = function () {
   var text = `
    <div class="img-list">
    <img src="${this.result}" alt="">
    <div class="del-img">删除</div>
    </div>
   `
   $('.img-box').append(text);
   };
   reader.readAsDataURL(files[i]);
   that.filesList.push(files[i]);
  };
  };
 })
 }

2. 图片删除功能

这里是使用on方法对预览的图片添加点击事件,这里使用on方法主要是因为on方法对后面添加的dom可以继续监听。当需要删除照片时,直接删除其图片的父节点及以下节点就可以了。此时记得把暂存区的文件filesList也要对应删除。

delImage: function () {
 var that = this;
 $('.img-box').on('click', '.del-img', function () {
  var delStatus = confirm('确认这张图片删除吗?');
  if (delStatus) {
  var index = $(this).parent().index();
  $(this).parent().remove();
  that.filesList.splice(index, 1);
  console.log('我删除啦', index);
  };
 });
 }

2. 图片批量上传功能

图片上传我定义了两个方法,第一方法是点击上传后,对所有文件进行遍历,依次调取上传的方法(因为用的七牛上传工具,只支持单个文件上传,所以采取了遍历的方式)。第二个方法使用了jq的ajax的post上传方式,使用FormData实例,添加file属性进行上传。因为是批量上传,所以我使用了定义临时变量flag 的方式来判断文件是否都上传完成,当flag的值与filesList的数量一致时,就可以判断所有上传完成。使用方法比较low,如果其他好的方法可以留言交流。

clickUpload: function () {
 var that = this;
 var filesList = this.filesList;
 $('.btn').on('click', function() {
 that.flag = 0;
 if (filesList.length > 0) {
  for (var i = 0; i < filesList.length; i++) {
  that.upLoadMethod(filesList[i]);
  }
 };
 }) 
},
upLoadMethod: function (file) {
 var that = this;
 var formData = new FormData();
 formData.append('file', file);
 $.ajax({
  type: "post",
  url: 'http://172.16.1.99:8703/file/upload',
  data: formData,
  mimeType: "multipart/form-data",
  dataType: "json",
  async: false,
  cache: false, //上传文件不需要缓存
  contentType: false, //需设置为false。因为是FormData对象,且已经声明了属性enctype="multipart/form-data"
  processData: false, //需设置为false。因为data值是FormData对象,不需要对数据做处理
  success: function (response) {
  that.flag += 1;
  if (that.flag === that.filesList.length) {
   console.log('我上传完成了');
  };
  },
  error: function (err) {
  console.log('上传失败');
  }
 });
 },

以下是完整的js代码,供参考:

<script>
 function UploadFunction (name) {
 this.name = name;
 this.init();
 };
 UploadFunction.prototype = {
 // 初始化
 init: function () {
  this.clickUpload();
  this.imgPreview();
  this.delImage();
 },
 flag: 0,
 filesList: [],
 // 点击上传
 clickUpload: function () {
  var that = this;
  var filesList = this.filesList;
  $('.btn').on('click', function() {
  that.flag = 0;
  if (filesList.length > 0) {
   for (var i = 0; i < filesList.length; i++) {
   that.upLoadMethod(filesList[i]);
   }
  };
  }) 
 },
 imgPreview: function () {
  var that = this;
  $('.upload-header').on('change', '#upload', function(e) {
  var files = e.target.files;
  console.log(files);
  if (files.length > 0) {
   for (var i = 0; i < files.length; i++) {
   var reader = new FileReader();
   reader.onload = function () {
    var text = `
    <div class="img-list">
     <img src="${this.result}" alt="">
     <div class="del-img">删除</div>
    </div>
    `
    $('.img-box').append(text);
   };
   reader.readAsDataURL(files[i]);
   that.filesList.push(files[i]);
   };
  };
  })
 },
 upLoadMethod: function (file) {
  var that = this;
  var formData = new FormData();
  formData.append('file', file);
  $.ajax({
  type: "post",
  url: '这里使用上传的地址/upload',
  data: formData,
  mimeType: "multipart/form-data",
  dataType: "json",
  async: false,
  cache: false, //上传文件不需要缓存
  contentType: false, //需设置为false。因为是FormData对象,且已经声明了属性enctype="multipart/form-data"
  processData: false, //需设置为false。因为data值是FormData对象,不需要对数据做处理
  success: function (response) {
   that.flag += 1;
   if (that.flag === that.filesList.length) {
   console.log('我上传完成了');
   };
  },
  error: function (err) {
   console.log('上传失败');
  }
  });
 },
 delImage: function () {
  var that = this;
  $('.img-box').on('click', '.del-img', function () {
  var delStatus = confirm('确认这张图片删除吗?');
  if (delStatus) {
   var index = $(this).parent().index();
   $(this).parent().remove();
   that.filesList.splice(index, 1);
   console.log('我删除啦', index);
  };
  });
 }
 }
 var UploadFunction = new UploadFunction('小明删照片');

总结

以上所述是小编给大家介绍的jQuery实现input[type=file]多图预览上传删除等功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

jQuery 相关文章推荐
使用jQuery卸载全部事件的思路详解
Apr 03 jQuery
jquery点赞功能实现代码 点个赞吧!
May 29 jQuery
JQuery Ajax 异步操作之动态添加节点功能
May 24 jQuery
jQuery Layer弹出层传值到父页面的实现代码
Aug 17 jQuery
jQuery实现的点击标题文字切换字体效果示例【测试可用】
Apr 26 jQuery
jQuery实现百度图片移入移出内容提示框上下左右移动的效果
Jun 05 jQuery
jquery ajax加载数据前台渲染方式 不用for遍历的方法
Aug 09 jQuery
jquery实现动态添加附件功能
Oct 23 jQuery
jQuery时间戳和日期相互转换操作示例
Dec 07 jQuery
jQuery属性选择器用法实例分析
Jun 28 jQuery
jQuery zTree插件快速实现目录树
Aug 16 jQuery
jQuery实现容器间的元素拖拽功能
Dec 01 jQuery
jQuery实现checkbox全选、反选及删除等操作的方法详解
Aug 02 #jQuery
jQuery pager.js 插件动态分页功能实例分析
Aug 02 #jQuery
jQuery中DOM常见操作实例小结
Aug 01 #jQuery
jQuery中DOM操作原则实例分析
Aug 01 #jQuery
JS/jQuery实现超简单的Table表格添加,删除行功能示例
Jul 31 #jQuery
jquery.pager.js分页实现详解
Jul 29 #jQuery
jquery.pager.js实现分页效果
Jul 29 #jQuery
You might like
ThinkPHP 连接Oracle数据库的详细教程[全]
2012/07/16 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
2014/04/01 PHP
php多任务程序实例解析
2014/07/19 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
Mootools 1.2教程 滚动条(Slider)
2009/09/15 Javascript
javaScript矢量图表库-gRaphael几行代码实现精美的条形图/饼图/点图/曲线图
2013/01/09 Javascript
javascript中如何处理引号编码&amp;#034;
2013/08/15 Javascript
Jquery中扩展方法extend使用技巧
2014/08/24 Javascript
纯JavaScript实现获取onclick、onchange等事件的值
2014/12/29 Javascript
javascript转换静态图片,增加粒子动画效果
2015/05/28 Javascript
javascript实现网页屏蔽Backspace事件,输入框不屏蔽
2015/07/21 Javascript
JavaScript动态生成二维码图片
2016/04/20 Javascript
JavaScript遍历Json串浏览器输出的结果不统一问题
2016/11/03 Javascript
Node.js数据库操作之连接MySQL数据库(一)
2017/03/04 Javascript
纯js封装的ajax功能函数与用法示例
2018/05/14 Javascript
Vue一次性简洁明了引入所有公共组件的方法
2018/11/28 Javascript
JS实现将对象转化为数组的方法分析
2019/01/21 Javascript
js通过循环多张图片实现动画效果
2019/12/19 Javascript
如何基于javascript实现贪吃蛇游戏
2020/02/09 Javascript
vue 微信分享回调iOS和安卓回调出现错误的解决
2020/09/07 Javascript
详解Python中的__getitem__方法与slice对象的切片操作
2016/06/27 Python
利用Python爬虫给孩子起个好名字
2017/02/14 Python
Python实现字符串匹配算法代码示例
2017/12/05 Python
matplotlib中legend位置调整解析
2017/12/19 Python
详解Python使用tensorflow入门指南
2018/02/09 Python
python去掉空白行的多种实现代码
2018/03/19 Python
python实现在线翻译功能
2020/03/03 Python
利用python进行文件操作
2020/12/04 Python
LookFantastic丹麦:英国美容护肤精品在线商城
2016/08/18 全球购物
Stylenanda中文站:韩国一线网络服装品牌
2016/12/22 全球购物
中科创达面试题
2016/12/28 面试题
《理想》教学反思
2014/02/17 职场文书
追悼会主持词
2014/03/20 职场文书
作风转变年心得体会
2014/10/22 职场文书
Go语言实现Snowflake雪花算法
2021/06/08 Golang
Windows Server 2012 修改远程默认端口3389的方法
2022/04/28 Servers