ChatGPT解决这个技术问题 Extra ChatGPT

默认情况下,IE8 强制 Intranet 网站进入兼容模式。我尝试将元标头更改为 IE8,但它不承认元标头,只是使用浏览器设置。有谁知道如何禁用它?

试试 stackoverflow.com/questions/2742853/…,它对我有用。
在你的页面头标签中添加这个:<meta http-equiv="X-UA-Compatible" content="IE=8" /> (针对您想要的 IE 版本)。请注意,这不会改变浏览器说它处于兼容模式(称为浏览器模式)的事实,但页面将以 IE8 标准模式呈现。如果您检查 IE8 或更高版本,您将需要更改 javascript 以检查“三叉戟”。请参阅:blogs.msdn.com/b/mikeormond/archive/2008/09/25/…
@n00b - 这对我的网站没有影响。
我的理解是 meta 标签必须紧跟在 head 标签之后。我注意到一些脚本会在索引 0 处插入 head;因此,元标记将不再位于 head 之后。

B
Blexy

可以覆盖 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')

这是正确的答案。元标记没有任何作用,但添加响应标头有效。更多信息:social.msdn.microsoft.com/Forums/is/iewebdevelopment/thread/…
同意。这应该是正确的答案,因为它仅正确覆盖了本网站的 Intranet 设置。
(澄清:它适用于文档模式,但不适用于浏览器模式)
这不是正确的答案。这个答案改变了文档模式,它不会改变重要的“浏览器模式”。我仍在寻找解决该问题的方法。
这不是正确的答案,因为它是特定于 .net 的(甚至不承认这一事实)。
C
Community

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

如果您选中了“在兼容性视图中显示 Intranet 站点”,这将无法按预期工作并强制 IE 进入 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 注释,那么如果您使用默认设置运行 IE9,您将被迫进入 Intranet 环境中的兼容模式。

更新 - 附加信息:但请注意,有一个技巧可以使 HTML5 样板工作:

在 DOCTYPE 之前添加一个空的条件注释。另请注意,当您执行 that 时,您可以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]-->

blog post that was inspired by the first part of this answer,有更多细节。 顺便说一句:正如那篇博文中提到的,还可以将 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]-->

但请注意,如 this answer to another question 所解释的,后一种变体 (<--[]--><!DOCTYPE html>) 将激活众所周知的问题,即它 - 对于不支持 X-UA-Compatioble 的旧版 IE 版本(阅读:对于 IE7 和 IE6) - 带来浏览器进入怪癖模式。


这并没有为我解决问题。但是,仅供参考,将“X-UA-Compatible”添加为标头确实解决了问题!
P
PilotBob

如果您下拉“工具”菜单并选择“兼容性视图设置”,则在底部的对话框中设置“以兼容模式显示 Intranet 站点”。如果您取消选中此项应该可以解决问题,并且 IE 将使用基于 DOCTYPE 的模式。


我没有投反对票,但我猜这是因为您从用户的角度回答(用户应该做什么)。这个问题来自 Web 开发人员,询问如何在不要求用户特别做任何事情的情况下解决问题。
此外,这不允许保持与旧应用程序的兼容性。如果您取消选中该设置,您的旧应用程序可能会因无法更新而中断。我认为提问者正在寻找一种方法来强制标准模式,当他们的 Intranet 上的所有其他应用程序都需要检查复选框的兼容性模式时。
我相信他确实从程序员的角度回答了这个问题。 “...IE 将使用基于 DOCTYPE 的模式”。请参阅:msdn.microsoft.com/en-us/library/ms535242%28VS.85%29.aspx 如果公司正在运行 Active Directory,管理员可以传播对浏览器设置的更改。你不能用 FireFox 做到这一点!
@AndrewLewis 也许。但是,URL 栏中有一个兼容模式按钮,可以将浏览器设置为对该特定站点使用兼容模式。或者您可以在对话框中手动添加它们。再一次,这些东西可以由 IT 在全球范围内完成。
@PilotBob 如果您有 120K+ 用户和数百个(如果没有数千个)要支持的 Intranet 站点,那么这不是一个可行的解决方案。
s
stefan.s

这个问题的答案存在一定程度的混淆。

最佳答案目前是一个服务器端解决方案,它在 http 标头中设置了一个标志,并且一些评论表明使用元标记的解决方案不起作用。

我认为这篇博客文章很好地概述了如何使用兼容性元信息,并且根据我的经验,其工作方式如下所述:http://blogs.msdn.com/b/cjacks/archive/2012/02/29/using-x-ua-compatible-to-create-durable-enterprise-web-applications.aspx

要点:

使用元标记和标题设置信息都有效

元标记优先于标头

