2012-07-25 43 views
7

渲染CSS時,我有這個問題,我似乎無法找到一個解決方案...從緩存中

我有使罰款與本地IE7(而不是效仿的頁面IE7退回到IE6標準模式一個來自IE9/IE8)初始加載,但在從瀏覽器緩存獲得服務的後續請求中回退到IE6標準模式。 IE7知道如何處理多個CSS類,比如「div.class1.class2」,而IE6標準模式不支持 - 因此,除了第一個訪問外,我的頁面每次訪問都會中斷。

下面是如何重現它:

  • 打開IE7(真正的一個,從IE9/IE8 IE7仿真模式將無法正常工作!)
  • 去hhttp://測試版。 upcload.com/widget/popup?garmentId=workaholicfashion-5276777 & SID =
  • 在初次拜訪,凡事都要好看和花花公子(例如藍色按鈕,就像在Chrome或FF)
  • 重裝頁面現在,幾個CSS規則破壞,因爲瀏覽器回落到IE6標準模式(不怪怪模式,我檢查了一個! document.compatMode仍然是「CSS1Compat」)
  • 清除緩存,刷新,一切都看起來不錯,再次
  • 重複往往你喜歡

所以它似乎是,當這些文件都得到來自供應亞馬遜服務器,IE7渲染它們就好了,包括包含多個類的CSS規則。 (例如「div.class1.class2」)當您嘗試使用完全相同的代碼重新加載完全相同的頁面時,它以某種方式切換到IE6標準模式(不是怪癖模式),該模式不理解鏈接的CSS類並打破幾個設計,例如按鈕。 我嘗試添加幾個不同的Doctype/Meta標題,但它們都沒有區別,當前頁面是XHTML嚴格有效並且具有X-UA兼容IE =邊緣標題,但仍然無法在從緩存加載時正確呈現。 我可以做出的頭文件唯一的區別是未修改的請求缺少Content-Type頭文件,但這不應該是個問題,對吧?

呵呵,爲了讓它一切順利,當我在本地開發服務器上打開與IE7完全相同的頁面時,即使在重新加載之後,它也能很好地呈現! :/

更新

好了,所以我終於能夠重現它在開發服務器上。唯一不同的是「max-age」標題,導致瀏覽器不在本地緩存任何內容。當我增加緩存時間時,IE7開始緩存這些文件,這些文件在從緩存中加載後又一次導致設計中斷。 所以它必須是從緩存而不是從服務器提供文件的問題。

更新2

我把範圍縮小到CSS文件。看起來,當IE7從緩存(即沒有Content-Type標頭)和IE7模式從服務器加載時,IE7或者將其呈現爲IE6模式。 (Content-Type:text/css) 有沒有人有一個想法,爲什麼會這樣?也許一些格式不正確的CSS規則? 作爲一種解決方法,我現在向樣式表中添加一個隨機參數以防止緩存,從而防止IE7切換到IE6模式,但即使從樣式表中刪除所有錯誤和警告後問題依然存在。

+0

IE是相當困難相比,Chrome和FF支持,在我的經驗。你聲明瞭什麼'DOCTYPE'? – starbeamrainbowlabs 2012-07-25 17:13:23

+0

'<!DOCTYPE HTML PUBLIC 「 - // W3C // DTD XHTML 1.0嚴格// EN」 「http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd」>' 呀,我對這個瀏覽器兼容性的東西並不陌生,但是我遇到了這個特殊問題。 :/ – 2012-07-25 18:13:34

+0

重新更新2:您是否驗證了樣式表中的錯誤?你有沒有CSS黑客?你有沒有使用特定於IE的'filter'風格(因爲這有一些非標準的語法)?您是否可以通過刪除部分或全部文件內容來解決問題? – SDC 2012-07-26 13:38:20

回答

5

不久前,我在支持傳統IE6應用程序時遇到完全相反的行爲。

無論如何,你使用xhtml 1.0嚴格的文檔類型,這是一個重要的開始!

