从缓存渲染CSS时,IE7回退到IE6标准模式



我遇到这个问题,似乎找不到解决方案。。。

我有一个页面,在初始加载时使用本机IE7(而不是IE9/IE8中的模拟IE7)可以很好地渲染,但在从浏览器缓存发出的后续请求中,它会回落到IE6标准模式。IE7知道如何处理多个CSS类,如"div.class1.class2",而IE6标准模式不知道——因此,我的页面在每次访问时都会中断,但第一次访问时除外。

以下是如何复制它:

  • 打开IE7(真正的IE9/IE8的IE7模拟模式不起作用!
  • 转到hhttp://beta.upcload.com/widget/popup?garmentId=workaholicfashion-5276777&sid=
  • 在第一次访问时,一切都应该看起来很漂亮(例如蓝色按钮,就像Chrome或FF中的按钮)
  • 重新加载现在页面,几个CSS规则被打破,因为浏览器回到IE6标准模式(不是Quirks模式,我检查了那个!document.compatMode仍然是"CSS1Compat")
  • 清除缓存并重新加载,一切看起来都很好
  • 随意重复

因此,当所有文件都从亚马逊服务器上提供时,IE7会对它们进行良好的渲染,包括包含多个类的CSS规则。(例如"div.class1.class2")当你试图用完全相同的代码重新加载完全相同的页面时,它会以某种方式切换到IE6标准模式(而不是Quirks模式),它不理解链接的CSS类,并破坏了几个设计,例如按钮。我尝试添加了几个不同的Doctype/Meta标头,但它们都没有区别,目前该页面是XHTML Strict有效的,并且有一个X-UA-Compatible IE=edge标头,但从缓存加载时仍然无法正确呈现。我能辨认出的标题中唯一的区别是"未修改"请求缺少"内容类型"标题,但这应该不是问题,对吧?

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

更新

好吧,所以我终于能够在开发服务器上复制它了。唯一不同的是"最大年龄"标头,导致浏览器无法在本地缓存任何内容。当我增加缓存时间时,IE7也开始缓存这些文件,一旦它们从缓存中加载,这再次导致设计中断。因此,从缓存而不是从服务器提供文件肯定是个问题。

更新2

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

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

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

首先:通常的检查表:

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

现在,准备好这些数据,并访问我见过的浏览器模式切换上的最佳来源,事实上,每一本自尊自重的网络开发书籍都应该在第一章中涵盖这一点。所有这些美好都写在一张清晰的纸上,至少可以说是"启发性的"
人们应该知道浏览器模式切换有两个部分,并了解何时会出现什么样的行为
在同一页面上,您还可以找到一个IE模式切换流程图,该流程图可以深入了解IE在确定其最终渲染/浏览器模式时所遵循的复杂迷宫。

真的希望这能有所帮助!

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

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很难杀死的原因),也许你应该看看有条件的评论。自:

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

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

最新更新