元标记必须是第一个标记,以确保浏览器不会在之前基于启发式确定渲染引擎

重要的一点(我认为这一点引起了很多混乱)是 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

以我的经验,兼容性元数据只会影响文档模式。因此,如果您依赖浏览器检测,这将无济于事。但是,如果您使用的是特征检测,这应该是可行的方法。

因此,我建议使用以下语法使用元标记(在 html 页面中):

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

注意:列出您测试过的浏览器模式。

该博客文章还建议不要使用 EmulateIEX。这里引用一段话:

话虽如此,我确实觉得奇怪的一件事是当应用程序请求 EmulateIE7 或 EmulateIE8 时。这些模拟模式本身就是决定。因此,您不是具体说明您想要什么,而是要求两件事之一,然后通过在代码中的其他地方查找 DOCTYPE 来确定这两件事中的哪一个(然后尝试了解该 DOCTYPE 是否会给您标准或怪癖取决于其内容——另一个有时令人困惑的任务)。与其那样做,我认为直接指定你想要什么比给出本身就是一个问题的回答更有意义。如果您想要 IE7 标准,请使用 IE=7,而不是 IE=EmulateIE7。 (请注意,这并不意味着您不应该使用 DOCTYPE——您应该使用。)


如何更改浏览器模式?
浏览器模式语句令人困惑
@JusticeFist 是的,你是对的,谢谢。我试图改进它。
@VishnudevK 我知道的唯一方法是使用开发人员工具。但是您可能想要一个程序化的解决方案。
A
Ala' Alnajjar

试试这个元标记:

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

即使选中“在兼容性视图中显示 Intranet 站点”,它也应该强制 IE8 呈现为 IE8 标准模式 [对于 Intranet 或所有网站],我在 IE 8.0.6 上自己尝试过


这实际上是正确的,但它必须出现在页面上的任何和所有 META 标记之前,否则它将不起作用。
这对我不起作用。据我所知,IE8“以兼容模式显示 Intranet 站点”是不可覆盖的
(澄清一下:它适用于文档模式,但不适用于浏览器模式。所以渲染是固定的,但浏览器仍然假装是 IE7)
J
James Lawruk

我们的系统管理员通过取消选中我们组织的全局复选框来解决此问题。用户甚至不需要注销。

https://i.stack.imgur.com/TBuRY.jpg


如果 Intranet 上的所有站点都可以使用最新的 Web 标准,则此解决方案非常有效。但是,如果有些人不能,那么这种方法会无意中破坏那些......我会谨慎行事。
C
Cyrille Perrot

我找到了一个允许覆盖选中的 Intranet Compatibility View 的有效答案。只需在页面的 OnInit 事件中添加这一行(不需要 meta 或 web.config customHeader):

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

开发平台特定的答案......甚至没有指定平台。我猜你在谈论 Visual Studio .NET?据我所知,“OnInit”事件不存在(在 Javascript、Java、PHP 中......)
G
Gabe

尝试将以下内容放在标题中:

<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

礼貌Paul Irish's HTML5 Boilerplate(但它也适用于 XHTML Transitional)。


P
PeteS_UK

我能够通过将元标记指定为头部中的第一个标记来覆盖兼容模式,而不仅仅是第一个元标记,而且仅作为非常第一个标记。

感谢@stefan.s 在您出色的回答中让我接受。在阅读之前,我有:

这不起作用

<head> 
<link rel="stylesheet" type="text/css" href="/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。


C
Caimen

这不完全是一个解决方案,但我觉得它是最好的一个。在我们的 Intranet 站点上,我们告诉人们它只能通过 Firefox 访问,我们对这里的 IE 用户不友好。检查服务器或客户端的用户代理并拒绝他们从 IE 访问。我是一名.NET 程序员。


我喜欢你的想法。但是我们这里没有firefox。
最糟糕的。建议。曾经。这与所有仅支持 IE 的 Intranet 站点一样糟糕。尝试做一些额外的工作,让你的东西在所有常见的浏览器上运行。这并不难。
@mhenry1384 想解释一下为什么锁定 Intranet 系统是一个糟糕的建议?您不必为旧浏览器支持夸克。您知道您的用户将获得预期的体验。它不是公共系统,谁在乎,你还支持 IE 5.5 吗?我告诉我的公共用户更新。无论如何,我不应该在后端系统上浪费时间,需要我的是公众。这不像我将它锁定到 IE 6 并需要 ActiveX 之类的。例如我的系统允许 Firefox 6 及更高版本。所以如果 Firefox 27 出来了,它仍然可以工作。要么对我投反对票,要么提出实际的论点。
我使用的每个被锁定到特定浏览器的 Intranet 站点都被锁定到 IE。这让我发疯,因为我和下一个人一样讨厌 IE。强迫您的用户使用您选择的浏览器(而不是他们的浏览器),即使它不是 IE,也似乎与网络相反,甚至与 Intranet 网络相反。让一个网站在 IE7/8/9 中运行通常并不难,特别是如果您使用像 jQuery 这样的库。让用户使用他们想要的东西。
例如,为 Firefox 10 编写的网站,根据我的经验,几乎总是可以在 IE9 上完美运行而无需修改。因此,限制用户使用 IE9 意味着还有其他事情发生。它表明你是在一个理想的使命,而不是试图编写好的网络软件的人。如果只是没有时间测试Firefox以外的浏览器的问题,您是否也限制人们使用Opera? 【抱歉这么啰嗦。我应该回去解决我遇到的这个该死的 IE8 问题... :-) ]
m
maple_shaft

