使用“X-UA-Compatible”为 IE8 模拟 IE7,但不为 IE9 模拟

Posted

技术标签:

【中文标题】使用“X-UA-Compatible”为 IE8 模拟 IE7,但不为 IE9 模拟【英文标题】:Emulate IE7 for IE8 but not for IE9 using "X-UA-Compatible" 【发布时间】:2011-03-25 17:25:16 【问题描述】:

我有一个基于矢量绘图的网站,对于 Internet Explorer,我使用 VML,对于其他浏览器,我使用 SVG。 但是,如果不退回到具有 VML 的 IE7 模式,IE8 不支持两者。

因此我包括<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />

问题(嗯,实际上是件好事)是 IE9 现在支持 SVG,所以我不希望它回退到性能和兼容性更差的 IE7 模式。如何只告诉 IE8 回退到 IE7 模式但让 IE9 保持在 IE9 模式?

现在我正在对代理进行服务器端检查,是否在头部包含 EmulateIE7 字符串,但我想尽可能避免这种情况。

【问题讨论】:

IE 8 确实支持 VML,它只是改变了您声明/处理它的方式。例如,您需要使用 -ms-behavior 而不是 behavior。更多信息请访问ajaxian.com/archives/the-vml-changes-in-ie-8。 IE8 标准模式确实支持 VML。它有各种各样的问题(更改、新错误和性能不佳),但原则上应该可以让它工作。微软似乎让 VML 实现随着每个浏览器版本而降级。大概他们认为这是一项垂死的技术。 哦,做额外的工作来获得 10 倍的性能下降和额外的错误并不是很诱人。 那么您最终是否坚持使用 EmulateIE7 进行服务器端检查? 你好 Urjan - 请花点时间选择答案。 【参考方案1】:

我刚玩了一场,发现以下作品适合我:

<meta http-equiv="X-UA-Compatible" content="IE=7,IE=9" >

那是逗号而不是分号!

我没有查看规范,但格式类似于适用于 Chrome 框架的 content="IE=7,chrome=1"。我还发现 content="IE=7,9" 有效,但我怀疑这不是正确的格式。

编辑:

如果您的网页位于 iframe 中,请注意一个严重的问题。如果您在父级处于 any 模式低于 IE9 严格的框架页面中使用上述内容,则 IE9 将回退到 IE8 模式(忽略 IE=7 请求!)。欢迎任何已知的解决方法:) 可能与 IE11 无关。

以上似乎是设计特性的副作用,即 iframe(我认为框架)要么都处于 IE9 模式,要么都低于 IE9 模式。不能将 IE9 框架与 #599022 和 #635648。

编辑 2:

请注意,IE11 仅支持“IE=edge”(不支持 IE=11),并且使用 IE=edge 会对 IE 功能(包括用户代理)产生重大影响。

编辑 3:

Fantastic flow chart 解释 IE 如何确定 IE9 使用哪种模式 IE8 到 IE11 都支持IE=edge。 元标记优先于 HTTP 标头(可以代替元标记使用) 更多X-UA-Compatible info for IE10。

编辑 4:

X-UA-Compatible 已从 Microsoft Edge 浏览器中移除。只有 Internet Explorer 具有兼容模式。请注意,如果您在 Windows Phone 10 上的应用程序中使用 WebView,那么您仍在使用 IE11(而不是 Edge)。

由于各种原因,您不能相信用户代理会告诉您正确的兼容性级别,而是使用 javascript 中的 document.documentMode

编辑 5:

对于某些极端情况,IE11 仍需要将 X-UA-Compatible 设置为 IE=EDGE,例如如果您不设置此选项,则使用 ActiveX 中的 IE11(作为包装应用程序中的 WebView)的客户可以将 IE11 恢复为 IE7 模式。

【讨论】:

是的,它运行良好。在这里使用逗号至关重要。另外,我不确定使用 IE=7 代替 IE=EmulateIE7。 确认这适用于 9.0.8112.16421(最终版本)。以上拍摄使 IE8 以 IE7 标准模式呈现,而 IE9 以 IE9 标准模式呈现。适用于 。对于 IE7 quirks 模式和 IE9 标准模式,请使用 也相关:***.com/questions/6156639/… - 但要注意 IE=edge 对 IE11 有显着的副作用 关于 x-ua-compatibility 的 iframe 非继承性,这是我的发现:如果文档没有 X-UA-Compatible 值,但它在 iframe 中提供给使用的父文档X-UA-Compatible 的元标记:任何版本的 IE 都不会将 X-UA-Compatible 值传递给子文档。它不继承。但是,如果所有文档都由同一个 Web 服务器提供服务,您可以在 http 响应级别设置 X-UA-Compatibile 设置并放弃使用元标记——这样 iframe 也将获得该值。【参考方案2】:

其他人提到的双重模式应该工作(但没有微软显示的)并且是我在 MS 文档中看到的最接近的应该按描述工作。下面的更新显示了元属性值应采用的正确形式。

所以如果你使用这个:

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7; IE=EmulateIE9">

