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)

    }

})

效果如下:

图片上传前预览效果

欢迎批评指正及优化!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。