今天遇到這麼一個問題,IE6,在window.onload裡用innerHTML動態插入圖片,結果這些圖片都忽略了本機快取策略,發出N多個304請求。
於是乎我換了一個寫法,在innerHTML裡不使用img,而是在innerHTML新添加的HTML標籤中使用CSS樣式來匯入圖片,但問題依舊,IE6 還是狂發304請求。
在網上搜尋到了emu一篇BLOG說innerHTML建立的 img 都會忽略本機快取,範例程式碼如下。那原因真的就是 innerHTML 建立的 img 忽略緩衝嗎?未必!
<html>
<body>
<div id="dd"></div>
</body>
<script type="text/javascript">...
var a = new Array(101);
var s = "<img alt='' src='http://www.baidu.com/img/logo.gif' /><br/>";
window.onload = function()
...{
document.getElementById("dd").innerHTML = a.join(s);
}
</script>
</html>
運行上述代碼,監控HTTP請求時確實是在狂發304請求,但是我的 MzTreeView 裡也是使用 innerHTML 大量建立 <img> 也沒有發現本機快取失效,所以根本原因並不在 innerHTML 上,而是在 window.onload 裡。同樣的代碼改成如下代碼再運行試試:
<html>
<body>
<div id="dd"></div>
</body>
<script type="text/javascript">...
var a = new Array(101);
var s = "<img alt='' src='http://www.baidu.com/img/logo.gif' /><br/>";
document.getElementById("dd").innerHTML = a.join(s);
</script>
</html>
再用HTTP請求監視軟體看看!
IE6裡確實存在動態建立的 img 忽略本機快取的BUG,但是這個BUG不是出在 innerHTML 上而是在 window.onload 這個事件裡。這個BUG在IE7裡已經解決了。
BUG的修正方案:
一是象上面的例子裡那樣把指令碼放到後面直接運行;
二是在 window.onload 裡再用 setTimeout 順延強制。