JS上传图片预览插件制作(兼容到IE6)


Posted in Javascript onAugust 07, 2016

一、实现图片预览的一些方法。

了解了一下,其实方法都是大同小异的。大概有以下几种方式:

①订阅input[type=file]元素的onchange事件.

一旦选择的路径被改变就把图片上传至服务器,然后就返回图片在服务器端的地址,并且赋值到img元素上。

缺点:工作量大,有些上传并不是用户最终需要上传的图片,但是这种方式会把上传过程中选择过的图片都保存至服务器端,会造成资源浪费,而且服务器端清理临时的那些预览图片也需要一定的工作量。

②利用HTML5的新特性FileReader。

这个对象提供了很多相关的方法,其中最主要用到readAsDataURL这个方法。点我了解更多。

缺点:通过FileReader的readAsDataURL方法获取的Data URI Scheme会生成一串很长的base64字符串,若图片较大那么字符串则更长,若页面出现reflow时则会导致性能下降。且浏览器支持情况不一致,支持的浏览器:FF3.6+,Chrome7+,IE10+。

③使用window.URL.createObjectURL代替FileReader,再用DXImageTransform.Microsoft.AlphaImageLoader滤镜兼容IE。

缺点:由于IE11作了安全方面的考虑,使得在input[type=file]元素上通过value、outerHTML和getAttribute的方式都无法获取用户所选文件的真实地址,只能获取到

D:\frontEnd\文件名称。因此需使用document.selection.createRangeCollection方法来获取真实地址。

二、我的插件制作

我选择了比较保守的方法,就是第三种使用window.URL.createObjectURL代替FileReader,再用DXImageTransform.Microsoft.AlphaImageLoader滤镜兼容IE的方法啦。

①第一步,HTML的布局

<div id="pic">
<img id="preview" src="../imgs/default.jpeg">
</div>
<input type="file" id="uploadBtn" accept="image/*" onchange="setPreviewPic()">

是不是想说so easy?

②第二步,插件js封装。

1、建立对象

我主要采用了组合继承的方式,封装了两个方法,分别是单张图片上传和多张图片上传。因为无论是单张图片上传还是单张图片上传,都需要传入、上传图片的input按钮、img标签、包裹着img的div、最大的单张照片的值,单位为KB。所以这四个参数在创建上传图片对象的时候就要传入。创建该对象的方法如下:

var SetPreviewPic=function(fileObj,preview,picWrap,maxImgSize){
this.fileObj=fileObj;
this.preview=preview;
this.picWrap=picWrap;
this.maxImgSize=maxImgSize;
}

2、定义匹配模式

因为是上传图片,除了在input里面加了accept="image/*",做了初步限制之外,还需要一个js的正则来通过路径的检测来判定是否为图片。所以在prototype上面定义该模式以供两个方法使用:

SetPreviewPic.prototype.pattern=new RegExp('\.(jpg|png|jpeg)+$','i');

3、定义方法

主要就是判断是否低于IE11的环境,编写两类方案。第一种就是直接通过改变img的src来预览图片,第二种就是在低版本的IE下,通过滤镜来达到预览效果。

FF、Chrome、IE11以上:(这里贴出多张图片预览的代码)

