html – 从缓存中渲染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兼容的IE = edge标头,但是从缓存加载时仍然无法正确呈现.
我可以解决标题中唯一的区别是Not Modified请求缺少Content-Type标头,但这应该不是问题,对吧?

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

更新

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

更新2

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

解决方法

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

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

首先:通常的清单:

>(生成)(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-dev书都应该在第一章中介绍.所有这些善良都在一个清晰的页面上,至少可以说是“启发”……
人们应该知道浏览器模式切换有两个部分,并且了解什么时候会发生什么样的行为.
在同一页面上,您还可以找到一个IE mode-switching-flowchart,它可以深入了解IE所遵循的EXTENSIVE迷宫,以确定它的最终渲染/浏览器模式.

真的希望这有帮助!

更新:
没有IE6(标准/ quirk)模式(在较新版本的IE中).请参阅official microsoft documentation(以及此报价的updated link)!我甚至引用它:

Windows Internet Explorer 7 offered new features that were designed to
more fully support industry standards,such as support for the
universal selector. Because the directive only supports two
settings (quirks mode and standards mode),IE7 Standards mode replaced
Internet Explorer 6 standards mode.

这是他们的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难以杀死的原因),也许你应该看看conditional comments.

>他们不是黑客(但正如SDC在评论中指出的那样,Microsoft dropped them从IE10开始和向前)
>没有javascript浏览器嗅探(即使没有脚本需要启用,所以始终有效),
>它可以专门针对(一系列)IE独家版本.

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

相关文章

vue阻止冒泡事件 阻止点击事件的执行 <div @click=&a...
尝试过使用网友说的API接口获取 找到的都是失效了 暂时就使用...
后台我拿的数据是这样的格式: [ {id:1 , parentId: 0, name:...
JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简...
Mip是什么意思以及作用有哪些