2012-07-25 41 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