使用“X-UA-Compatible”在IE8中模拟IE7,但不包括IE9

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字符串,但我想尽可能避免这种情况。


6
IE 8 支持 VML,只是它改变了声明和处理方式。例如,您需要使用 -ms-behavior 而不是 behavior。更多信息请参见 http://ajaxian.com/archives/the-vml-changes-in-ie-8. - Andy E
3
IE8标准模式支持VML。虽然存在各种问题 (变化、新的错误和性能差),但原则上应该可以使其正常工作。微软似乎让每个浏览器版本的VML实现逐渐降级;可能他们认为这是一项逐渐消亡的技术。 - bobince
哦,为了获得10倍的性能降低和额外的错误而做额外的工作并不是很诱人。 - Urjan
你最终还是选择使用 EmulateIE7 的服务器端检查了吗? - Jon Galloway
你好Urjan - 请花一秒钟时间选择一个答案。 - donohoe
8个回答

41

我刚试了一下,发现以下内容对我有效:

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

注意:应该使用逗号而非分号!

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

编辑:

如果你的页面在 iframe 中,请注意一个严重问题。如果你在父页面中使用上述代码,而该父页面在 IE9 严格模式以下的任何模式下都存在,则 IE9 将回退到 IE8 模式(忽略 IE=7 请求!)。欢迎分享任何已知解决方法 :) 这可能与 IE11 无关。

以上似乎是设计特性的副作用,即 iframe(和我认为 frame)要么全部处于 IE9 模式,要么全部低于 IE9 模式。不能将 IE9 帧与 < IE9 帧混合,参见 MS 问题 #599022#635648

编辑2:

请注意,IE11 仅支持 "IE=edge"(不支持 IE=11),使用 IE=edge 对 IE 功能(包括用户代理)有重大影响。

编辑3:

  • 精美流程图 解释了 IE 如何确定对于 IE9 使用哪种模式
  • IE8 到 IE11 都支持 IE=edge
  • Meta 标签优先于 HTTP 标头(可以使用代替 meta 标签的 HTTP 标头)
  • 有关 IE10 的更多 X-UA-Compatible 信息

编辑4:

X-UA-Compatible 已从 Microsoft Edge 浏览器中删除。只有 Internet Explorer 具有兼容性模式。请注意,如果你在 Windows Phone 10 应用程序中使用 WebView,则仍在使用 IE11(而非 Edge)。

另外,由于各种原因,你不能信任用户代理告诉你正确的兼容性级别,而应使用 JavaScript 中的 document.documentMode

编辑5:

对于某些边缘情况,例如客户端使用 ActiveX 的 IE11(作为包装应用程序中的 WebView)可能会将 IE11 降回到 IE7 模式,因此 IE11 仍需要将 X-UA-Compatible 设置为 IE=EDGE


是的,它完美地运行。在这里使用逗号非常重要。此外,我不确定是否应该使用IE = 7而不是IE = EmulateIE7。 - unclenorton
确认此方法适用于9.0.8112.16421(最终版本)。以上代码可使IE8以IE7标准模式渲染,IE9以IE9标准模式渲染。适用于<!DOCTYPE HTML>。对于IE7怪异模式和IE9标准模式,请使用<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7, IE=9">。 - Rich Apodaca
同样相关的是:https://dev59.com/om025IYBdhLWcg3wNC51 - 但要注意IE=edge对IE11有重大的副作用。 - robocat
1
关于iframe不继承x-ua-compatibility的问题,这是我的发现:如果一个文档没有X-UA-Compatible值,但它被嵌套在使用X-UA-Compatible meta标签的父文档中,则IE的任何版本都不会将X-UA-Compatible值传递给子文档。它不会继承。然而,如果所有文档都由同一Web服务器提供,则可以在http响应级别设置X-UA-Compatibile设置,并放弃使用meta标签-这样iframe也将获得该值。 - squareman

27

有人提到的双模式应该可以工作(但是根据微软的显示并没有),这是我在微软文档中看到的最接近描述应该可以工作的内容。下面有一个更新,显示meta属性值应采取的正确形式。

因此,如果您使用以下内容:

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

很不幸,由于x-ua-compatible引擎的模糊版本向量化,您将得到IE8呈现为IE8的结果。请参阅MSDN上的定义文档兼容性:了解内容属性值。在该部分中,您将看到在前半部分中,他们定义任何大于当前浏览器版本的版本向量将被解释为最大可用渲染引擎。因此,emulateIE9会被转换为emulateIE8。愚蠢。
然后,在同一段话中,他们几乎同时谈到使用多个版本向量,如上面的代码片段,以排除特定引擎。但是由于模糊版本逻辑,这永远不起作用。啊,微软。再次失败。
使用CCs围绕元标记的原因是,浏览器必须在到达CC之前选择呈现引擎。根据微软自己的文档,x-ua元标记必须位于头部中除其他元标记或标题之外的任何其他内容之前。
如果有人能弄清楚这一点,我全神贯注,因为我急于排除对IE8的支持,同时包括IE9。
重要更新:

Robocat指出,使用逗号而不是Microsoft所展示的分号是正确的做法。我测试过了,对我有效。我已经更新了我的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">

感谢您提供这个信息丰富的答案。虽然它没有解决方案,但至少问题现在更清晰了。 - Rich Apodaca
1
成功!多亏了robocat。是的!使用逗号代替分号似乎起作用了。我已经更新了我的索引页面以反映这一点。https://dev59.com/sHA75IYBdhLWcg3wOGPS#4331124 - squareman
1
确认此代码可在9.0.8112.16421(最终版本)上运行。对于兼容模式IE7,请使用:<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7, IE=9">。 - Rich Apodaca

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>

这太令人沮丧了,这些元标签似乎都不起作用。微软,为什么在支持文档中提到的东西会如此困难?我们必须花费数小时进行浏览器之争。你在浪费大家的时间。


1
显然,在IE上,我们不能在X-UA-Compatible之前放置条件注释。 - Deepfreezed

3
如果您希望IE 8使用IE7标准,而IE 9使用IE9标准,则以下设置适用于我:
<meta http-equiv="X-UA-Compatible" content="IE=7, IE=9">

对于IE9,这将使我在IE9标准下使用IE 9兼容模式。 对于IE8,这将给我IE8浏览器模式,文档模式为IE7标准。


0

对我来说,这个适用于IE9。

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

-1

哇,微软真的在这里制造了一个噩梦。我们将会长时间地讨论这个问题!

不管怎样,这对我来说是有效的。

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

我将IE=EmulateIE7; IE=IE9更改为IE=EmulateIE7; IE=EmulateIE9。 - Alex

-1

-3

2
不起作用。IE8仍停留在IE8模式。似乎呈现模式被选定,然后才启动条件注释。 - Urjan
11
确实,任何使用条件注释的方式都会固定文档模式(documentMode),因此无法通过后面的<meta>标签进行更改。 - bobince
4
在<head>标签内的任何条件注释都会导致仿真模式无法正常工作。 - Rich Apodaca
2
@bobince是正确的。这里的逻辑很明显——在条件注释被处理之前,浏览器应该已经知道它的行为方式。 - unclenorton
感谢Sruly、@bobince、Rich和unclenorton。虽然答案和评论并不完全正确,但它们对解决一个非常令人沮丧的问题非常有帮助。 - uɥƃnɐʌuop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接