繁体   English   中英

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

[英]Emulate IE7 for IE8 but not for IE9 using “X-UA-Compatible”

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

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

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

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

我刚玩了一玩,发现以下作品给我:

<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无关。

以上似乎是设计特征的副作用,iframes(我假定帧)全部处于IE9模式,或者全部都低于IE9模式。 人们永远不能将IE9帧与<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

编辑5:

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

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

所以,如果你使用这个:

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

不幸的是,你会得到的是IE8渲染为IE8,因为x-ua兼容引擎的模糊版本引导。 请参阅此文档: 定义文档兼容性:了解 MSDN上的内容属性值 在该部分中,您将看到在上半部分,它们定义任何定义为大于当前浏览器版本的版本向量将被解释为最大可用渲染引擎。 因此,emulateIE9 get被转换为emulateIE8。 笨。

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

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

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

重要更新

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

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

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

不正确的形式是这样(由Microsoft建议):

<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>

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM