42

我有一个取决于矢量绘图的网站,对于 Internet Explorer,我使用VML,对于其他浏览器,我使用SVG。然而,IE8 不支持这两者,除非退回到具有 VML 的 IE7 模式。

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

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

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

4

8 回答 8

41

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

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

那是逗号而不是分号!

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

编辑:

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

以上似乎是设计特性的副作用,即 iframe(我认为框架)要么都处于 IE9 模式,要么都小于 IE9 模式。永远不能将 IE9 帧与 < IE9 帧混合,请参阅 MS 问题#599022#635648

编辑2:

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

编辑3:

  • 解释 IE 如何确定用于 IE9 的模式的精彩流程图
  • IE=edge受 IE8 到 IE11 支持。
  • Meta 标记优先于 HTTP 标头(可以用来代替 meta 标记)
  • IE10 的更多X-UA 兼容信息

编辑4:

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

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

编辑5:

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

于 2010-12-02T02:26:00.753 回答
27

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

所以如果你使用这个:

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

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

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

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

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

重要更新

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

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

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

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

<meta http-equiv="X-UA-Compatible" content="IE=7; IE=9">
于 2010-10-20T20:57:00.313 回答
3

If you want IE 8 to use IE7 standards and IE 9 to use IE9 standards this one worked for me:

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

For IE9 this gives me IE 9 compatibility mode with IE 9 standards. For IE8 this gives me Browser Mode IE8 Document Mode IE7 Standards

于 2011-10-18T11:07:46.200 回答
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>

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

于 2011-05-25T16:26:31.597 回答
0

这对我来说适用于 IE9。

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8"/>
于 2015-07-29T21:53:51.930 回答
-1

我认为你需要的是:

<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 的标准模式呈现网页:"

但是我无法让它发挥作用。

于 2010-10-05T13:17:52.357 回答
-1

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

无论如何,这对我有用。

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7; IE=EmulateIE9" />
于 2010-10-29T04:27:13.277 回答
-3
<!--[if IE 8]>
  <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<![endif]-->

它被称为条件评论
http://en.wikipedia.org/wiki/Conditional_comment

于 2010-08-05T10:08:12.233 回答