JS圖片上傳預覽

劃水摸魚的時候研究了JS圖片的上傳預覽,分別是FileReader()独撇、createObjectURL(),在此分享一下!
效果圖:


圖片上傳預覽
點擊放大按鈕
/********** 引用的CSS **********/
<link  rel="stylesheet">

/********** CSS **********/
<style>
    *{
        padding: 0;
        margin: 0;
    }
    .imgDiv{
        margin: 20px 0 0 20px;
        width: 300px;
        height: 200px;
        border: 1px solid #666;
    }
    .imgDiv:hover{
        background-color: #F6F6F8;
    }
    #upImage{
        position: absolute;
        top: 20px;
        left: 20px;
        opacity: 0;
        cursor: pointer !important;
        width: 300px;
        height: 200px;
        opacity: 0;
    }
    .memo{
        text-align: center;
        margin-top: 70px; 
    }
    .memo>p{
        line-height: 20px;
    }
    .memo .plus{
        font-size: 40px;
        color: #666;
        text-align: center;
    }
    .memo .upText{
        text-align: center;
    }
    .preview{
        text-align: center;
    }
    .preview img{
        height: 198px;
    }
    .otherIcon{
        position: absolute;
        z-index: 10;
        left: 274.5px;
        top: 20.5px;
        cursor: pointer;
    }
    .otherIcon .conIcon{
        padding: 2px;
        background-color: #808080;
        opacity: 0.8;
        color: white;
        font-size: 16px;
        width: 20px;
        height: 20px;
    }
    .otherIcon .conIcon:hover{
        opacity: 1;
    }
</style>

/********** HTML **********/
<div class="imgDiv">
    <div class="memo">
        <p class="plus">+</p>
        <p class="upText">點擊上傳圖片</p>
    </div>
    <input type="file" id="upImage" onchange="changeImg(this)" accept="image/*">
</div>

/********** 引用的JS **********/
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.12.1/jquery.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>

FileReader():

/****** FileReader方法 ******/
function upImage(){
    var fr = new FileReader();
    var imgFile = document.getElementById("upImage").files[0];
    if (imgFile.size > 1024 * 500 * 1){
        return alert("上傳圖片不能超過500KB");
    }
    if (imgFile.type != "image/png" && imgFile.type != "image/jpeg" && imgFile.type != "image/gif"){
        return alert("上傳圖片格式不正確");
    }
    fr.readAsDataURL(imgFile);
    fr.onload = function(){
        $(".imgDiv").html(
            '<div class="preview"><img id="imgPreview" src="' + this.result + '" alt=""></div>' +
            '<div class="otherIcon" style="display:none">' +
                '<span class="glyphicon glyphicon-remove conIcon" onclick="delIcon()" title="刪除圖片"></span>' +
                '<span>&nbsp;</span>' +
                '<span class="glyphicon glyphicon-zoom-in conIcon" onclick="magnifyIcon()" title="放大圖片"></span>' +
            '</div>'
        )
        $(".imgDiv").after(
            '<div class="modal fade" id="magnifyModal" tabindex="-1" role="dialog">' +
                '<div class="modal-dialog modal-lg" role="document">' +
                    '<div class="modal-content"></div>' +
                '</div>' +
            '</div>'
        );
    } 
}

createObjectURL():

/***** createObjectURL方法 *****/
function changeImg(obj) {
    var imgSize = obj.files[0].size;
    if (imgSize > 1024 * 500 * 1) {
        return alert("上傳圖片不能超過500KB");
    };
    if (obj.files[0].type != 'image/png' && obj.files[0].type != 'image/jpeg' && obj.files[0].type != 'image/gif') {
        return alert("上傳圖片格式不正確");
    };
    var imgSrc = getObjectURL(obj.files[0]);
    $(".imgDiv").html(
        '<div class="preview"><img id="imgPreview" src="' + imgSrc + '" alt=""></div>' +
        '<div class="otherIcon" style="display:none">' +
            '<span class="glyphicon glyphicon-remove conIcon" onclick="delIcon()" title="刪除圖片"></span>' +
            '<span>&nbsp;</span>' +
            '<span class="glyphicon glyphicon-zoom-in conIcon" onclick="magnifyIcon()" title="放大圖片"></span>' +
        '</div>'
    );
    $(".imgDiv").after(
        '<div class="modal fade" id="magnifyModal" tabindex="-1" role="dialog">' +
        '<div class="modal-dialog modal-lg" role="document">' +
        '<div class="modal-content"></div>' +
            '</div>' +
        '</div>'
    );
}

//建立可存取到該file的url
function getObjectURL(file) {
    var url = null;
    //下面函數(shù)執(zhí)行效果是一樣的艇棕,只是針對不同的瀏覽器執(zhí)行不同的js函數(shù)而已
    if (window.createObjectURL != undefined) { //basic
        url = window.createObjectURL(file);
    } else if (window.URL != undefined) { //mozilla(firefox)
        url = window.URL.createObjectURL(file);
    } else if (window.webkitURL != undefined) { //webkit or chrome
        url = window.webkitURL.createObjectURL(file);
    }
    return url;
}

