jquery实现图片上传前预览效果(兼容ie8+浏览器)

功能介绍

如题,我们需要做的就是用jquery实现图片上传前预览效果,并兼容所有浏览器(ie8+及其他浏览器),可以控制上传图片的数量,对图片进行删除操作,ie10+浏览器及其他浏览器能够控制图片大小,至于ie10以下如何控制图片大小的问题,请大佬提点。

在上周,我以为我完成了这个功能,并兼容各浏览器,然鹅在昨晚,我将这个功能单拿出来整理,并在各浏览器版本下进行测试,发现了bug!在ie10浏览器下,图片预览为空白!

ie10下图片回显为空白

并且删除按钮无效。

先介绍一下图片回显使用到的方法:

● 对于 Chrome、Firefox、IE10+ 使用 file对象的url(window.URL.createObjectURL)来实现。

● 对于 IE6~9 使用滤镜 filter:progid:DXImageTransform.Microsoft.AlphaImageLoader 来实现。

判断IE版本

排除问题后发现是  document.all  的问题!它可以判断浏览器是否是IE ,经测试后,发现它可以判断IE10及以下的浏览器为IE,重点:把IE10算进去了。所以IE10  被派去用滤镜实现回显了(???)

if(document.all){ 

     alert("is IE!"); 

}  

所以解决办法是添加一个能够判断IE版本的方法(以IE10为分界),在删除和回显时都需要判断,以便使用不同的方法。

// 判断ie浏览器版本 以ie10为分界,ie10以下返回true,否则返回false

function IEVersion() {

    //取得浏览器的userAgent字符串

    var userAgent = navigator.userAgent;

    //判断是否IE浏览器

    var isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1;

    if (isIE) {

        var reIE = new RegExp("MSIE (\\d+\\.\\d+);");

        reIE.test(userAgent);

        var fIEVersion = parseFloat(RegExp["$1"]);

        if (fIEVersion < 10) { //IE10以下

            return true;

        }

    } else {

        return false;

    }

}


实现该功能

html

<div class="content">

    <input id="file" type="file" value="上传文件" class="input file" accept=".png, .jpeg, .gif, .jpg" multiple/>

    <a href="javascript:;" class="input select-tips" style="color:#999;">请选择本地文件...</a>

    <p class="gray">请选择jpg/jpeg/png/gif格式的图片,最多可以传五张图片,图片大小不超过 2 M。</p>

    <div class="pic" style="display:none;"> </div>

</div>

css

a{text-decoration: none;}.content{width: 400px;margin: 100px auto;}

.pic{margin: 80px 0 0 -9px;width: 400px;position: absolute;}

.preview{position: relative;display: inline-block;vertical-align: top;margin-left: 10px;width: 64px;height: 64px;background: #E1E6ED;text-align: center;}

.preview img{position: relative;z-index: 1;width: 100%;height: 100%;}

.preview a.del-img,.ie-img a.del-img{position: relative;margin-top: 75px;cursor: pointer;color: #7f7c77;font-size: 12px;}

.ie-img{position: relative;display: inline-block;vertical-align: top;margin-left: 10px;width: 64px;height: 64px;text-align: center;}

.ie-img a.del-img{display: block;margin-top: 72px;}

.ie-img a.del-img:hover,.preview a.del-img:hover{text-decoration: underline;}

.file{height: 26px;opacity: 0;opacity: 1\0;position: absolute;z-index: 10;cursor: pointer;}

.select-tips{display: inline-block;width: 200px;height: 26px;padding: 4px 5px;line-height: 26px;border: 1px solid rgb(217, 217, 217);border-radius: 2px;background-color: rgb(255, 255, 255);position: absolute;z-index: 1;color: #9c9c9c;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;font-size: 14px;}

.gray{color: #a9a9a9;width: 302px;margin: 40px 0 10px;line-height: 17px;font-size: 12px;position: absolute;}

.input{width: 255px;padding: 4px 15px;line-height: 26px;color: #3d3d3d;border: 1px solid #ccc;border-radius: 2px;background-color: #fff;}

js

// 判断ie浏览器版本 以ie10为分界,ie10以下返回true,否则返回false

function IEVersion() {

    //取得浏览器的userAgent字符串

    var userAgent = navigator.userAgent;

    //判断是否IE浏览器

    var isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1;

    if (isIE) {

        var reIE = new RegExp("MSIE (\\d+\\.\\d+);");

        reIE.test(userAgent);

        var fIEVersion = parseFloat(RegExp["$1"]);

        if (fIEVersion < 10) {

            return true;

        }

    } else {

        return false;

    }

}

//上传图片预览

var imgsNum = {"0":0,"1":0,"2":0,"3":0,"4":0,}

var filesArr = []

function previewImgs(files) {

    $(".pic .preview").remove();

    if(files.length == 0){

        $(".pic").hide();

    }else{

        $(".pic").show();

        for (var i = 0; i < files.length; i++) {

            var filesSrc = window.URL.createObjectURL(files[i]);

            $(".pic").append("<div class='preview' id='img"+(i)+"'><img src='"+filesSrc+"'><a class='del-img' data-imgnum='"+(i)+"'>删除</a></div>")

        }

    }

}

// 控制图片大小 ie10以下不支持

var checkSize = false;

function checkFileSize(files) {

    for (var i = 0; i < files.length; i++) {

        var fileSize = (files[i].size/(1024*1024)).toFixed(2);

        if (fileSize > 2) {

            alert("图片大小不能超过2M")

            checkSize = true;

        }

    }

}

//上传图片

$('#file').on("change",function() {

    // 判断是否为ie11以下浏览器

    if (IEVersion()){//ie10以下ie浏览器

        if (imgsNum[0] == 1&&imgsNum[1] == 1&&imgsNum[2] == 1&&imgsNum[3] == 1&&imgsNum[4] == 1) {

            alert("最多上传5张图片")

            return;

        }

        for (var key in imgsNum) {

            if (imgsNum[key] == 0) {

                $(".pic").show();

                this.select();

                this.blur();

                var imgSrc = document.selection.createRange().text;

                $(".pic").append('<div class="ie-img" id="'+key+'img" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true,sizingMethod=scale,src=\'' + imgSrc + '\'"><a class="del-img" data-imgnum="'+key+'">删除</a></div>')

                imgsNum[key] = 1;

                return;

            }

        }

    }else{//是ie10,ie11及其他浏览器

        checkFileSize(this.files);

        if (checkSize) {

            checkSize = false;

            return;

        }else{

            if(this.files.length > 0){

                var fileLen = this.files.length+filesArr.length

                if (fileLen > 5) {

                    alert("最多上传5张图片")

                }else{

                    for (var i = 0; i < this.files.length; i++) {

                        filesArr.push(this.files[i])

                    }

                    previewImgs(filesArr)

                }

            }

        }

    }   

})

//点击图片下的删除按钮

$(document).on("click",".del-img",function () {

    var imgnum = $(this).attr("data-imgnum")

    if (IEVersion()){

        imgsNum[imgnum] = 0;

        $("#"+imgnum+"img").remove();

    }else{

        filesArr.splice(imgnum , 1)

        previewImgs(filesArr)

    }

})

效果如下:

图片上传前预览效果

欢迎批评指正及优化!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352