亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

javascript預加載圖片、css、js的方法示例介紹

2019-11-20 21:53:45
字體:
來源:轉載
供稿:網友

預加載的好處可以讓網頁更快的呈現給用戶,缺點就是可能會增加無用的請求(但圖片、css、js這些靜態文件可以被緩存),如果用戶訪問的頁面里面的css、js、圖片被預加載了,用戶打開頁面的速度會快很多,提升用戶體驗。在用到一些大圖片展示的時候,預加載大圖是很不錯的方法,圖片更快的被呈現給用戶。不多說了,作為一個前端攻城師都懂的,下面分享我做的測試和得到的結果。

先說需要知道的服務器返回的status code:
status-code: 200 - 客戶端請求成功
status-code: 304 - 文件已經在瀏覽器緩存中,服務器告訴客戶端,原來緩沖的文檔還可以繼續使用。
本文測試判斷文件被是否被緩存,用的就是判斷是否返回304.

下面針對預加載的幾個方法,在不同的瀏覽器下加載img/js/css做個測試,主要包括new Image()、object、iframe。以下加載測試的js、css、圖片文件,是從幾個門戶網站找的(為啥找幾個?是為了盡可能滴測試到特殊的情況,測試中還真遇到了)。
1、測試用new Image()預加載
1.1、new Image()加載

復制代碼 代碼如下:

    new Image().src = 'http://img02.taobaocdn.com/tps/i2/T1iQhUXnxpXXXXXXXX-171-48.png'; //淘寶
    new Image().src = 'http://static.paipaiimg.com/module/logo/logo_2011_02_22.png'; //拍拍
    new Image().src = 'http://co.youa.baidu.com/picture/services/images/logo.png'; //有啊
    new Image().src = 'http://img1.t.sinajs.cn/t35/style/images/common/header/logoNew_nocache.png'; //新浪*/

然后再把圖片添加到頁面內:<img src="xxx" />

加載圖片沒啥好說的,IE6-9/CM/FF/OP/都返回304,預加載成功。
1.2、測試用new Image()加載css

復制代碼 代碼如下:

    new Image().src = 'http://a.tbcdn.cn/p/global/1.0/global-min.css'; //淘寶(1)
    new Image().src = 'http://static.paipaiimg.com/member/activate.css'; //拍拍(2)
    new Image().src = 'http://co.youa.baidu.com/picture/services/base.css'; //有啊(3)
    new Image().src = 'http://img1.t.sinajs.cn/t35/skin/skin_008/skin.css'; //新浪(4)
    // http://auto.sina.com.cn/css/newstyles.css
    // 可以用這個測試IE下Expires設置的時間小于當前時間的情況

再把css添加到頁面內

這個有區別了:
CM/OP,都返回304(無論有沒有設置Expires)。
FF, 全部返回了200。
IE,1/2/4都返回304,而3返回200。對比返回的HTTP-Header可以發現:1/2/4都設置了Expires過期時間,而3沒有設置。
說明IE下緩存需要設置Expires(并且設置的時間要大于當前時間),而FF不支持利用new Image()預加載。
1.3、測試用new Image()加載js

復制代碼 代碼如下:

    new Image().src = 'http://a.tbcdn.cn/s/kissy/1.1.6/kissy-min.js'; //淘寶(1)
    new Image().src = 'http://static.paipaiimg.com/js/pp.noticeBoard.js'; //拍拍(2)
    new Image().src = 'http://co.youa.baidu.com/picture/services/cms_core.js'; //有啊(3)
    new Image().src = 'http://js.t.sinajs.cn/t35/miniblog/static/js/top.js'; //新浪(4)
    new Image().src = 'http://shop.qq.com/act/static/week/fri/bang/day_1_p_0_10.js'; //QQ(5)

再把js添加到頁面內。

