【问题标题】:IE7 fallback to IE6 Standard Mode when rendering CSS from cache从缓存渲染 CSS 时,IE7 回退到 IE6 标准模式
【发布时间】:2012-07-24 04:35:41
【问题描述】:

我有这个问题,我似乎无法找到解决方案...

我有一个页面在初始加载时使用本机 IE7(不是来自 IE9/IE8 的模拟页面)呈现良好,但在从浏览器缓存提供的后续请求上回退到 IE6 标准模式。 IE7 知道如何处理多个 CSS 类,如“div.class1.class2”,而 IE6 标准模式不知道 - 因此我的页面在每次访问时都会中断,但第一次访问。

复制方法如下:

  • 打开 IE7(真正的,IE9/IE8 的 IE7 Emulated Mode 不起作用!
  • 转到 hhttp://beta.upcload.com/widget/popup?garmentId=workaholicfashion-5276777&sid=
  • 在初次访问时,一切都应该看起来漂亮而漂亮(例如蓝色按钮,如 Chrome 或 FF 中的)
  • 现在重新加载页面,一些 CSS 规则中断,因为浏览器回退到 IE6 标准模式(不是 Quirks 模式,我检查了一个!document.compatMode 仍然是“CSS1Compat”)
  • 清除缓存并重新加载,一切又看起来不错了
  • 随心所欲地重复

因此,当所有文件都从 Amazon 服务器获得时,IE7 似乎可以很好地呈现它们,包括包含多个类的 CSS 规则。 (例如“div.class1.class2”)当您尝试使用完全相同的代码重新加载完全相同的页面时,它会以某种方式切换到 IE6 标准模式(不是 Quirks 模式),它不理解链接的 CSS 类并破坏了几个设计,例如按钮。 我尝试添加几个不同的 Doctype / Meta 标头,但它们都没有区别,目前该页面是 XHTML Strict 有效并且具有 X-UA-Compatible IE=edge 标头,但从缓存加载时仍然无法正确呈现。 我能弄清的标头的唯一区别是 Not Modified 请求缺少 Content-Type 标头,但这应该不是问题,对吧?

哦,最重要的是,当我在本地开发服务器上使用 IE7 打开这个完全相同的页面时,它呈现得很好,即使在重新加载之后! :/

更新

好的,所以我终于能够在开发服务器上重现它了。唯一不同的是“max-age”标头,导致浏览器不在本地缓存任何内容。当我增加缓存时间时,IE7 开始缓存这些文件,一旦它们从缓存中加载,这再次导致设计中断。 所以这一定是文件从缓存而不是服务器提供的问题。

更新 2

我将范围缩小到 CSS 文件。看起来,IE7 要么在它来自缓存(即没有 Content-Type 标头)时以 IE6 模式呈现它,要么在它从服务器加载时以 IE7 模式呈现它。 (内容类型:文本/css) 有谁知道为什么会这样?也许是一些格式错误的 CSS 规则? 作为一种解决方法,我现在向样式表添加一个随机参数以防止缓存,这会阻止 IE7 切换到 IE6 模式,但即使从样式表中删除所有错误和警告后,问题仍然存在。

【问题讨论】:

  • 根据我的经验,与 chrome 和 FF 相比,IE 很难支持。你声明了什么DOCTYPE
  • <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 是的,我对整个浏览器兼容性问题并不陌生,但我在这个特殊的问题上碰壁了。 ://
  • 您的更新2:您是否验证了样式表的错误?你那里有任何 CSS hack 吗?您是否使用过 IE 特定的 filter 样式(因为它有一些非标准语法)?你能通过删除文件的部分或全部内容来解决问题吗?
  • 是的,CSS 是有效的,我不确定是不是 CSS 的某个部分触发了问题……毕竟 CSS 有 2000 多行,所以很难调试。 ://

标签: html css caching internet-explorer-7 internet-explorer-6


【解决方案1】:

不久前,我在支持旧版 IE6 应用时遇到了完全相反的行为。

不管怎样,你使用 xhtml 1.0 strict doctype,这是一个重要的开始!

首先:通常的清单:

  • (Generated)(X)HTML 文件/数据在没有 BOM 的情况下发送/保存,DTD 之前没有一个字节?
  • 您是否检查过发送文件的服务器发送了哪些设置?
  • 文档内容类型是“text/html”还是 XML(“application/xhtml+xml”或“application/xml”)(在标记源 = 元标记和/或由服务器发送 = 标题)?
  • 页面是否从 Microsoft 黑名单上的域提供(或与之通信) (不允许使用 IE 后备模式)?
  • 您是否检查过 lan/intRAnet 和 wan/internet 之间的 IE 安全设​​置差异(因为您提到了不同的行为)?
  • 是否可能有一个代理,您也可以通过该代理连接互联网(这可能会重写某些内容?)

现在准备好这些数据并访问我所见过的absolute best source on browsermode-switching,事实上每一本自尊的网络开发书籍都应该在第一章中介绍这一点。所有这些美好都在一个清晰的页面上,至少可以说是“启发性的”..
人们应该知道浏览器模式切换有 2 个部分,并了解什么时候可以期待什么样的行为。
在同一页面上,您还可以找到IE mode-switching-flowchart,它可以深入了解 IE 遵循的 EXTENSIVE 迷宫以确定其最终呈现/浏览器模式。

真的希望这会有所帮助!

更新:
没有 IE6(标准/怪癖)模式(在较新版本的 IE 中)。请参阅 official microsoft documentation(和 updated link 与此报价)!让我什至引用它:

Windows Internet Explorer 7 提供的新功能旨在 更全面地支持行业标准,例如支持 通用选择器。因为该指令只支持两个 设置(怪癖模式和标准模式),IE7标准模式替换 Internet Explorer 6 标准模式。

这是他们的 doctype-switch 检查器的代码(同一页面上的源代码):

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.
}