首先斷:通常的清單:

  • (生成)(X)HTML文件/數據被髮送/保存沒有BOM,而不是一個單一的字節是DTD前?
  • 您是否檢查過發送該文件的服務器發送的設置?
  • 是文檔內容類型'text/html'還是XML('application/xhtml + xml'或'application/xml')(在markup-source = meta標籤中和/或由server = header發送)?
  • 頁面是否從Microsoft黑名單 (其中IE fallbackmode是不允許的)中的域提供(或與其通信)?
  • 您是否檢查過lan/intRAnet和wan/intERnet之間的IE安全設置差異(因爲您提到了不同的行爲)?
  • 是否有可能通過它您連接過互聯網的代理(可能重寫的東西嗎?)

現在有這樣的數據準備和每一個自我參觀absolute best source on browsermode-switching我見過,其實尊重web開發本書第號應該覆蓋這一章的第一章。所有這些善良在一個明確的頁面上,至少可以說是「啓發」。
人們應該知道瀏覽器模式切換有2個部分,並且理解何時會期望什麼樣的行爲。
在同一頁面上,您還可以找到一個IE mode-switching-flowchart,其中給出了EXTENSIVE迷宮中的洞察力,IE將根據這個迷宮來確定它是最終的渲染/瀏覽器模式。

真的希望這有助於!

UPDATE:
沒有IE6(標準/夸克)模式(在IE中的較新版本)。看到official microsoft documentation(和updated link這個報價)!讓我引用,甚至它:

的Windows Internet Explorer 7提供旨在 更全面支持行業標準的新功能,如用於 通用選擇支持。因爲該指令僅支持兩個 設置(奇怪模式和標準模式),IE7標準模式取代了 Internet Explorer 6標準模式。

這裏是他們的doctype開關檢查(來源同一頁面上)代碼:

engine = null; 
if (window.navigator.appName == "Microsoft Internet Explorer") 
{ 
    // This is an IE browser. What mode is the engine in? 
    if (document.documentMode) // IE8 or later 
     engine = document.documentMode; 
    else // IE 5-7 
    { 
     engine = 5; // Assume quirks mode unless proven otherwise 
     if (document.compatMode) 
     { 
     if (document.compatMode == "CSS1Compat") 
      engine = 7; // standards mode 
     } 
     // There is no test for IE6 standards mode because that mode 
     // was replaced by IE7 standards mode; there is no emulation. 
    } 
    // the engine variable now contains the document compatibility mode. 
} 

現在讀上面微軟的代碼中的註釋!!!!

關於您的第二次更新:
好的發現緩存!所以CSS現在是問題。既然您現在開始瞭解傳統IE6應用程序爲什麼需要IE6(爲什麼IE6很難殺死),那麼您應該看看conditional comments。因爲:

  • 他們沒有破解(但SDC的意見,Microsoft dropped them從IE10上,並向前指出)
  • 沒有啓用JavaScript的瀏覽器嗅探(甚至沒有腳本需要的話,所以總是工作),
  • 並且它可以專門針對(一系列)IE版本。

在他們身上,你可以包含一個鏈接到IE特定的CSS(保持文件小,瘦,整潔的)...

+0

嗨@GitaarLAB,感謝您的建議! 這是我能找到的: – 2012-07-26 07:51:55

+0

- HTML文件是靜態的,沒有一個BOM或任何其他的DTD 之前 - 你在找什麼設置特別?只是通常的,我猜想:X-Powered-By,P3P,Content-Type/-Length,Etag,Cache-control,Last-modified和Cookie(此外,這些都是默認的AWS標頭) - text/html - 不,我知道 - 內網服務器與IE的互聯網服務器無法區分(均使用WAN IP) - 不,也出現在2個完全不同的網絡上 – 2012-07-26 08:06:06

+0

感謝您的鏈接,不幸的是,您提到的頁面不包含IE7明顯具有的IE6標準模式。 :/所以沒有太多的幫助。 – 2012-07-26 08:07:16