圖片加載事件

最近有一個在頁面中的圖片加載完成后執(zhí)行某些操作的需求摹菠,那么應(yīng)該如何判斷頁面中的圖片是否加載完成呢?

圖片加載事件

圖片的加載分為兩種情況:

  • 動態(tài)加載(JS生成)

  • 非動態(tài)加載(html生成)

非動態(tài)加載

對于非動態(tài)加載的圖片铐懊,直接使用window.onload,在網(wǎng)頁中所有內(nèi)容加載完畢后執(zhí)行操作即可远荠。

jquery中還有一個$(document).ready() 方法胚鸯,簡要介紹一下二者的區(qū)別旁涤。

事件屬性 window.onload $(document).ready()
執(zhí)行時機 必須等待網(wǎng)頁中所有的內(nèi)容加載完畢后(包括圖片) 網(wǎng)頁中所有DOM結(jié)構(gòu)繪制完畢后就執(zhí)行碉咆,可能DOM元素關(guān)聯(lián)的東西并沒有加載完
編寫個數(shù) 不能同時編寫多個伙菊,后面綁定的事件會覆蓋前面的 能同時編寫多個
簡化寫法 $(function() { //... })
其他 原生方法败玉,jquery中可寫作$(window).load jquery方法

注:IE8及以下不支持onload事件,但支持onreadystatechange事件镜硕,有兼容性需要的可以使用該方法运翼,這里就不展開了。

動態(tài)加載

對于動態(tài)加載的圖片兴枯,可以使用img標(biāo)簽的onload事件血淌,原生實現(xiàn)如下:

var img = new Image()
img.onload = function() {
    //...
}
img.src = 'xxx.jpg'

這里注意圖片的src要寫在onload事件之后,如果先賦值src财剖,瀏覽器會去異步加載src中的值悠夯,這個異步過程可能在onload之前就完成了,例如圖片緩存躺坟、js阻塞沦补、圖片很小等等原因,那么onload事件將不會執(zhí)行咪橙。將src寫在onload之后策彤,可以保證異步過程在onload賦值完成后才開始進行栓袖,保證能夠正確監(jiān)聽到onload事件。

jquery實現(xiàn):

$('<img/>').on('load', function() {
   $(this).remove();
   //...
}).attr('src', 'xxx.jpg');

onload事件中使用$(this)來對生成的img進行操作店诗。

ES6實現(xiàn):

new Promise((resolve, reject) => {
    let img = new Image()
    img.onload = function(){
       resolve(img)
    }
    img.src = 'xxx.jpg'
}).then((img) => {
    //...
})

多張圖片ES6實現(xiàn):

let images = [
    'xxx1.jpg',
    'xxx2.jpg',
    'xxx3.jpg'
];
let promises = [], 
    img = [], 
    imgCount = images.length;
for(let i = 0 ; i < imgCount ; i++){
    promises[i] = new Promise((resolve, reject)=>{
        img[i] = new Image()
        img[i].onload = function(){
             resolve(img[i])
        }
        img[i].src = images[i]
    })
}
Promise.all(promises).then((img)=>{
    //...
})

利用Promise.all在所有圖片都加載完成時執(zhí)行相應(yīng)操作。

鏈接失效

一個站點可能會有很多圖片音榜,假如某個圖片鏈接失效了庞瘸,那么上面代碼中的Promise.all也就無法成功執(zhí)行,如何避免這種情況呢赠叼?

可以利用onerror事件來設(shè)置鏈接失效時執(zhí)行的操作擦囊,例如隱藏圖片或者重新設(shè)置一個圖片:

$('img').on('error', function() {
    //設(shè)置提示錯誤的圖片
    $(this).attr('src', 'error.jpg')
})

假如這個新設(shè)置的圖片鏈接也失效了,那么瀏覽器將會對同一個錯誤鏈接一直發(fā)送請求嘴办,陷入死循環(huán)瞬场,可以改用one來綁定error事件,這樣error事件對于該img元素只會運行一次涧郊,不會陷入死循環(huán)贯被。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市妆艘,隨后出現(xiàn)的幾起案子彤灶,更是在濱河造成了極大的恐慌,老刑警劉巖批旺,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幌陕,死亡現(xiàn)場離奇詭異,居然都是意外死亡汽煮,警方通過查閱死者的電腦和手機搏熄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來暇赤,“玉大人心例,你說我怎么就攤上這事◆嶙浚” “怎么了契邀?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長失暴。 經(jīng)常有香客問我坯门,道長,這世上最難降的妖魔是什么逗扒? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任古戴,我火速辦了婚禮,結(jié)果婚禮上矩肩,老公的妹妹穿的比我還像新娘现恼。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布叉袍。 她就那樣靜靜地躺著始锚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喳逛。 梳的紋絲不亂的頭發(fā)上瞧捌,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音润文,去河邊找鬼姐呐。 笑死,一個胖子當(dāng)著我的面吹牛典蝌,可吹牛的內(nèi)容都是我干的曙砂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼骏掀,長吁一口氣:“原來是場噩夢啊……” “哼鸠澈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起砖织,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤款侵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后侧纯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體新锈,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年眶熬,在試婚紗的時候發(fā)現(xiàn)自己被綠了妹笆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡娜氏,死狀恐怖拳缠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贸弥,我是刑警寧澤窟坐,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站绵疲,受9級特大地震影響哲鸳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盔憨,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一徙菠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧郁岩,春花似錦婿奔、人聲如沸缺狠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挤茄。三九已至,卻和暖如春记餐,著一層夾襖步出監(jiān)牢的瞬間驮樊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工片酝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挖腰。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓雕沿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親猴仑。 傳聞我的和親對象是個殘疾皇子审轮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

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

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準辽俗。 注意:講述HT...
    kismetajun閱讀 27,445評論 1 45
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,090評論 1 32
  • 用兩張圖告訴你疾渣,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,699評論 2 59
  • 上周的今天崖飘,也就是2015年5月9號榴捡,我光榮地大學(xué)畢業(yè)了,5月11號便搬來了心心念念的洛杉磯開始了這一年的OPT朱浴。...
    RoseSniffer8閱讀 472評論 0 1
  • 全世界的茶源自于中國吊圾,早在清朝時期,中國的茶葉就通過歐洲東印度公司的商船一批批運往西方翰蠢。 史料顯示项乒,東印度公司當(dāng)時...
    少女愛旅游閱讀 524評論 2 2