<span class="Apple-tab-span"> if(maxPics){</span> <br> if(this.fileObj.files && this.fileObj.files[0]){
var imgs=this.picWrap.querySelectorAll('img'); //查找DOM里面已经有多少张图片了
var num=imgs.length;
var html=this.picWrap.innerHTML;
if(Number(num)<Number(maxPics)){ //判断是否超过最大上传限度
if(num==1&&(!imgs[0].classList.contains('newLoad'))){ //覆盖第一张默认图片
html='';
}
if(this.pattern.test(fileObj.files[0].name)){
if(judgeSize(fileObj.files[0].size/1024,this.maxImgSize)){//判断图片的大小是否超限
html='<img class="newLoad" style="margin:5px;width:'+width+'px;height:'+height+'px;" src='+window.URL.createObjectURL(this.fileObj.files[0])+' />'+html;
this.picWrap.innerHTML=html;
}else{
alert('你上传的图片太大!');
}
}else{
alert('你上传的好像不是图片哦,请检查!');
}
}else{
alert('每次最多上传'+maxPics+'张图片!');
}
}

IE11下利用滤镜达到效果:

var nums=this.picWrap.childNodes.length;//因为IE6以下不支持querySelectorAll等方法,就通过childNodes的长度判断
if(nums<maxPics+2){//这里加2是因为本来有一张默认的图片,而且childNodes读出来的长度会多1
this.fileObj.select();
if(document.selection){
var imgSrc=document.selection.createRange().text;
var image=new Image(); 
image.src=imgSrc; 
filesize=image.fileSize; 
if(judgeSize(image.fileSize/1024,this.maxImgSize)){
//IE下必须设置div的大小
var ele=document.createElement('div');
ele.style.width=width+'px';
ele.style.height=height+'px';
ele.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale,src='"+imgSrc+"')";
try{
this.picWrap.appendChild(ele);
}catch(e){
alert('你上传的图片格式有误,请重新选择!');
return false;
}
this.preview.style.display='none';
document.selection.empty();
}else{
alert('你上传的图片太大!');
}
}

至此,就完成啦!

用法:

<script type="text/javascript" src="../js/singlePic.js"></script>
<script>
var fileObj=document.getElementById('uploadBtn');
var preview=document.getElementById('preview');
var picWrap=document.getElementById('pic');
fileObj.onchange=function(){
var obj=new SetPreviewPic(fileObj,preview,picWrap,100);
//定义上传图片对象,参数分别为上传图片的input按钮、img标签包、裹着img的div、最大的单张照片的值,单位为KB
obj.uploadSinglePic(200,250);//单张图片上传,参数分别为每张的宽度、高度
// obj.uploadPics(200,250,2); //多张图片上传,参数分别为每张的宽度、高度、最多上传张数
}
</script>

以上所述是小编给大家介绍的JS上传图片预览插件制作(兼容到IE6)的相关知识,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
Javascript 判断 object 的特定类转载
Feb 01 Javascript
js form 验证函数 当前比较流行的错误提示
Jun 23 Javascript
ie支持function.bind()方法实现代码
Dec 27 Javascript
js转化毫秒为时间格式代码
Apr 10 Javascript
基于jquery实现简单的分页控件
Mar 17 Javascript
基于RequireJS和JQuery的模块化编程——常见问题全面解析
Apr 14 Javascript
基于$.ajax()方法从服务器获取json数据的几种方式总结
Jan 31 Javascript
Vue对象赋值视图不更新问题及解决方法
Jun 03 Javascript
微信小程序实现定位及到指定位置导航的示例代码
Aug 20 Javascript
JS扁平化输出数组的2种方法解析
Sep 17 Javascript
解决vue 子组件修改父组件传来的props值报错问题
Nov 09 Javascript
vue将data恢复到初始状态 &amp;&amp; 重新渲染组件实例
Sep 04 Javascript
JavaScript兼容性总结之获取非行间样式案例
Aug 07 #Javascript
jQuery调用Webservice传递json数组的方法
Aug 06 #Javascript
Google 地图API Map()构造器详解
Aug 06 #Javascript
Google 地图API资料整理及详细介绍
Aug 06 #Javascript
jquery自动补齐功能插件flexselect用法示例
Aug 06 #Javascript
Google 地图类型详解及示例代码
Aug 06 #Javascript
Google 地图控件集详解及实例代码
Aug 06 #Javascript
You might like
《斗罗大陆》六翼天使武魂最强,为什么老千家不是上三宗?
2020/03/02 国漫
PHP与SQL注入攻击[一]
2007/04/17 PHP
PHP 金额数字转换成英文
2010/05/06 PHP
php环境套包 dedeampz 伪静态设置示例
2014/03/26 PHP
php实现的DateDiff和DateAdd时间函数代码分享
2014/08/16 PHP
PHP去除字符串最后一个字符的三种方法实例
2017/03/01 PHP
PHP面向对象程序设计继承用法简单示例
2018/12/28 PHP
PhpSpreadsheet设置单元格常用操作汇总
2020/11/13 PHP
jQuery DOM操作小结与实例
2010/01/07 Javascript
Bootstrap安装环境配置教程分享
2016/05/27 Javascript
深入理解jQuery layui分页控件的使用
2016/08/17 Javascript
ajax +NodeJS 实现图片上传实例
2017/06/06 NodeJs
解决vue build打包之后首页白屏的问题
2018/03/06 Javascript
vue插件mescroll.js实现移动端上拉加载和下拉刷新
2019/03/07 Javascript
Vue循环中多个input绑定指定v-model实例
2020/08/31 Javascript
[05:36]DOTA2 2015国际邀请赛中国区预选赛第四日TOP10
2015/05/29 DOTA
django模型中的字段和model名显示为中文小技巧分享
2014/11/18 Python
Pythont特殊语法filter,map,reduce,apply使用方法
2016/02/27 Python
使用Python的Tornado框架实现一个Web端图书展示页面
2016/07/11 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
2018/09/04 Python
用Python读取几十万行文本数据
2018/12/24 Python
怀俄明州飞钓:Platte River Fly Shop
2017/12/28 全球购物
阿根廷票务网站:StubHub阿根廷
2018/04/13 全球购物
JustFab加拿大:女鞋、靴子、手袋和服装在线
2018/05/18 全球购物
夏威夷灵感服装及配饰:Reyn Spooner
2018/09/18 全球购物
大学生的创业计划书就该这么写
2014/01/30 职场文书
退伍老兵事迹材料
2014/01/31 职场文书
出生公证书样本
2014/04/04 职场文书
科学育儿宣传标语
2014/10/08 职场文书
2015年学生会主席工作总结
2015/04/21 职场文书
杨善洲观后感
2015/06/04 职场文书
2015年学校少先队工作总结
2015/07/20 职场文书
七年级话题作文之执着
2019/11/19 职场文书
MySQL 可扩展设计的基本原则
2021/05/14 MySQL
Python 线程池模块之多线程操作代码
2021/05/20 Python
Python 循环读取数据内存不足的解决方案
2021/05/25 Python