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

时间:2010-08-05 10:01:32

标签: html internet-explorer svg vml x-ua-compatible

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

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

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

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

8 个答案:

答案 0 :(得分: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帧与&lt; IE9帧,请参阅MS问题#599022#635648

编辑2:

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

编辑3:

编辑4:

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

同样由于各种原因,您无法相信用户代理会告诉您正确的兼容级别,而是使用JavaScript中的document.documentMode

答案 1 :(得分:27)

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

所以,如果你使用它:

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

不幸的是,你会得到IE8渲染为IE8,因为x-ua兼容引擎的模糊版本矢量化。看到这个文件: MSDN上的Defining Document Compatibility: Understanding Content Attribute Values。 在该部分中,您将看到在上半部分,它们定义任何定义为大于当前浏览器版本的版本向量将被解释为最大可用渲染引擎。因此,emulateIE9 get被转换为emulateIE8。笨。

然后,实际上,在同一个呼吸中,他们谈论如上面的代码片段中使用多个版本向量来排除特定引擎。但由于模糊版本逻辑,这将永远不会奏效。啊,微软。再次失败。

使用围绕元的CC的原因是不可行的,因为浏览器必须在到达CC时选择了渲染引擎。根据MS自己的文档,除了其他元组或标题之外,x-ua元必须位于标题中的任何其他元素之前。

如果有人能解决这个问题,我会全力以赴,因为我迫切希望在包括IE9的同时排除IE8的支持。

重要更新

Robocat指出,使用逗号而不是分号,因为Micrsoft显示的是正确的方法。我测试了它,它对我有用。我已更新了test page

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

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

不正确的表单(由Microsoft建议):

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

答案 2 :(得分: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>

这太令人沮丧了,这些元标记似乎都没有起作用。微软,支持你说的东西在你的文档中应该有用吗?我们要花几个小时做浏览器大战。你在浪费每个人的时间。

答案 3 :(得分:3)

如果你想让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标准

答案 4 :(得分:0)

这个适用于IE9。

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

答案 5 :(得分:-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的标准模式下呈现网页:”

然而,我不能让这个工作。

答案 6 :(得分:-1)

微软真的在这里制造了一场噩梦。我们将来会谈到这一点!

无论如何,这对我有用。

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

答案 7 :(得分:-3)

<!--[if IE 8]>
  <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<![endif]-->

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