發起圖片請求的幾種可能性(webkit內核)


網頁測試源代碼:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>瀏覽器圖片加載</title>
    <style type="text/css">
    .no_show{
        display: none;
    }
    </style>
    <script type="text/javascript" src="http://common.cnblogs.com/script/jquery.js"></script>
    <script type="text/javascript">
    $(function(){
        $(".domReady_no_show").css("display","none");

        var el = document.createElement('div');
        el.innerHTML = '<img src="http://i.mmcdn.cn/simba/img/T1MeV0FbpcXXb1upjX.jpg" />';//到這個階段,瀏覽器就開始產生圖片請求。
        // document.body.appendChild(el);

        new Image().src="http://img01.taobaocdn.com/tps/i1/T14Tx1FmFfXXXRAFgs-110-135.png";//到這個階段,瀏覽器也產生圖片請求。
    })
    </script>
</head>
<body>
<div>display:none;的圖片會不會加載?會!<img class="no_show" src="http://img03.taobaocdn.com/tps/i3/T1BfxMFdNhXXcr_tT7-490-170.jpg" /></div>
<div>DOM結構預備的時候,display:none;的圖片會不會加載?會!<img class="domReady_no_show" src="http://img01.taobaocdn.com/tps/i1/T1BYX3FXdfXXcr_tT7-490-170.jpg"></div>
<img nosrc="http://img04.taobaocdn.com/tps/i4/T1L005Fa4cXXXRAFgs-110-135.png" />
別忘了查看附件
</body>
</html>

玉伯博客的講解:

 

請在主流瀏覽器中打開測試頁面,在Fiddler里查看http請求。

1. 隱藏圖片

《img src=“1.jpg” style=“display: none” /》

測試:test_1.html

結論:只有Opera不產生請求。

注意:用visibility: hidden隱藏圖片時,在Opera下也會產生請求。

2. 重復圖片

《img src=“1.jpg” /》

《img src=“1.jpg” /》

測試:test_2.html

結論:所有瀏覽器都只產生一次請求。

3. 重復背景

《style type=“text/css”》

.test1 { background: url(1.jpg) }

.test2 { background: url(1.jpg) }

《/style》

《div class=“test1”》test1《/div》

《div class=“test2”》test2《/div》

測試:test_3.html

結論:所有瀏覽器都只產生一次請求。

4. 不存在的元素的背景

《style type=“text/css”》

.test1 { background: url(1.jpg) }

.test2 { background: url(2.jpg) } /* 頁面中沒有class為test2的元素 */

《/style》

《div class=“test1”》test1《/div》

測試:test_4.html

結論:背景僅在應用的元素在頁面中存在時,才會產生請求。這對CSS框架來說,很有意義。

5. 隱藏元素的背景

《style type=“text/css”》

.test1 { background: url(1.jpg); display: none; }

.test2 { background: url(2.jpg); visibility: hidden; }

《/style》

《div class=“test1”》test1《/div》

測試:test_5.html

結論:Opera和Firefox對於用display: none隱藏的元素背景,不會產生HTTP請求。僅當這些元素非display: none時,才會請求背景圖片。

6. 多重背景

《style type=“text/css”》

.test1 { background: url(1.jpg); }

.test1 { background: url(2.jpg); }

《/style》

《div class=“test1”》test1《/div》

測試:test_6.html

結論:除了基於webkit渲染引擎的Safari和Chrome,其它瀏覽器只會請求一張背景圖。

注意:webkit引擎瀏覽器對背景圖都請求,是因為支持CSS3中的多背景圖。

7. hover的背景加載

《style type=“text/css”》

a.test1 { background: url(1.jpg); }

a.test1:hover { background: url(2.jpg); }

《/style》

《a href=“#” class=“test1”》test1《/a》

測試:test_7.html

結論:觸發hover時,才會請求hover狀態下的背景。這會造成閃爍,因此經常放在同一張背景圖里通過翻轉來實現。

注意:在圖片no-cache的情況下,IE每次hover狀態改變時,都會產生一次新請求。很糟糕。

8. JS里innerHTML中的圖片

《script type=“text/javascript”》

var el = document.createElement(‘div’);

el.innerHTML = ‘《img src=“1.jpg” /》’;

//document.body.appendChild(el);

《/script》

測試:test_8.html

結論:只有Opera不會馬上請求圖片。

注意:當添加到DOM樹上時,Opera才會發送請求。

9. 圖片預加載

最常用的是JS方案:

《script type=“text/javascript”》

new Image().src = ‘1.jpg’;

new Image().src = ‘2.jpg’;

《/script》

在無JS支持的環境下,可以采用隱藏元素來預加載:

《img src=“1.jpg” style=“visibility: hidden; height: 0; width: 0” /》

測試:test_9.html

終於到總結了

對於隱藏圖片和隱藏元素的背景,Opera不會產生請求。

對於隱藏元素的背景,Firefox也不會產生請求。

對於尚未插入DOM樹的img元素,Opera不會產生請求。

基於webkit引擎的Safari和Chrome,支持多背景圖。

其它情景,所有主流瀏覽器保持一致。

對圖片請求的處理上,個人覺得Opera走在前列。

番外

1. 用Fiddler監控Opera時,如果是本地服務器,需要在Opera的代理服務器設置里,將本地服務器勾選上。

2. 查看HTTP請求數,還有一個萬無一失的方法是,直接查看Apache的access.log文件。

3. 我的Firefox對於重復圖片和重復背景,會產生重復請求。禁用了所有擴展,問題依舊。有知詳情者,還望告知。( lifesinger)

//---------------------------2014/1/17

如果你在html里面已經加載了圖片,再修改img的src,瀏覽器不會產生請求。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM