<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        關于圖片的預加載過程中隱藏未知的_javascript技巧

        來源:懂視網 責編:小采 時間:2020-11-27 21:06:00
        文檔

        關于圖片的預加載過程中隱藏未知的_javascript技巧

        關于圖片的預加載過程中隱藏未知的_javascript技巧:看完了曼聯與曼城的同城德比,還有漫長的兩個小時,才能看到期待中的國家德比。無聊的很,左右無事,便來論壇閑逛。看到了一章關于圖片預加載的博文,其代碼如下: 代碼如下: function loadImage(url, callback) { var img = new Image(
        推薦度:
        導讀關于圖片的預加載過程中隱藏未知的_javascript技巧:看完了曼聯與曼城的同城德比,還有漫長的兩個小時,才能看到期待中的國家德比。無聊的很,左右無事,便來論壇閑逛。看到了一章關于圖片預加載的博文,其代碼如下: 代碼如下: function loadImage(url, callback) { var img = new Image(

        看完了曼聯與曼城的同城德比,還有漫長的兩個小時,才能看到期待中的國家德比。無聊的很,左右無事,便來論壇閑逛。看到了一章關于圖片預加載的博文,其代碼如下:
        代碼如下:
        function loadImage(url, callback) {
        var img = new Image(); //創建一個Image對象,實現圖片的預下載
        img.src = url;
        if (img.complete) { // 如果圖片已經存在于瀏覽器緩存,直接調用回調函數
        callback(img);
        return; // 直接返回,不用再處理onload事件
        }
        img.onload = function () { //圖片下載完畢時異步調用callback函數。
        callback(img);
        };
        };

        在網上搜索了一下相關文章,大體上都是這個思路。
        這個方法功能是ok的,但是有一些隱患。
        1 創建了一個臨時匿名函數來作為圖片的onload事件處理函數,形成了閉包。
        相信大家都看到過ie下的內存泄漏模式的文章,其中有一個模式就是循環引用,而閉包就有保存外部運行環境的能力(依賴于作用域鏈的實現),所以img.onload這個函數內部又保存了對img的引用,這樣就形成了循環引用,導致內存泄漏。(這種模式的內存泄漏只存在低版本的ie6中,打過補丁的ie6以及高版本的ie都解決了循環引用導致的內存泄漏問題)。

        2 只考慮了靜態圖片的加載,忽略了gif等動態圖片,這些動態圖片可能會多次觸發onload。
        要解決上面兩個問題很簡單,其實很簡單,代碼如下:
        代碼如下:
        img.onload = function () {
        //圖片下載完畢時異步調用callback函數。
        img.onload = null;
        callback(img); };

        這樣既能解決內存泄漏的問題,又能避免動態圖片的事件多次觸發問題。
        在一些相關博文中,也有人注意到了要把img.onload 設置為null,只不過時機不對,大部分文章都是在callback運行以后,才將img.onload設置為null,這樣雖然能解決循環引用的問題,但是對于動態圖片來說,如果callback運行比較耗時的話,還是有多次觸發的隱患的。
        隱患經過上面的修改后,就消除了,但是這個代碼還有優化的余地:
        代碼如下:
        if (img.complete) {
        // 如果圖片已經存在于瀏覽器緩存,直接調用回調函數
        callback(img);
        return; // 直接返回,不用再處理onload事件
        }

        關于這段代碼,看相關博文里的敘述,原因如下:
        經過對多個瀏覽器版本的測試,發現ie、opera下,當圖片加載過一次以后,如果再有對該圖片的請求時,由于瀏覽器已經緩存住這張圖片了,不會再發起一次新的請求,而是直接從緩存中加載過來。對于 firefox和safari,它們試圖使這兩種加載方式對用戶透明,同樣會引起圖片的onload事件,而ie和opera則忽略了這種同一性,不會引起圖片的onload事件,因此上邊的代碼在它們里邊不能得以實現效果。

        確實,在ie,opera下,對于緩存圖片的初始狀態,與firefox和safari,chrome下是不一樣的(有興趣的話,可以在不同瀏覽器下,測試一下在給img的src賦值緩存圖片的url之前,img的狀態),但是對onload事件的觸發,卻是一致的,不管是什么瀏覽器。產生這個問題的根本原因在于,img的src賦值與 onload事件的綁定,順序不對(在ie和opera下,先賦值src,再賦值onload,因為是緩存圖片,就錯過了onload事件的觸發)。應該先綁定onload事件,然后再給src賦值,代碼如下:
        代碼如下:
        function loadImage(url, callback) {
        var img = new Image(); //創建一個Image對象,實現圖片的預下載
        img.onload = function(){
        img.onload = null;
        callback(img);
        }
        img.src = url;
        }
        這樣內存泄漏,動態圖片的加載問題都得到了解決,而且也以統一的方式,實現了callback的調用。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        關于圖片的預加載過程中隱藏未知的_javascript技巧

        關于圖片的預加載過程中隱藏未知的_javascript技巧:看完了曼聯與曼城的同城德比,還有漫長的兩個小時,才能看到期待中的國家德比。無聊的很,左右無事,便來論壇閑逛。看到了一章關于圖片預加載的博文,其代碼如下: 代碼如下: function loadImage(url, callback) { var img = new Image(
        推薦度:
        標簽: 圖片 加載 js
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 丁香花免费完整高清观看| 99热精品在线免费观看| 日韩免费高清一级毛片在线| 亚洲人成激情在线播放| 69av免费视频| 亚洲精品亚洲人成在线播放| 日本XXX黄区免费看| 亚洲色无码专区一区| 永久免费看mv网站入口| 黄页网站在线观看免费| 国产黄色一级毛片亚洲黄片大全| yellow免费网站| 国产亚洲成AV人片在线观黄桃| 免费国产成人18在线观看| 亚洲网站视频在线观看| 久久久久久99av无码免费网站 | 成人永久免费福利视频网站| 亚洲人成电影网站色www| 亚洲国产日韩在线观频| 国产一级一毛免费黄片| 亚洲人成网址在线观看| 国产精品酒店视频免费看| 精品久久亚洲一级α| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 国产亚洲美女精品久久久久| 国产免费131美女视频| 一级毛片免费毛片毛片| 久久精品国产亚洲香蕉| 成人毛片手机版免费看| 午夜在线亚洲男人午在线| 亚洲精品成人无码中文毛片不卡| 97在线视频免费| 国产成人亚洲精品无码AV大片| 亚洲愉拍99热成人精品热久久 | 性做久久久久免费看| 手机看片国产免费永久| 亚洲av无码不卡久久| 久久精品国产亚洲精品| 999国内精品永久免费观看| 曰批全过程免费视频免费看| 中文字幕亚洲第一在线|