我一直在努力解决这个问题,并希望帮助提供独特的解决方案和见解。

某些基于 AJAX 的框架会在 <head> 的开头注入 javascript 和样式表,这样做似乎会阻止完善的元标记解决方案正常工作。在这种情况下,我发现直接注入 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 {
}

}

k
karan_s438

我们可以在 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;
}

来自 - How to create filter and modify response header 的参考它涵盖了我们如何通过 RequestInterceptor (Spring) 解决这个问题。


a
ashtonium

如果您希望您的网站强制使用 IE 8 标准模式,请将此元标记与有效的 DOCTYPE 一起使用:

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

请注意“EmulateIE8”值而不是普通的“IE8”。

根据 IE 开发人员的说法,这应该是“在 IE8 标准模式下显示标准 DOCTYPE;在 Quirks 模式下显示 Quirks DOCTYPE。使用此标签覆盖客户端计算机上的兼容性视图并强制标准为 IE8 标准。”

有关此 IE 博客文章的更多信息:http://blogs.msdn.com/b/ie/archive/2008/08/27/introducing-compatibility-view.aspx


C
Community

此问题与 Force "Internet Explorer 8" browser mode in intranet 重复。

那里的响应表明无法禁用兼容性视图(在服务器端) - https://stackoverflow.com/a/4130343/24267。情况似乎确实如此,因为我尝试过的建议都没有奏效。在 IE8 中,无论您发送哪种 X-UA-Compatible 标头,“浏览器模式”都会设置为 Internet Explorer 8 兼容性视图。

我不得不对 IE7 和兼容模式做一些特殊处理,这导致浏览器使用 IE8 进行渲染,但报告它是 IE7,破坏了我的代码。这就是我修复代码的方式(我知道这是一个可怕的 hack,我应该测试功能而不是浏览器版本):

isIE8 = navigator.appVersion.indexOf("MSIE") != -1 && parseFloat(navigator.appVersion.split("MSIE")[1]) == 8;
if (!isIE8 && navigator.appVersion.indexOf("MSIE") != -1 && parseFloat(navigator.appVersion.split("MSIE")[1]) == 7 && navigator.appVersion.indexOf("Trident") != -1) {
    // Liar, this is IE8 in compatibility mode.
    isIE8 = true;
}

j
j0k

有同样的问题。它通过使用

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

n
n00b

在你的页面头标签中添加这个(针对你想要的 IE 版本):

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

请注意,这不会改变浏览器显示其处于兼容模式(称为浏览器模式)的事实,但页面以 IE8 标准模式呈现。如果它仍然没有呈现您希望的样子,可能是因为您的 javascript 错误地检查了 IE 版本。请参阅 the following blog post 以确定您应该关闭哪个属性,因为即使您设置了元 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 }

S
Schrodo_Baggins

对于其他阅读本文希望通过 GPO 为所有用户禁用此功能的其他人,这是设置:

计算机配置/管理模板/Windows 组件/Internet Explorer/兼容性视图/打开本地 Intranet 的 Internet Explorer 标准模式

虽然 web.config 编辑为我修复了它。


要转到本地组策略编辑器,您可以从运行中运行 gpedit.msc。
u
user1858301

更改 .htaccess 中的标题

BrowserMatch MSIE ie
Header set X-UA-Compatible "IE=Edge,chrome=1" env=ie

在此处找到此问题的解决方案:https://github.com/h5bp/html5-boilerplate/issues/378


不是每个人都在使用 Apache
R
ROMANIA_engineer

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);
}

现在,我的元 X-UA-Content 标签反映在我的浏览器测试中。

为什么我会做这样一件令人不快的事情来测试浏览器?速度。我的各种 jQuery 加载项,如 tablesorter 在 IE6/7 上太慢了,我想关闭它们。我不确定测试浏览器功能是否可以帮助我解决这个问题。