使用标签强制关闭IE兼容模式

382

我正在为一个要求所有内部网站强制使用兼容性模式的客户工作。我想知道是否有一个标签可以放入我的HTML中,用于关闭兼容性模式。


我认为你正在寻找的答案在这里:https://dev59.com/YXNA5IYBdhLWcg3wUL9Y - Gabriel
45
实际上,我正在寻找完全相反的情况,谁会将它们的标准设置为兼容模式,那太疯狂了。 - Al Katawazi
13
这是一款老应用程序上糟糕的JavaScript代码,除IE7以外的任何浏览器都会导致崩溃,这就是他们将标准设置为兼容性的原因。总有一天,我们会着手替换它... - pete the pagan-gerbil
相关问题:https://dev59.com/8mw15IYBdhLWcg3wMY2L - Adriano
1
@petethepagan-gerbil,你有没有想办法替换它? :P - icedwater
1
@icedwater 我已经离开公司超过6年了 :) 每当我们在同一领域进行更改时,我们都会进行小的改进以消除问题,但技术债务从未成为优先事项。不知道最终是否解决了这个问题。 - pete the pagan-gerbil
12个回答

547

有"边缘"模式

<html>
   <head>
      <meta http-equiv="X-UA-Compatible" content="IE=edge" />
      <title>My Web Page</title>
   </head>
   <body>
      <p>Content goes here.</p>
   </body>
</html>

根据MSDN页面:

Edge模式告诉Windows Internet Explorer以最高可用模式显示内容,这实际上打破了“锁定”范例。在Internet Explorer 8中,这相当于IE8模式。如果(假设的)将来的Internet Explorer版本支持更高的兼容性模式,则设置为Edge模式的页面将以该版本支持的最高模式显示;但是,在Internet Explorer 8中查看这些页面时,它们仍将以IE8模式显示。

然而,“edge”模式不鼓励在生产环境中使用:

建议Web开发人员将Edge模式的使用限制在测试页面和其他非生产用途中,因为在未来的Windows Internet Explorer版本中呈现页面内容可能会产生意想不到的结果。

但我老实说并不完全明白原因。但根据此文,目前最好的方式是使用IE = 8


7
截至2012年8月6日,微软似乎在其自有网站上使用IE=10。如果你已经在IE10(预览版)中测试过你的网站,则可以使用此选项;否则,建议暂时仍使用IE=9 - calvinf
75
如果用户(或系统管理员)通过转到“工具-兼容性视图设置”并勾选“在兼容性视图中显示所有网站”,将兼容性模式作为默认模式打开,则此方法无效。为了解决问题,需要在HTTP响应头中添加以下内容:“X-UA-Compatible: IE=edge”。 - speedplane
10
+1 增加速度飞机 - IE10 兼容模式默认开启内部网站 - 噢...谢谢你发现这个! - viperguynaz
132
对于那些发现这篇答案但无法让它工作的人,我有一个建议。兼容性元标记“必须”是第一个元标记,并且在该标记之前不能有任何IE条件语句。更多信息请参见:http://tesmond.blogspot.com/2011/10/ie9-intranet-compatibility-mode-in.html - Chris Sobolewski
2
谢谢Chris!当我终于读到你的评论时,我已经为此苦苦挣扎了30分钟。一开始我没有想到这个。 - Hawkee
显示剩余7条评论

95

经过多个小时的故障排除...以下是一些快速亮点,来自于X-UA-Compatible的文档: http://msdn.microsoft.com/en-us/library/cc288325(VS.85).aspx#ctl00_contentContainer_ctl16

使用<meta http-equiv="X-UA-Compatible" content=" _______ " />

  • 标准用户代理模式(非仿真模式)会忽略您页面中的<!DOCTYPE>指令,并根据IE该版本支持的标准进行渲染(例如,IE=8将更好地遵守表格边框间距和某些伪类选择器,而不是IE=7)。

  • 相反,仿真模式会告诉IE遵循您页面中的任何<!DOCTYPE>指令,基于您选择的版本渲染标准模式和基于IE=5的怪癖模式。

  • content属性的可能值为:

    content="IE=5"

    content="IE=7"

    content="IE=EmulateIE7"

    content="IE=8"

    content="IE=EmulateIE8"

    content="IE=9"

    content="IE=EmulateIE9"

    content="IE=edge"


68

如果您正在使用内部网区域的页面,则可能会发现无论您做什么,IE9 都会进入 IE7 兼容模式。

这是由于 IE 兼容性设置中的设置导致的,该设置表示所有内部网站都应在兼容性模式下运行。 您可以通过组策略取消此选项(或在 IE 中取消勾选它),或者可以设置以下内容:

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

这个方法是有效的(如其他答案所述),但可能一开始并不明显:它需要在样式表声明之前出现。如果你没有这样做,它将被忽略。