不幸的是,由于 x-ua 兼容引擎所做的模糊版本矢量化,您将得到 IE8 渲染为 IE8。请参阅此文档: Defining Document Compatibility: Understanding Content Attribute Values 在 MSDN 上。 在该部分中,您将看到在前半部分,他们定义的任何版本向量定义为大于当前浏览器版本将被解释为最大的可用渲染引擎。因此,emulateIE9 被翻译成 emulateIE8。愚蠢的。

然后,实际上,他们实际上同时讨论了使用多个版本向量(如上面的代码 sn-p 中的)来排除特定引擎。但由于模糊的版本逻辑,这永远行不通。啊,微软。又失败了。

在元数据周围使用 CC 不起作用的原因是浏览器必须在遇到 CC 时选择了渲染引擎。 x-ua 元数据必须位于标头中的任何其他内容之前,除了其他元数据或根据 MS 自己的文档的标题。

如果有人能弄清楚这一点,我会全力以赴,因为我迫切希望将 IE8 排除在支持之外,同时将 IE9 包括在内。

重要更新

Robocat 指出,如 Micrsoft 所示,使用逗号而不是分号是正确的做法。我测试了它,它对我有用。我已经更新了我的test page。

所以正确的形式是这样的(如robocat所建议的):

<meta http-equiv="X-UA-Compatible" content="IE=7, IE=9">

不正确的形式是这样的(微软建议的):

<meta http-equiv="X-UA-Compatible" content="IE=7; IE=9">

【讨论】:

感谢您提供的信息丰富的答案。我希望它有解决方案,但至少现在问题更清楚了。 成功!感谢机器猫。是的!使用逗号而不是分号似乎有效。我已经更新了我的索引页面以反映这一点。 ***.com/questions/3413629/… 确认这适用于 9.0.8112.16421(最终版本)。对于 IE7 的 quirks 模式,使用:【参考方案3】:

到目前为止我都用过,在 IE9 上没有任何效果:

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" >
<meta http-equiv="X-UA-Compatible" content="IE=8" >

<httpProtocol>
        <customHeaders>
          <clear />
          <add name="X-UA-Compatible" value="IE=EmulateIE8" />
        </customHeaders>
    </httpProtocol>

这太令人沮丧了,这些元标记似乎都不起作用。微软,支持你说应该在你的文档中工作的东西有什么困难?我们必须花费数小时进行浏览器大战。你在浪费大家的时间。

【讨论】:

显然在 IE 上我们不能将条件 cmets 放在 X-UA-Compatible 之前。【参考方案4】:

如果您希望 IE 8 使用 IE7 标准,而 IE 9 使用 IE9 标准,这个对我有用:

<meta http-equiv="X-UA-Compatible" content="IE=7, IE=9">

对于 IE9,这为我提供了 IE 9 与 IE 9 标准的兼容模式。 对于 IE8,这给了我浏览器模式 IE8 文档模式 IE7 标准

【讨论】:

【参考方案5】:

这个对我来说适用于 IE9。

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8"/>

【讨论】:

【参考方案6】:

我认为你需要的是:

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7; IE=EmulateIE9">

根据 http://blogs.msdn.com/b/ie/archive/2010/06/16/ie-s-compatibility-features-for-site-developers.aspx 将其声明为“......一个组合值的示例,以便 IE8 以 IE7 标准模式呈现网页,而 IE9 以 IE9 的标准模式呈现网页:”

但是我无法让它工作。

【讨论】:

【参考方案7】:

哇,微软真的在这里制造了一场噩梦。我们将在未来好好讨论这个问题!

无论如何这对我有用。

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7; IE=EmulateIE9" />

【讨论】:

我改变了 IE=EmulateIE7; IE=IE9 到 IE=EmulateIE7; IE=EmulateIE9【参考方案8】:
<!--[if IE 8]>
  <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<![endif]-->

称为条件 cmetshttp://en.wikipedia.org/wiki/Conditional_comment

【讨论】:

不起作用。 IE8 停留在 IE8 模式。我似乎在条件 cmets 启动之前选择了渲染模式。 确实,任何条件注释的使用都会修复 documentMode,因此以后的&lt;meta&gt; 无法更改它。 中的任何条件注释都会导致模拟模式不起作用。 @bobince 是对的。这里的逻辑很明显——浏览器应该在可以处理条件 cmets 之前知道它的行为。 感谢 Sruly、@bobince、Rich 和 unclenorton。尽管不正确,但答案和 cmets 对解决一个非常令人沮丧的问题非常有帮助。

以上是关于使用“X-UA-Compatible”为 IE8 模拟 IE7,但不为 IE9 模拟的主要内容,如果未能解决你的问题,请参考以下文章

使用“X-UA-Compatible”模拟IE7 for IE8但不适用于IE9

什么是X-UA-Compatible?X-UA-Compatible的作用

什么是X-UA-Compatible?X-UA-Compatible的作用

IE8 如何处理这个标签 <meta http-equiv=“X-UA-Compatible” content=“IE=9” />

标签 <Meta http-equiv="X-UA-Compatible" ..> 用于 Iframe 在 IE8 中不起作用

将IE8模拟为IE7