现在阅读上面微软代码中的 cmets!!!!

关于您的第二次更新:
关于缓存的好发现!所以css现在是问题所在。既然你现在开始理解为什么传统的 IE6 应用程序需要 IE6(IE6 如此难以杀死的原因),也许你应该看看conditional comments。自:

  • 它们不是黑客(但正如 SDC 在 cmets 中指出的那样,Microsoft dropped them 从 IE10 开始)
  • 没有 javascript 浏览器嗅探(甚至不需要启用脚本,因此始终有效),
  • 它可以专门针对(一系列)版本的 IE Exclusively。

您可以在其中包含指向特定于 IE 的 css 的链接(保持文档小巧、精简且整洁)...

【讨论】:

  • 嗨@GitaarLAB,感谢您的建议!这是我能找到的:
  • - HTML 文件是静态的,在 DTD 之前不是 BOM 或任何其他文件 - 您特别需要哪些设置?我猜只是常用的:X-Powered-By、P3P、Content-Type/-Length、Etag、Cache-control、Last-modified 和 Cookie(此外,这些是默认的 AWS 标头)- text/html -不,我不知道 - Intranet 服务器与 IE 的 Internet 服务器无法区分(两者都使用 WAN IP) - 不,问题也发生在 2 个完全不同的网络上
  • 重新使用 CSS 评论:事实上,它们实际上并不像我们希望的那样面向未来,因为 IE10 正在放弃对它们的支持。你仍然可以使用它们,如果你正确使用它们,它们仍然可以在所有情况下工作,但要注意会有一些 IE 版本无法识别它们。
  • +1 用于引用 MSDN 文档,因为它现在已更新(更新时间:2012 年 11 月)并且找不到您引用的文本!
  • @felickz:谢谢。的确,它变了。这是带有该报价的fresh link。我将更新该答案以供将来参考。
猜你喜欢
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
相关资源
最近更新 更多