其他所需方法:

//鼠標hover顯示刪除和放大圖片
$(function () {
    $(".imgDiv").mouseenter(function () {
        $(".otherIcon").css("display", "block");
    })
    $(".imgDiv").mouseleave(function () {
        $(".otherIcon").css("display", "none");
    })
})

//刪除圖片
function delIcon() {
    $(".imgDiv").html(
        '<div class="memo">' +
            '<p class="plus">+</p>' +
            '<p class="upText">點擊上傳圖片</p>' +
        '</div>' +
        '<input type="file" id="upImage" onchange="upImage()" accept="image/*">'
    );
    $("#magnifyModal").remove();
}

//放大圖片
function magnifyIcon() {
    var magnifyImgSrc = document.getElementById('imgPreview').src;
    $("#magnifyModal .modal-content").html('<div style="text-align:center"><img style="height:500px" src="' + magnifyImgSrc + '" alt=""><div>');
    $("#magnifyModal").modal("show");
}

對比:

名稱 FileReader createObjectURL
兼容性 IE10及以上 IE10及以上
執(zhí)行機制 異步執(zhí)行(宏任務 - 回調(diào)方式) 同步執(zhí)行
返回值 獲取一段data:base64的字符串 獲取當前文件的一個內(nèi)存URL
內(nèi)存使用 FileReader.readAsDataURL返回文件的base64字符串,比blob url消耗更多內(nèi)存串塑,但是在不用的時候會自動從內(nèi)存中清除(通過垃圾回收機制) createObjectURL返回一段帶hash的url沼琉,并且一直存儲在內(nèi)存中,直到document觸發(fā)了unload事件(例如:document close)或者執(zhí)行revokeObjectURL來釋放
使用場景 如果不太在意設備性能問題桩匪,并想獲取圖片的base64打瘪,則推薦使用FileReader.readAsDataURL 使用createObjectURL可以節(jié)省性能并更快速,只不過需要在不使用的情況下手動釋放內(nèi)存

總結(jié):FileReader()和createObjectURL()均不支持IE10以下的瀏覽器傻昙,從性能優(yōu)化角度來說闺骚,createObjectURL()可能相對較好

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市妆档,隨后出現(xiàn)的幾起案子僻爽,更是在濱河造成了極大的恐慌,老刑警劉巖贾惦,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胸梆,死亡現(xiàn)場離奇詭異,居然都是意外死亡纤虽,警方通過查閱死者的電腦和手機乳绕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逼纸,“玉大人洋措,你說我怎么就攤上這事〗芄簦” “怎么了菠发?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贺嫂。 經(jīng)常有香客問我滓鸠,道長,這世上最難降的妖魔是什么第喳? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任糜俗,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘悠抹。我一直安慰自己珠月,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布楔敌。 她就那樣靜靜地躺著啤挎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卵凑。 梳的紋絲不亂的頭發(fā)上庆聘,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音勺卢,去河邊找鬼伙判。 笑死,一個胖子當著我的面吹牛值漫,可吹牛的內(nèi)容都是我干的澳腹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼杨何,長吁一口氣:“原來是場噩夢啊……” “哼酱塔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起危虱,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤羊娃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后埃跷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蕊玷,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年弥雹,在試婚紗的時候發(fā)現(xiàn)自己被綠了垃帅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡剪勿,死狀恐怖贸诚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情厕吉,我是刑警寧澤酱固,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站头朱,受9級特大地震影響运悲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜项钮,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一班眯、第九天 我趴在偏房一處隱蔽的房頂上張望希停。 院中可真熱鬧,春花似錦鳖敷、人聲如沸脖苏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至恃鞋,卻和暖如春崖媚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恤浪。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工畅哑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人水由。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓荠呐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親砂客。 傳聞我的和親對象是個殘疾皇子泥张,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • URL.createObjectURL()靜態(tài)方法會創(chuàng)建一個 DOMString。其中包含一個表示參數(shù)中給出的對象...
    明月半倚深秋_f45e閱讀 195評論 0 1
  • 一鞠值、需求 (1)點擊圖片 Icon媚创,出現(xiàn)文件上傳框,選擇圖片彤恶;(2)驗證圖片類型及大小钞钙,本地預覽的同時上傳到服務器...
    一個笑點低的妹紙閱讀 2,180評論 1 3
  • 瀏覽器廠商不同,實現(xiàn)某種特定功能需要進行兼容處理声离,如圖片預覽芒炼,主流瀏覽器支持html5 FileReader,但是...
    Veb閱讀 748評論 1 7
  • index js圖片上傳預覽兼容寫法 __veblen 瀏覽器廠商不同术徊,實現(xiàn)某種特定功能需要進行兼容處理本刽,如圖片預...
    veb001閱讀 891評論 0 3
  • 項目中碰到一個需求,上傳圖片及時給用戶預覽弧关。開始的想法就是上傳的圖片先傳遞到后臺盅安,在通過ajax獲取圖片路徑顯示到...
    daixi859閱讀 497評論 0 0