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

先通过最终效果看一下功能:

  1. 上传前

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

  3. 在(非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)的更多相关文章

  1. 原生JS实现异步图片上传(预览)

    效果 实现过程分为两步 1. 用户点击添加后通过 H5文件读取 FileReader对象以DataURL的格式读取图片 2. 通过FormData对象生成表单数据,通过ajax上传到后台 HTML & ...

  2. 一、简单的图片上传并预览功能input[file]

    一.简单的图片上传并预览功能input[file] <!DOCTYPE html> <html lang="en"> <head> <me ...

  3. 图片上传本地预览。兼容IE7+

    基于JQUERY扩展,图片上传预览插件 目前兼容浏览器(IE 谷歌 火狐) 不支持safari 预览地址:http://www.jinbanmen.com/test/1.html js代码:/**名称 ...

  4. input file实现多选,限制文件上传类型,图片上传前预览功能

    限制上传类型 & 多选:① accept 属性只能与 <input type="file" /> 配合使用.它规定能够通过文件上传进行提交的文件类型. ② mu ...

  5. 原生JS实现图片上传并预览功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. JAVA图片批量上传JS-带预览功能

    这篇文章就简单的介绍一个很好用的文件上传工具,批量带预览功能.直接贴代码吧,都有注释,很好理解. HTML页面 <!DOCTYPE html> <%@ taglib prefix=& ...

  7. 微信小程序实现图片是上传、预览功能

    本文实例讲述了微信小程序实现图片上传.删除和预览功能的方法,分享给大家供大家参考,具体如下: 这里主要介绍一下微信小程序的图片上传图片删除和图片预览 1.可以调用相机也可以从本地相册选择 2.本地实现 ...

  8. JavaScript 图片的上传前预览(兼容所有浏览器)

    功能描述 通过 JavaScript 实现图片的本地预览(无需上传至服务器),兼容所有浏览器(IE6&IE6+.Chrome.Firefox). 实现要点   ● 对于 Chrome.Fire ...

  9. 上传图片,多图上传,预览功能,js原生无依赖

    最近很好奇前端的文件上传功能,因为公司要求做一个支持图片预览的图片上传插件,所以自己搜了很多相关的插件,虽然功能很多,但有些地方不能根据公司的想法去修改,而且需要依赖jQuery或Bootstrap库 ...

随机推荐

  1. linux命令--cp、tail、cd、mv、history、cd

    day1 cd命令 cd ../定位至上级目录 cd ./定位到当前目录 cd ~ 定位当前用户目录 cd / 定位系统根目录 cd - 返回进入此目录之前所在的目录 day2 mv命令: mv时,若 ...

  2. FSCapture注册码

    企业版序列号: name:bluman serial/序列号/注册码:VPISCJULXUFGDDXYAUYF

  3. 柯朗微积分与数学分析习题选解(1.1 节 e)

    一直在读<陶哲轩实分析>,陶的书非常的严谨,环环相扣,但是也有个缺点就是计算性的例子和应用方面的例子太少了.所以就又找了本柯朗的<微积分与数学分析>搭配着看.柯朗的书的习题与陶 ...

  4. [NOI2016]区间 线段树

    [NOI2016]区间 LG传送门 考虑到这题的代价是最长边减最短边,可以先把边按长度排个序,双指针维护一个尺取的过程,如果存在包含某个点的区间数\(\ge m\),就更新答案并把左指针右移,这样做的 ...

  5. 2_C语言中的数据类型 (四)整数与无符号数

    1.1       sizeof关键字 sizeof是c语言关键字,功能是求指定数据类型在内存中的大小,单位:字节 sizeof与size_t类型 1.1       int类型 1.1.1      ...

  6. 初探JSP运行机制和与Servlet间的关系

    自己看的书,手动画的图,如果有错误,请指正,谢谢.

  7. DNS DHCP 路由 FTP

    第1章 网络基础 1.1 IP地址分类 IP地址的类别-按IP地址数值范围划分 IP地址的类别-按IP地址用途分类 IP地址的类别-按网络通信方式划分 1.2 局域网上网原理过程 DHCP原理过程详情 ...

  8. 使用efwplusScript开发Winform程序【像小程序那样开发PC软件】

    一.前言 本人从事多年医疗管理软件的开发,在医院大多数的软件都还是CS程序,BS程序很少,对于使用者来说CS的操作体验确实比BS的要好. 1.CS的缺点就是升级麻烦,每次有新版本都需要所有客户端操作升 ...

  9. Python+Selenium UI自动化测试环境搭建及使用

    一什么是Selenium ? Selenium 是一个浏览器自动化测试框架,它主要用于web应用程序的自动化测试,其主要特点如下:开源.免费:多平台.浏览器.多语言支持:对web页面有良好的支持:AP ...

  10. MergeSort 归并排序(java)

    MergeSort 归并排序 排序思想:1,分解待排序的n个元素为两个子列,各为n/2个元素 2,若子列没有排好序,重复1步骤,每个子列继续分解为两个子列,直至被分解的子列个数为1 3,子列元素个数为 ...