3
谢谢你提醒样式表的问题,这导致了一些麻烦,我现在知道原因了! - eMRe
是的,最初被放置搞糊涂了。感谢您添加这个。 - John Moylan
谢谢,那非常有帮助。他们有一个GPO(组策略对象),将有效的IE版本设置为7,即使已经安装了IE 11。这让我不必在站点中添加一些shim来使JS正常工作。 - Charles Owen

30

我相信这个方法会奏效:

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

30
此答案中建议的那样,可以在Web.Config文件中设置"edge"模式。这将使其适用于应用程序返回的所有HTML,而无需将其插入到各自页面中:
<configuration>
    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <add name="X-UA-Compatible" value="IE=edge" />
            </customHeaders>
        </httpProtocol>
    </system.webServer>
</configuration>

这个步骤也可以通过使用IIS管理器修改“HTTP响应头”来完成,可应用于整个IIS服务器、网站或特定应用程序。


20

元标签解决方案对我们不起作用,但将其设置在响应头中确实有效:

header('X-UA-Compatible: IE=edge,chrome=1');

3
"+1" 对于 "chrome=1";我以前不知道这个。值得一提的是,将它改为 "IE=10" 解决了我的网站上许多渲染问题,而 "IE=edge" 则没有任何作用。 - user1720624
1
chrome=1 属性的解释,https://dev59.com/kmEh5IYBdhLWcg3wwlu8#22059516。请注意,Chrome Frame 已经被淘汰。http://blog.chromium.org/2013/06/retiring-chrome-frame.html - Gajus
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - felickz
我试图将它放在布局页面的第一行。但是没有效果。Stu提到了更改IIS HTTP响应头。我尝试了。我重新启动了应用程序池。我进行了更多的检查。这个页面嵌套在其他页面下面。另一个页面确实有另一个meta。这是生产网站。很多人正在访问这个页面。把这个标签放在顶部是不可能完成的任务。还有其他解决方案吗?或者我已经搞砸了吗? - user12345

11

IE8在Internet下默认为标准模式,在Intranet下默认为怪异模式。

如果doctype设置为xhtml transitional,则HTML meta标签将被忽略。

解决方法是在代码中添加HTTP头。

我们采用这种方法解决了问题。

现在我们的Intranet网站能够强制IE8以标准模式呈现应用程序。

在基本页面类(ASP.net C #)的PageInit中添加:

Response.AddHeader("X-UA-Compatible", "IE=EmulateIE8");

reference: http://ilia.ws/archives/196-IE8-X-UA-Compatible-Rant.html


10

根据我最近的经验,这个主题还有一些需要注意的地方。 我工作的大学为所有内部网站设置了兼容模式的IE 8笔记本电脑。 我尝试添加元标记以禁用我的网站提供的页面上的此模式,但IE始终忽略此标记。 正如Lance在他的帖子中提到的那样,添加响应头解决了此问题。 这是基于HTML5锅炉板方法设置标题的方式:

<IfModule mod_headers.c>
  Header set X-UA-Compatible "IE=edge,chrome=1"
  # mod_headers can't match by content-type, but we don't want to send this header on *everything*...
  <FilesMatch "\.(appcache|crx|css|eot|gif|htc|ico|jpe?g|js|m4a|m4v|manifest|mp4|oex|oga|ogg|ogv|otf|pdf|png|safariextz|svg|svgz|ttf|vcf|webm|webp|woff|xml|xpi)$">
    Header unset X-UA-Compatible
  </FilesMatch>
</IfModule>

为了确保该标题实际发送,您必须确保在Apache中启用了mod_headers。如果您想确保已启用此mod,请将以下内容放入可以运行php的页面中:
<pre>
<?php
    print_r(apache_get_modules());
?>
</pre>

使用 .htaccess 方法对我有效,在 IE8+ 中,它移除了兼容性按钮(即敌人 No.1),强制IE8避免使用兼容模式。相关:元标签替代方法似乎只在某些条件下(IE Voodoo)在各种计算机上工作。 - William Isted

3
这是由于IE兼容性设置中的一个选项,该选项指定所有内部网站都应在兼容模式下运行。您可以通过组策略(或在IE中取消勾选)来取消此选项,或者可以设置以下内容:
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />

显然不可能通过群组策略更改兼容性视图设置,但或许可以在注册表中进行更改。这个元标记对我很有用,我必须使所需属性作为HTML表单的一部分工作,在Chrome和Firefox中有效,但不适用于IE。
这是一个漂亮的可视化图表,显示了每个HTML 5元素支持的浏览器。

http://html5readiness.com/

请注意,Google Chrome 是一个共同的因素,它支持所有东西。希望这能够帮到你。

看起来Firefox和IE 10现在也支持所有功能。与Chrome相比,图表并没有表达得那么清楚。 - Tony L.

1
如果您可以访问服务器,则最可靠的方法是在IIS中直接进行操作。进入IIS HTTP响应标头。添加以下内容: 名称:X-UA-Compatible
值:IE=edge 这将覆盖您的浏览器和代码。

如果在网站级别设置了此项,则在部署到IIS时会重置。 - Eman Pitts

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