7

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

我有一个页面在初始加载时使用本机 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 标头,但从缓存加载时仍然无法正确呈现。我能弄清的标头的唯一区别是未修改请求的缺少 Content-Type 标头,但这应该不是问题,对吧?

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

更新

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

更新 2

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

4

1 回答 1

5

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

无论如何,你使用 xhtml 1.0 strict doctype,这是一个重要的开始!

首先:通常的清单:

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

现在准备好这些数据并访问我所见过的关于浏览器模式切换的绝对最佳来源,事实上,每一本自尊的网络开发书籍都应该在第一章中介绍这一点。所有这些好处都在一个清晰的页面上,至少可以说是“启发性的”。
人们应该知道浏览器模式切换有两个部分,并了解何时可以期待什么样的行为。
在同一页面上,您还可以找到一个IE 模式切换流程图,它可以深入了解 IE 遵循的 EXTENSIVE 迷宫以确定其最终呈现/浏览器模式。

真的希望这会有所帮助!

更新:
没有 IE6(标准/怪癖)模式(在较新版本的 IE 中)。请参阅官方微软文档(以及此报价的更新链接)!让我什至引用它:

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

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

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

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

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

于 2012-07-26T02:38:09.523 回答