CM/OP,都返回304
FF,只有5返回了304,也只有5的HTTP-Header最簡單(包括:Date、Server、Expires、Cache-Control)。
另外幾個的響應頭信息內容都比較多,但也都設置了5里面的這幾個。找規律,發現另外幾個的響應頭都有:Content-Type:text/javascript,而5里面沒這個。
IE,2/5返回了304,1/3/4返回200,對比響應頭,應該還是Content-Type影響的,IE里面2/5都沒看到Content-Type。
另外,感謝AndrewZhang(http://www.cnblogs.com/AndyWithPassion/)提到,IE下 image 預加載js在httpwatch下查看content,資源的加載并不是完整的。我這里測試也是如此。貌似有字節限制,測試中2返回的是完整的,5有一部分內容丟失了。所以用new Image加載JS一點都不可取。

這里總結下:預加載圖片用new Image()兼容性沒問題。但是css/js只有OP/CM可以,IE/FF基本是無效(這點IE/FF到挺有默契)。
2、測試用object預加載

    var doc = document,
            obj = doc.createElement('object');
            //obj.data = '123.js'; //Ps: 這樣寫OP下無效(會把data的內容作為object標簽里的text node)
            //obj.setAttribute('data', '123.js'); // img、css、js
            obj.style.cssText = 'position:absolute;top:-1px;width:1px;height:1px;';
            // obj.style.width = obj.style.height = 0;
            doc.body.appendChild(obj); // 插入object 標簽需要插入到非head部分,以觸發加載*/
            //obj.onload = function(){ alert('loaded') }; // FF/OP/Webkit支持(如果data是圖片,IE9也可以)

然后再吧object里面data加載的文件,創建標簽加到HTML內測試。

測試結果:
FF/OP/CM: 無論是img/js/css,都返回304。
IE6-8:用object加載img/js/css,會直接Aborted。
IE9比較特殊:
IE9加載js/css,先請求并返回HTTP200,再請求并Aborted,這里實際上是請求1次(第2次Aborted了)。
IE9加載img的情況,先請求并返回HTTP200,再請求返回圖片,所以圖片需要請求2次。

IE9的第1次請求返回的內容是空的(并且此時瀏覽器一般會卡住,或者直接失去響應)。 IE9首先會請求url,獲取文件類型,判斷是JS/CSS就Aborted,判斷是圖片才加載。

至于IE9第1次請求,大概是靠讀取HTTP頭信息來得到文件類型,或者偷偷把文件下載下來,然后在沙盒里面測試文件類型。
一個有意思的事情,比如用object加載JS,IE9有時也能加載進來,也就是第1個請求沒判斷出文件是JS(想看到這個要看運氣了,貌似網速慢的時候可能發生)

據說以前IE是靠文件后綴來判斷文件類型的,后期用HTTP頭信息來判斷,而他們都可以偽造,所以object在IE下存在安全問題。
IE6/7,如果文件后綴后綴為.js/.css不會發出請求,如果改成http://xxx/test.js?123.png,就發送請求了,然后用script標簽引入,發現可被緩存(css這樣搞也OK^^)。
IE8,后綴為js/css也不會發出請求,改后綴為png可以發出請求并得到內容,然后頁面創建標簽引入,文件并沒有被緩存。但如果文件是真正的圖片就被緩存了。
題外話:通過上面可以發現,隨著IE的升級,安全性也越來越高了。

So,這里的結論是:FF/OP/CM下可以用object預加載,IE就千萬別用了。
3、測試用iframe預加載

先創建頁面a.html,然后加上下面的js。

復制代碼 代碼如下:

    var doc = document,
            ifm = doc.createElement("iframe");
            //ifm.id="preLoadIfm";
            // ifm.style.border = ifm.width = ifm.height = 0;
            ifm.style.cssText = 'position:absolute;top:-10px;border:0;width:1px;height:1px;';
            ifm.scrolling = "no";
            doc.body.appendChild(ifm);
    window.onload = function(){ // 預加載當然最好是window.onload之后觸發
            //要觸發onload,需要先appendChild,然后再寫onload(如果順序顛倒,IE下不能觸發)
            // ifm.onload = function(){ alert('ifm loaded'); }
            // contentWindow.document-所有都支持,contentDocument-IE9/FF/OP/CM支持
            var ifmDoc = ifm.contentDocument || ifm.contentWindow.document;
            ifmDoc.open();
            ifmDoc.write('<!doctype><html><head></head><body>');
            //ifmDoc.write('<style>html{background:#000;color:#fff}</style>'); // 用于測試
            //ifmDoc.write('<script>alert("a")<//script>'); // 用于測試
            //ifmDoc.write('<p>test</p><p>test</p><p>test</p><p>test</p><p>test</p>');// 用于測試
            // 開始加載
            ifmDoc.write('<link rel="stylesheet" href="http://localhost/123.css?2011" />');
            ifmDoc.write('<script defer src="http://localhost/123.js?2011"><//script>'); //不加defer,你會發現IE卡死。。
            ifmDoc.write('<img width="1" height="1" src="http://localhost/123.png?2011" />');
            ifmDoc.write('</body></html>');
            ifmDoc.close();
    };

然后創建新頁面b.html,把要上面預加載的文件加到html里面,測試是否已經預加載。
結果:IE/FF/OP/CM都成功預加載。

需要說明的是:當打開a.html后,再刷新頁面后,iframe內加載文件的情況。
FF,返回200(注意,這個200不是服務器返回的200,是請求緩存成功。因為發送請求的時間顯示的是0)。
CM,顯示狀態是(from cache).
OP,雖然顯示狀態是n/a,但是也是from cache。 IE,IE自帶的調試工具顯示304,HttpWatch顯示from cache。

測試環境:
WIN7 EN SP1:OP 11.50、IE7-9、FF 3.6/6.0、Chrome 10
XP EN SP3:IE6
XP EN SP3:IE7
XP CN SP3:IE8
工具:IE9自帶的調試工具、HttpWatch、firebug、chrome自帶的調試工具、Opera Dragonfly。

最后得出的結論:js預加載圖片使用new Image()基本夠用了。但是css、js特殊一些,使用object需要判斷瀏覽器。如果考慮到js、css、img都能兼容實現預加載,可以考慮使用iframe。

另外,上面的方法創建iframe后,不使用write()寫入要加載的文件,直接設置iframe.src = "cache.html",然后把要預加載的文件寫在cache.html內也是可行的(以前看過有文章介紹新浪微博是這樣做的,但是文章地址找不到了,搜索也沒搜到),cache的網址我收藏了:http://tjs.sjs.sinajs.cn/miniblog2/static/html/cache.html,但是看微博的首頁沒找到這個,不知道在哪個頁使用的。
其他預加載的一點補充

doc.createElement('script') 可以預加載js,如果js里面有對頁面的操作,就會對頁面產生影響。
doc.createElement('link') 可以預加載css,但是對當前頁面的樣式也可能會有影響。
所以這樣預加載不太可取。
用ajax加載img/js/css,兼容性不錯,文件可以被緩存,但是只能限制同域,所以使用范圍有限。
預加載圖片還可以利用CSS的背景圖片實現。牛人lifesinger之前寫過關于圖片的HTTP請求的文章,不過他博客以前的數據沒了。網上搜索到一篇://www.49028c.com/web/110275.html。 文章里面提到了用背景圖和隱藏的img標簽來預加載,調理很清晰。也可以作為參考。

另外,模仿新浪的cache.html自己寫了個,如果喜歡把iframe作為獨立文件使用的可以作為參考。

復制代碼 代碼如下:

    <!DOCTYPE html><html><head><meta charset="utf-8"></head><body>
    <script>
    //usage: cache.html?v=123
    var win = window,
            doc = document,
            head = doc.getElementsByTagName("head")[0],
            getQuery = function(){
                    var ret = {},
                            sch = win.location.search,
                            arr,
                            tmp;
                    if (sch) {
                            sch = sch.substr(1);
                            arr = sch.split("&");
                            for(var i = 0, j = arr.length; i < j; i++) {
                                    tmp = arr[i].split('=');
                                    ret[tmp[0]] = tmp[1];
                            }
                    }
                    return ret;
            },
            version = getQuery().v || '';
    win.onerror = function(){return true}; //屏蔽js錯誤提示
    win.onload = function(){
            var b = doc.createElement("script");
            b.src = 'http://xx/1.js?v=' + version;
            head.appendChild(b);
            //...
    };
    doc.write('<link rel="stylesheet" href="http://xxx/3.css?version=' + version + '" //>');
    </script>
    <img src="http://xxx/4.png" />
    </body></html>

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
7777kkkk成人观看| 国产视频精品xxxx| 亚洲高清av在线| 欧美在线视频在线播放完整版免费观看| 日韩网站在线观看| 亚洲精品福利在线| 日韩福利视频在线观看| 国产精品手机播放| 欧美孕妇孕交黑巨大网站| 国产成人中文字幕| 国产福利精品av综合导导航| 久久久久久久国产| 国产欧美精品xxxx另类| 国产视频亚洲视频| 一本一本久久a久久精品综合小说| 麻豆成人在线看| 日韩高清免费观看| 欧美精品一本久久男人的天堂| 欧美精品一区二区三区国产精品| 国产日韩换脸av一区在线观看| 精品亚洲一区二区三区| 国产69精品久久久久9| 欧美尺度大的性做爰视频| 欧美激情亚洲另类| 高潮白浆女日韩av免费看| 精品久久久久久久中文字幕| 久久99国产综合精品女同| www.国产一区| 色综久久综合桃花网| 国产精品久久久久高潮| 国产一区二区美女视频| 色偷偷亚洲男人天堂| 久久久91精品国产| 国产精品高潮在线| 国产精品久久久久久久久久99| 91啪国产在线| 国产国语刺激对白av不卡| 高清在线视频日韩欧美| 亚洲天堂男人天堂女人天堂| 97视频网站入口| 国产精品丝袜久久久久久高清| 激情久久av一区av二区av三区| 高清欧美性猛交xxxx黑人猛交| 亚洲欧美成人精品| 一区二区三区黄色| 亚洲天堂日韩电影| 国产精品久久久91| 欧美孕妇性xx| 亚洲欧美在线一区| 欧美激情一区二区三区高清视频| 国产精品久久久久久久久久尿| 91av在线精品| 97热在线精品视频在线观看| 精品福利在线视频| 黄色成人av网| 欧美日韩福利电影| 国产成人拍精品视频午夜网站| 夜夜躁日日躁狠狠久久88av| 色综合久久天天综线观看| 中文字幕久久久av一区| 亚洲美女视频网站| 久久免费视频在线| 亚洲在线视频福利| 欧美成人精品在线观看| 久久久久久亚洲精品| 欧美疯狂做受xxxx高潮| 国自产精品手机在线观看视频| 亚洲欧洲在线免费| 久久影视电视剧凤归四时歌| 亚洲精品美女久久| 欧美乱妇高清无乱码| 亚洲精品国产精品乱码不99按摩| 大桥未久av一区二区三区| 国产午夜精品一区理论片飘花| 亚洲欧美日韩另类| 国产精品日韩专区| 日韩麻豆第一页| 久久精品夜夜夜夜夜久久| 欧美色视频日本版| 91精品国产网站| 欧美乱大交做爰xxxⅹ性3| 成人亚洲综合色就1024| 午夜精品一区二区三区在线视频| 亚洲成色777777在线观看影院| 国产大片精品免费永久看nba| 51久久精品夜色国产麻豆| 中文字幕在线观看亚洲| 欧美激情网站在线观看| 精品国产区一区二区三区在线观看| 91精品国产91久久久久| 国产免费一区二区三区香蕉精| 国产z一区二区三区| 欧美亚洲国产另类| 亚洲国产天堂久久综合网| 亚洲精品按摩视频| 97avcom| 亚洲九九九在线观看| 97视频在线观看视频免费视频| 欧美一区二区三区……| 欧美日韩精品在线播放| 欧美成aaa人片在线观看蜜臀| 96sao精品视频在线观看| 国产精品一区二区久久精品| 国产精品久久久91| 久久九九亚洲综合| 国产精品亚洲片夜色在线| 91嫩草在线视频| 欧美大片在线免费观看| 久久精品视频在线| 欧美激情在线一区| 国产区精品视频| 欧美另类极品videosbestfree| 日本道色综合久久影院| 国产成人精品久久二区二区| 国产精品视频播放| 热99精品只有里视频精品| 美女视频黄免费的亚洲男人天堂| 成人精品在线视频| 亚洲欧美日韩国产中文| 国产精品美女久久久久久免费| 亚洲国产精品va在线观看黑人| 亚洲精品国偷自产在线99热| 色无极影院亚洲| 国产精品久久久久久搜索| 国产美女久久精品香蕉69| 亚洲欧美在线播放| 欧美性猛交xxxx免费看| 国产亚洲欧美日韩一区二区| 亲子乱一区二区三区电影| 亚洲欧美国产高清va在线播| 亚洲激情 国产| 欧美性猛交xxxx免费看漫画| 最近免费中文字幕视频2019| 亚洲片在线观看| 久久综合88中文色鬼| 日韩在线观看免费网站| 日本人成精品视频在线| 成人激情在线播放| 亚洲一区二区福利| 欧美精品一区二区三区国产精品| 欧美一级在线播放| 在线播放日韩欧美| 久久国产精品影片| 国模精品视频一区二区| 久久av中文字幕| 日本欧美在线视频| 精品亚洲国产成av人片传媒| 欧美性极品xxxx做受| 欧美裸体视频网站| 成人国产精品av| 国内精品一区二区三区| xvideos成人免费中文版| 国产亚洲视频中文字幕视频| www.久久撸.com| 91国产精品91| 亚洲精品国产精品国自产观看浪潮| 色一情一乱一区二区| 国产女精品视频网站免费| 成人免费观看网址| 亚洲黄色有码视频| 亚洲国产精品视频在线观看| 亚洲自拍偷拍网址| 亚洲日韩欧美视频| 色噜噜狠狠色综合网图区|