默认情况下,IE8强制Intranet网站进入兼容模式。我尝试将meta标头更改为IE8,但它不承认meta标头,仅使用浏览器设置。有谁知道如何禁用此功能?
默认情况下,IE8强制Intranet网站进入兼容模式。我尝试将meta标头更改为IE8,但它不承认meta标头,仅使用浏览器设置。有谁知道如何禁用此功能?
Answers:
在Intranet中可以覆盖兼容模式。
对于IIS,只需将以下代码添加到web.config。使用IE9为我工作。
<system.webServer>
<httpProtocol>
<customHeaders>
<clear />
<add name="X-UA-Compatible" value="IE=edge" />
</customHeaders>
</httpProtocol>
</system.webServer>
与Apache等效:
Header set X-UA-Compatible: IE=Edge
对于nginx:
add_header "X-UA-Compatible" "IE=Edge";
对于express.js:
res.set('X-UA-Compatible', 'IE=Edge')
Michael Irigoyen是正确的,但要复杂一点。
如果您使用的是保罗·爱尔兰(Paul Irish)的精彩样板,那么您将获得以下内容:
<!doctype html>
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
这将无法正常工作,并会迫使IE在Intranet中进入兼容模式如果您已选中“在兼容性视图中显示Intranet站点”,则环境中。您需要删除条件IE注释以防止Intranet兼容模式。
因此,以下代码将起作用:
<!doctype html>
<html class="no-js" lang="en">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
基本上,如果您在<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
语句之前触发条件IE注释,那么您将被迫进入Intranet中的兼容模式如果使用默认设置运行IE9,则将在内环境中。
更新—其他信息: 但是请注意,有一个技巧可以使HTML5样板工作:
在DOCTYPE 之前添加一个空的条件注释。并注意为好,当你做那个,那么你可以还添加条件注释周围的X-UA-Compatible
指令,使得网页HTML5,也有效。因此,例如:
<!--[if HTML5]><![endif]-->
<!doctype html>
<!--[if the boilerplate conditionals goes here<![endif]-->
<head>
<!--[if !HTML5]>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<![endif]-->
一,是由这个答案的第一部分灵感的博客文章,有更多详细信息。顺便说一句:由于在博客中提到的,还可以代替用的DOCTYPE前的条件注释半条件与评论没有条件:<!--[]-->
。因此,像这样:
<!--[]-->
<!doctype html>
<!--[if the boilerplate conditionals goes here<![endif]-->
<head>
<!--[if !HTML5]>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<![endif]-->
但是请注意,后一种变体(<--[]--><!DOCTYPE html>
),例如通过另一个问题的答案所解释的,将激活众所周知的问题,即对于不支持IE的旧版IE版本X-UA-Compatioble
(针对IE7和IE6,请参见:)怪癖模式。
如果下拉“工具”菜单并选择“兼容性视图设置”,则该对话框底部的设置为“以兼容模式显示Intranet站点”。如果您取消选中此选项,则可以解决问题,并且IE将使用基于DOCTYPE的模式。
这个问题的答案有一定的困惑。
当前,最佳答案是服务器端解决方案,该解决方案在http标头中设置了一个标志,并且一些注释表明使用meta标签的解决方案不起作用。
我认为此博客条目很好地概述了如何使用兼容性元信息,根据我的经验,该工作如下所述: http //blogs.msdn.com/b/cjacks/archive/2012/02/29/using-x- ua兼容创建耐用型企业web应用程序.aspx
要点:
重要的一点(我认为很多困惑都来自这一点)是IE具有两种“类”模式:
文档模式确定渲染引擎(如何渲染网页)。
浏览器模式确定IE将哪些User-Agent(UA)字符串发送到服务器,IE默认使用的文档模式以及IE如何评估条件注释。
可以在本文中找到有关文档模式与浏览器模式的更多信息:http : //blogs.msdn.com/b/ie/archive/2010/06/16/ie-s-compatibility-features-for- site-developers.aspx?Redirected = true
以我的经验,兼容性元数据只会影响文档模式。因此,如果您依赖浏览器检测,这将无济于事。但是,如果您使用的是特征检测,则应该这样做。
因此,我建议使用以下语法使用meta标记(在html页面中):
<meta http-equiv="X-UA-Compatible" content="IE=9,10" ></meta>
注意:列出您已测试过的浏览器模式。
该博客文章还建议不要使用EmulateIEX。这里引用:
话虽如此,我确实感到奇怪的是,当应用程序请求EmulateIE7或EmulateIE8时。这些仿真模式本身就是决策。因此,您不是要具体想要什么,而是要问两件事之一,然后通过在代码中的其他地方查找DOCTYPE来确定这两件事中的哪一个(然后尝试了解该DOCTYPE是否会为您提供标准或根据其内容而有所不同-有时会令人困惑的任务)。与其说这样做,不如说是直接指定您想要的内容,而不是给出本身就是问题的答案,这显然更有意义。如果要IE7标准,请使用IE = 7,而不是IE = EmulateIE7。(请注意,这并不意味着您不应使用DOCTYPE,而应该使用。)
试试这个元标记:
<meta http-equiv="X-UA-Compatible" content="IE=8" />
即使选中了“在兼容性视图中显示Intranet网站”(对于Intranet或所有网站),它也应强制IE8呈现为IE8标准模式。我在IE 8.0.6上尝试了自己的方法
我找到了一个可行的答案,可以覆盖已检查的Intranet兼容性视图。只需在页面的OnInit事件中添加以下行(不需要meta或web.config customHeader):
Response.AddHeader("X-UA-Compatible", "IE=EmulateIE8");
尝试将以下内容放在标题中:
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
礼貌保罗爱尔兰的HTML5样板(但它工作在XHTML过渡,太)。
通过将meta标签指定为头部中的THE FIRST TAG,我能够覆盖兼容性模式,而不仅是第一个meta标签,而且还指定为VERY FIRST TAG。
感谢@ stefan.s为您提供了出色的答复,让我投入其中。在阅读之前,我有:
这没用
<head>
<link rel="stylesheet" type="text/css" href="https://stackoverflow.com/qmuat/plugins/editors/jckeditor/typography/typography.php"/>
<meta http-equiv="x-ua-compatible" content="IE=9" >
移开了链接标签,它起作用了
这项工作:
<head><meta http-equiv="x-ua-compatible" content="IE=9" >
因此,设置为使用兼容性的IE8客户端会将页面呈现为IE8标准模式-content ='IE = 9'表示使用直到IE9(包括IE9)的最高标准。
这并非完全解决方案,但我认为这是最好的解决方案。在我们的Intranet网站上,我们告诉人们只能通过Firefox访问它,我们对这里的IE用户并不友好。检查服务器或客户端上的用户代理,并拒绝他们从IE访问。我是.NET程序员。
我一直在努力解决这个问题,并希望提供独特的解决方案和见解。
某些基于AJAX的框架会在开始时注入javascript和样式表,<head>
并且这样做似乎妨碍了已建立好的元标记解决方案正常工作。在这种情况下,我发现直接注入HTTP响应标头中,就像Andras Csehi的答案一样可以解决该问题。
但是,对于那些使用Java Servlet的人来说,解决此问题的一种好方法是使用ServletFilter。
public class EmulateFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletResponse response = ((HttpServletResponse)arg1);
response.addHeader("X-UA-Compatible", "IE=8");
arg2.doFilter(arg0, arg1);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
我们可以在Spring-Apache-tomcat环境中通过在RequestInterceptor方法中添加一行来解决此问题-
//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;
}
参考- 如何创建过滤器和修改响应标头涵盖了如何通过RequestInterceptor(Spring)解决此问题。
如果希望您的网站强制执行IE 8标准模式,请将该元标记与有效的DOCTYPE一起使用:
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />
注意“ EmulateIE8”值,而不是普通的“ IE8”。
根据IE开发人员的说法,这应该是“在IE8标准模式下显示标准DOCTYPE;在奇异模式下显示怪异DOCTYPE。使用此标记可覆盖客户端计算机上的兼容性视图,并将标准强制为IE8标准。”
有关此IE博客文章的更多信息:http : //blogs.msdn.com/b/ie/archive/2008/08/27/introducing-compatibility-view.aspx
此问题是Intranet中Force“ Internet Explorer 8”浏览器模式的重复。
那里的响应表明无法禁用兼容性视图(在服务器端)-https://stackoverflow.com/a/4130343/24267。似乎确实是这样,因为我尝试过的建议都没有奏效。在IE8中,无论您发送哪种X-UA兼容标头,“浏览器模式”都将设置为Internet Explorer 8兼容性视图。
我必须对IE7和兼容模式进行一些特殊处理,这导致浏览器使用IE8进行渲染,但报告它是IE7,这破坏了我的代码。这就是我修复代码的方式(我知道这是一个可怕的黑客,我应该测试功能而不是浏览器版本):
isIE8 = navigator.appVersion.indexOf(“ MSIE”)!= -1 && parseFloat(navigator.appVersion.split(“ MSIE”)[1])== 8; 如果(!isIE8 && navigator.appVersion.indexOf(“ MSIE”)!= -1 && parseFloat(navigator.appVersion.split(“ MSIE”)[1])== 7 && navigator.appVersion.indexOf(“ Trident”) != -1){ //骗子,这是兼容模式下的IE8。 isIE8 = true; }
将此添加到您的页面标题标签中(定位到您想要的IE版本):
<meta http-equiv="X-UA-Compatible" content="IE=8" />
请注意,这不会改变浏览器说它处于兼容模式(称为浏览器模式)的事实,但是页面将以 IE8标准模式呈现。如果它仍然无法呈现您的期望,那可能是因为您使用的JavaScript错误地检查了IE版本。请参阅以下博客文章,确定您应该键入的属性,因为即使您设置了meta X-UA-Compatible标签,用户代理字符串仍然会显示MSIE 7.0。
就我而言,要解决此问题,我必须添加对IE7兼容模式的检查。我这样做是使用简单的javascript代码:
//IE8 and later will have the word 'trident' in its user agent string.
if (navigator.userAgent.indexOf("Trident")>-1) { //do something }
对于其他希望通过GPO对所有用户禁用此功能的用户,此设置为:
计算机配置/管理模板/ Windows组件/ Internet Explorer /兼容性视图/打开本地Intranet的Internet Explorer标准模式
尽管web.config编辑为我修复了它。
更改.htaccess中的标题
BrowserMatch MSIE ie
Header set X-UA-Compatible "IE=Edge,chrome=1" env=ie
在这里找到解决此问题的方法:https://github.com/h5bp/html5-boilerplate/issues/378
Stefan S关于文档模式与浏览器模式的评论与我的问题非常相关。
我的页面中有X-UA-Content元数据,但是我正在通过客户端测试浏览器版本navigator.appVersion
。该测试不反映元数据,因为它提供的是浏览器模式而不是文档模式。
对我来说,答案是测试以下内容document.documentMode
:
function IsIE(n)
{
if (navigator.appVersion.indexOf("MSIE ") == -1) return false;
var sDocMode = document.documentMode;
return (isFinite(sDocMode) && sDocMode==n);
}
现在,我的meta X-UA-Content标签反映在我的浏览器测试中。
为什么我会做这样的皱眉来测试浏览器?速度。我的各种jQuery加载项(如表排序器)在IE6 / 7上都太慢了,我想将其关闭。我不确定测试浏览器功能是否可以帮助我解决此问题。