//before the actual handler will be executed
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throws Exception {
// Some logic
// below statement ensures IE trusts the page formatting and will render it acc. to IE 8 standard.
response.addHeader("X-UA-Compatible", "IE=8");
return true;
}
注意, this will NOT change the fact that the browser says its in compatibility mode (称为浏览器模式),但页面 will 呈现在IE8标准模式下 . 如果它的STILL没有呈现你想要的样子,可能是因为你有javascript错误地检查了I.E.版 . 请参阅the following blog post以确定应该键入哪个属性,因为 even if you set the meta X-UA-Compatible tag, the user agent string will still say MSIE 7.0 .
19 回答
这不是一个解决方案,但我觉得这是最好的解决方案 . 在我们的内部网站点上,我们告诉人们它只能被Firefox访问,我们不会对这里的IE用户表示友好 . 检查服务器或客户端上的用户代理,并拒绝他们从IE访问 . 我是一名.NET程序员 .
我们的系统管理员通过取消选中我们组织的全局框来解决此问题 . 用户甚至不需要注销 .
我能够通过在头部区域中将元标记指定为 THE FIRST TAG 来覆盖兼容性模式,而不仅仅是第一个元标记,而且仅作为 VERY FIRST TAG .
感谢@ stefan.s让我在你的优秀答案中得到它 . 在阅读之前我有:
这不行
将链接标记移开并且工作正常
THIS WORKS :
所以设置为使用兼容性的IE8客户端将页面呈现为IE8标准模式 - content ='IE = 9'表示使用最高标准,包括IE9 .
我一直在努力解决这个问题,并希望帮助提供独特的解决方案和洞察力 .
某些基于AJAX的框架将在
<head>
的开头注入javascripts和样式表,这样做似乎阻止了成熟的元标记解决方案正常工作 . 在这种情况下,我发现直接注入HTTP响应头,很像Andras Csehi的答案将解决问题 .但是对于我们这些使用Java Servlets的人来说,解决这个问题的一个好方法是使用ServletFilter .
Michael Irigoyen是正确的,但它有点复杂......
如果您正在使用Paul Irish的精彩样板,那么您将拥有以下内容: -
如果你选中了"Display intranet sites in compatibility view",这将无法正常工作并强制IE进入 Intranet 环境中的兼容模式 . 您需要删除条件IE注释以防止Intranet兼容模式 .
所以下面的代码将起作用:
基本上,如果您在
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
语句之前触发条件IE注释,那么如果您使用默认设置运行IE9,则将在 Intranet 环境中强制进入兼容模式 .UPDATE — ADDITIONAL INFO: 但请注意,有一个技巧可以使HTML5 boilplate工作:
添加一个emtpy条件注释 before DOCTYPE . 还要注意,当你这样做时,你还可以在
X-UA-Compatible
指令周围添加条件注释,使页面HTML5也有效 . 例如:blog post that was inspired by the first part of this answer,有更多细节 . And by the way: 如该博客文章中所述,还可以使用 no condition :
<!--[]-->
替换带有半条件注释的DOCTYPE之前的条件注释 . 因此,像这样:但请注意,后者的变体(
<--[]--><!DOCTYPE html>
),如this answer to another question所解释,将激活众所周知的问题 - 对于没有支持X-UA-Compatioble
的传统IE版本(读取:用于IE7和IE6) - 将浏览器带入怪癖 - 模式 .我们可以通过在RequestInterceptor方法中添加一行来解决Spring-Apache-tomcat环境中的这个问题 -
引用 - How to create filter and modify response header它介绍了我们如何通过RequestInterceptor(Spring)解决这个问题 .
有同样的问题 . 它通过使用工作
试试这个metatag:
它应该强制IE8呈现为IE8标准模式,即使“在兼容性视图中显示内部网站点”被检查[内联网或所有网站],我在IE 8.0.6上尝试了我自己
对于其他阅读此内容的人,希望通过GPO为所有用户禁用此功能,这是设置:
计算机配置/管理模板/ Windows组件/ Internet Explorer /兼容性视图/打开本地Intranet的Internet Explorer标准模式
虽然web.config编辑为我修复了它 .
可以覆盖Intranet中的兼容模式 .
对于IIS,只需将以下代码添加到web.config即可 . 用IE9为我工作 .
相当于Apache:
对于nginx:
对于express.js:
如果您希望您的网站强制使用IE 8标准模式,请使用此metatag以及有效的DOCTYPE:
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />
注意"EmulateIE8"值而不是普通的"IE8" .
根据IE开发人员的说法,这应该是“在IE8标准模式下显示标准DOCTYPE;在Quirks模式下显示怪癖DOCTYPE . 使用此标记覆盖客户端计算机上的兼容性视图,并强制标准符合IE8标准 . ”
关于这个IE博客文章的更多信息:http://blogs.msdn.com/b/ie/archive/2008/08/27/introducing-compatibility-view.aspx
在这个问题的答案中存在一定程度的混淆 .
最佳答案目前是服务器端解决方案在http标头中设置一个标志,一些注释表明使用元标记的解决方案不起作用 .
我认为这篇博客文章很好地概述了如何使用兼容性元信息,并在我的经验中如上所述:http://blogs.msdn.com/b/cjacks/archive/2012/02/29/using-x-ua-compatible-to-create-durable-enterprise-web-applications.aspx
要点:
使用元标记和 Headers 设置信息都有效
元标记优先于标头
元标记必须是第一个标记,以确保浏览器在基于启发式之前不确定渲染引擎
一个重点(我认为很多混淆来自这一点)是IE有两个“类”模式:
文档模式
浏览器模式
文档模式确定呈现引擎(如何呈现网页) .
浏览器模式确定IE向服务器发送的用户代理(UA)字符串,IE默认的文档模式,以及IE如何评估条件注释 .
有关文档模式与浏览器模式的信息,请参阅以下文章:http://blogs.msdn.com/b/ie/archive/2010/06/16/ie-s-compatibility-features-for-site-developers.aspx?Redirected=true
根据我的经验,兼容性元数据将 only influence the document mode . 因此,如果您依赖浏览器检测,这对您没有帮助 . 但是如果你正在使用特征检测,这应该是要走的路 .
所以我建议使用这种语法使用元标记(在html页面中):
注意:列出您已测试的浏览器模式 .
该博客文章还建议不要使用EmulateIEX . 这里有一个引用:
更改.htaccess中的 Headers
在这里找到了解决这个问题的方法:https://github.com/h5bp/html5-boilerplate/issues/378
Stefan S关于文档模式与浏览器模式的评论与我的问题非常相关 .
我在页面中有X-UA-Content元数据,但我通过
navigator.appVersion
在客户端测试浏览器版本 . 此测试不反映元数据,因为它提供的是浏览器模式而不是文档模式 .我的答案是测试
document.documentMode
之类的东西:现在,我的meta X-UA-Content标签反映在我的浏览器测试中 .
为什么我要测试浏览器这样的东西?速度 . 各种我的jQuery插件,比如tablesorter在IE6 / 7上的速度太慢了,我想关闭它们 . 我不确定测试浏览器功能可以帮助我解决这个问题 .
如果您下拉“工具”菜单并选择“兼容性视图设置”在该对话框的底部是“在兼容模式下显示Intranet站点”设置 . 如果取消选中此项应解决问题,IE将使用基于DOCTYPE的模式 .
我找到了一个可以覆盖已检查的Intranet兼容性视图的工作答案 . 只需在此行的页面的OnInit事件中添加(不需要meta或web.config customHeader):
尝试在 Headers 中添加以下内容:
礼貌Paul Irish's HTML5 Boilerplate(但它也适用于XHTML Transitional) .
这个问题与Force "Internet Explorer 8" browser mode in intranet重复 .
那里的响应表明无法禁用兼容性视图(在服务器端) - https://stackoverflow.com/a/4130343/24267 . 这似乎确实如此,因为我尝试过的建议都没有奏效 . 在IE8中,无论您发送什么样的X-UA兼容标头,"Browser Mode"都会设置为Internet Explorer 8兼容性视图 .
我不得不为IE7和兼容模式做一些特殊处理,这导致浏览器使用IE8渲染,但报告它是IE7,打破了我的代码 . 这是我修复我的代码的方式(我知道这是一个可怕的黑客,我应该测试的功能不是浏览器版本):
在页面 Headers 内添加此内容(定位到您想要的IE版本):
注意, this will NOT change the fact that the browser says its in compatibility mode (称为浏览器模式),但页面 will 呈现在IE8标准模式下 . 如果它的STILL没有呈现你想要的样子,可能是因为你有javascript错误地检查了I.E.版 . 请参阅the following blog post以确定应该键入哪个属性,因为 even if you set the meta X-UA-Compatible tag, the user agent string will still say MSIE 7.0 .
在我的情况下,为了修复我不得不添加一个IE7兼容模式的检查 . 我这样做是使用一个简单的JavaScript代码: