用原生JS实现多张图片上传及预览功能(兼容IE8)
最近需要做一个图片上传预览的功能(兼容IE8-11、chrome、firefox等浏览器),网上现有的文件上传组件(如webuploader)总是会遇到一些兼容性问题。于是我参考了一些博文(链接找不到了⊙o⊙…),自己用原生JS写了一个支持多张图片上传预览功能的Demo
先通过最终效果看一下功能:
上传前

点击按钮打开文件资源管理器后只会显示图片格式的文件(通过input标签accept属性过滤)

在(非IE)浏览器下支持选中多张图片同时上传(通过input标签multiple属性)(这里在JS代码中设置最多上传2张)


代码如下:
完整版Demo代码打包(包含图片)下载地址
- HTML:
<div class="pic">
<div class="uploadImage">
<input type="file" value="上传文件" id="file" accept="image/png, image/jpeg, image/gif, image/jpg" multiple/>
<p>点击上传</p>
</div>
<div class="preview">
<img src="" id="look1">
<p class="word">图片1</p>
</div>
<div class="preview">
<img src="" id="look2">
<p class="word">图片2</p>
</div>
</div>
- CSS:
.uploadImage{
display: inline-block;
vertical-align: top;
position: relative;
width: 90px;
height: 90px;
background: url("../点击上传.png") no-repeat;
background-size: cover;
text-align: center;
cursor: pointer;
}
.uploadImage p{
position: absolute;
left:0;right:0;
bottom: 10px;
font-size: 14px;
color: #999999;
}
.uploadImage input#file{
width: 100%;
height: 100%;
opacity: 0;
cursor: pointer;
}
.preview{
position: relative;
display: inline-block;
vertical-align: top;
margin-left: 10px;
width: 90px;
height: 90px;
background: #E1E6ED;
text-align: center;
}
.preview img{
position: relative;
z-index: 1;
width: 100%;
height: 100%;
}
.preview img[src=""]{
opacity:0;
filter: Alpha(0); /* 兼容IE8-9 */
}
.preview img:not([src]){
opacity:0;
filter: Alpha(0); /* 兼容IE8-9 */
}
.preview .word{
position: absolute;
left: 0;
right: 0;
top: 0;
line-height: 90px;
font-size: 14px;
color: #999999;
z-index: 0;
}
- JS:
var hasUploadedOne = false;// 已上传过1张图片
var hasUploadedTwo = false;// 已上传过2张图片
//获取到预览框
var imgObjPreview1 = document.getElementById("look1");
var imgObjPreview2 = document.getElementById("look2");
document.getElementById('file').onchange = function() {
// 若还没完成2张图片的上传
if(!hasUploadedTwo){
//获取到file的文件
var docObj = this;
//获取到文件名和类型(非IE,可一次上传1张或多张)
if(docObj.files && docObj.files[0]) {
// 一次上传了>=2张图片(只有前两张会真的上传上去)
if(docObj.files.length >= 2){
imgObjPreview1.src = window.URL.createObjectURL(docObj.files[0]);
imgObjPreview2.src = window.URL.createObjectURL(docObj.files[1]);
hasUploadedTwo = true;
}
//一次只上传了1张照片
else{
// 这是上传的第一张照片
if(!hasUploadedOne){
imgObjPreview1.src = window.URL.createObjectURL(docObj.files[0]);
hasUploadedOne = true;
}
// 这是上传的第二张照片
else{
imgObjPreview2.src = window.URL.createObjectURL(docObj.files[0]);
hasUploadedTwo = true;
}
}
}
//IE(只能一次上传1张)
else {
//使用滤镜
docObj.select();
var imgSrc = document.selection.createRange().text;
// 这是上传的第一张照片
if(!hasUploadedOne){
imgObjPreview1.src = imgSrc;
hasUploadedOne = true;
}
// 这是上传的第二张照片
else{
imgObjPreview2.src = imgSrc;
hasUploadedTwo = true;
}
document.selection.empty();
}
return true;
}
}
用原生JS实现多张图片上传及预览功能(兼容IE8)的更多相关文章
- 原生JS实现异步图片上传(预览)
效果 实现过程分为两步 1. 用户点击添加后通过 H5文件读取 FileReader对象以DataURL的格式读取图片 2. 通过FormData对象生成表单数据,通过ajax上传到后台 HTML & ...
- 一、简单的图片上传并预览功能input[file]
一.简单的图片上传并预览功能input[file] <!DOCTYPE html> <html lang="en"> <head> <me ...
- 图片上传本地预览。兼容IE7+
基于JQUERY扩展,图片上传预览插件 目前兼容浏览器(IE 谷歌 火狐) 不支持safari 预览地址:http://www.jinbanmen.com/test/1.html js代码:/**名称 ...
- input file实现多选,限制文件上传类型,图片上传前预览功能
限制上传类型 & 多选:① accept 属性只能与 <input type="file" /> 配合使用.它规定能够通过文件上传进行提交的文件类型. ② mu ...
- 原生JS实现图片上传并预览功能
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JAVA图片批量上传JS-带预览功能
这篇文章就简单的介绍一个很好用的文件上传工具,批量带预览功能.直接贴代码吧,都有注释,很好理解. HTML页面 <!DOCTYPE html> <%@ taglib prefix=& ...
- 微信小程序实现图片是上传、预览功能
本文实例讲述了微信小程序实现图片上传.删除和预览功能的方法,分享给大家供大家参考,具体如下: 这里主要介绍一下微信小程序的图片上传图片删除和图片预览 1.可以调用相机也可以从本地相册选择 2.本地实现 ...
- JavaScript 图片的上传前预览(兼容所有浏览器)
功能描述 通过 JavaScript 实现图片的本地预览(无需上传至服务器),兼容所有浏览器(IE6&IE6+.Chrome.Firefox). 实现要点 ● 对于 Chrome.Fire ...
- 上传图片,多图上传,预览功能,js原生无依赖
最近很好奇前端的文件上传功能,因为公司要求做一个支持图片预览的图片上传插件,所以自己搜了很多相关的插件,虽然功能很多,但有些地方不能根据公司的想法去修改,而且需要依赖jQuery或Bootstrap库 ...
随机推荐
- js 中实现aop
http://fredrik.appelberg.me/2010/05/07/aop-js/ Aop = { // Apply around advice to all matching functi ...
- C#框架学习资料集锦
1.AllEmpty 的[从零开始编写自己的C#框架]系列 从零开始编写自己的C#框架(1)——前言从零开始编写自己的C#框架(2)——开发前的准备工作从零开始编写自己的C#框架(3)——开发规范从零 ...
- c++ 以多维数组的形式访问动态内存
教学内容: 以多维数组的形式访问动态内存 六.作业 .]=(]) *sizeof(int)); 以 pNum[][]形式访问内存空间. //8*3 [8][3] ]; int i,j,n; n=; p ...
- 解决 sr 的端口占用问题
只需要在一开机的极短时间内开启 sr 即可提前占用端口,而不是被占用
- CS100.1x-lab0_student
这是CS100.1x第一个提交的作业,是给我们测试用的.相关ipynb文件见我github.本来没什么好说的.我在这里简单讲一下,后面会更详细的讲解.主要分成5个部分. Part 1: Test Sp ...
- mysql索引原理及查询速度优化
一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句 ...
- 工作总结 vue 城会玩
用了vue2.0,vuex, vue-router等较新的技术,完成了城会玩这个项目,过程中发现自己许多不足,也得到很多人帮助,特别是有些困难的技术点.现在项目上线了,在此做一个整理和总结. 1.ke ...
- [webpack]--webpack 如何解析代码模块路径
前言 webpack是如何解析代码模块路径 webpack 中有一个很关键的模块 enhanced-resolve 就是处理依赖模块路径的解析的,这个模块可以说是 Node.js 那一套模块路径解析的 ...
- Python无参装饰器
需求:想要在test_func函数前后执行一些代码 1.第一步(定义函数,将调用原函数,使用新函数替换) def test_func(): return 'test_func' def test_ ...
- jmeter—操作数据库
添加JDBC Request,添加需要执行的sql语句 在这个界面需要配置Variabke Name,内容要与上表中的Name值相同:数据库的用户名.密码.URL.驱动这些基本信息要在这里配置:其他选 ...