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

我有一个网站取决于vector绘图,因特网资源pipe理器我使用VML和其他浏览器我使用SVG。 但是,IE8不支持既不回退到具有VML的IE7模式。

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

这个问题(其实是一件好事)是,IE9现在支持SVG,所以我不希望它回落到性能和兼容性差得多的IE7模式。 我怎么只告诉IE8回落到IE7模式,但让IE9留在IE9模式。

现在我正在做一个服务器端检查代理是否在头部包含EmulateIE7string,但我想尽可能避免这种情况。

我刚刚玩了一下,为我find了以下作品:

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

这是逗号不是一个分号!

我没有看过规范,但格式类似于内容=“IE = 7,铬= 1”,适用于Chrome框架。 我也发现内容=“IE = 7,9”的作品,但我怀疑这是不正确的格式。

编辑:

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

以上这些似乎是devise特性的一个副作用,即iframe(和我假设的帧)要么都是在IE9模式下,要么都小于IE9模式。 一个人不能混合IE9帧与<IE9帧,见MS问题#599022和#635648 。

编辑2:

注意IE11只支持“IE = edge”(不是IE = 11),IE = edge对IEfunction(包括用户代理)有显着的影响。

编辑3:

  • 神奇的stream程图解释了IE如何解决IE9使用的模式
  • IE8通过IE11支持IE=edge
  • Meta标签优先于HTTP标头(可以用来代替元标签)
  • IE10的更多X-UA兼容信息 。

编辑4:

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

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

其他人提到的双重模式应该可以工作(但不像微软所显示的那样 ),而且是我在MS文档中看到的最接近的东西,应该像描述的那样工作。 下面有一个更新,显示元属性值应采取的正确forms。

所以如果你使用这个:

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

不幸的是,你会得到IE8渲染IE8,因为X-UA兼容引擎的模糊版本引导。 请参阅此文档: 定义文档兼容性:了解 MSDN上的内容属性值 。 在这一节中,你会看到,在上半场,他们定义的任何版本向量被定义为大于当前浏览器版本将被解释为最大的可用渲染引擎。 因此,仿真的IE9被翻译成仿真的IE8。 笨。

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

为什么在元周围使用CC的原因是,浏览器必须在到达CC之前select了一个渲染引擎。 除了其他元数据或标题,根据MS自己的文档,x-ua meta必须在标题的其他部分之前出现。

如果任何人都可以弄清楚这一点,所有人都听到了,因为我不顾IE9的支持排除IE8的支持。

重要更新

Robocat指出,使用逗号而不是分号作为Micrsoft显示是这样做的正确方法。 我testing了它,它为我工作。 我已经更新了我的testing页面 。

所以正确的forms是(正如robocat所build议的):

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

不正确的forms是这样的(微软build议):

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

到目前为止,我已经使用了所有这些,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 8使用IE7标准和IE 9使用IE9标准这一个为我工作:

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

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

这一个适用于IE9的我。

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

我认为你需要的是:

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

然而,我为人不能得到这个工作。

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

无论如何,这对我有用。

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

这就是所谓的条件评论
http://en.wikipedia.org/wiki/Conditional_comment