在域控制的环境我发现兼容性模式被触发某些客户端(操作系统/ Win7的,IE8 / IE9),即使我们提供了一个X-UA标签,一!DOCTYPE定义和“IE =边缘”响应头。 这些客户有复选框选中了“在兼容性视图中显示Intranet站点”。 而这正是我试图重写。
下面是我用来尝试理解IE如何决定实际触发兼容模式的文档。
http://msdn.microsoft.com/en-us/library/ff406036%28v=VS.85%29.aspx
http://blogs.msdn.com/b/ie/archive/2009/02/16/just-the-facts-recap-of-compatibility-view.aspx
网站所有者总是在他们的内容的控制。 网站所有者可以选择使用X-UA兼容的标签是绝对陈述了他们想要怎么样他们的网站上显示和映射标准模式的页面IE7标准。 在X-UA兼容标签的使用覆盖在客户端上兼容性视图。
谷歌为“定义文档兼容性”,可悲的是垃圾邮件引擎不会让我上传超过2个网址。
这是一个ASP .NET
Web应用程序,包括母版页上定义如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
</head>
和web.config
<system.webServer>
<httpProtocol>
<customHeaders>
<clear />
<add name="X-UA-Compatible" value="IE=Edge" />
</customHeaders>
</httpProtocol>
</system.webServer>
我已经使用小提琴手来检查头部确实被正确注射。
我的理解是,这些设置,我应该能够覆盖浏览器设置中的“兼容性视图中显示Intranet站点”。 但根据客户端上我发现,他们中的一些仍然会引发兼容模式。 这似乎也下到机器的水平,而策略组设置,因为我得到不同的结果,甚至当我用同一套在不同的客户端凭证的使用。
禁用兼容性视图设置复选框的伎俩。 但实际目的是为了确保应用程序呈现完全相同不管客户端设置相同的方式。
任何想法和我可能是缺少可能? 是否有可能在所有强制IE总是渲染页面,而不会触发兼容模式?
太感谢了,
乌梅
PS:目前该网站正在开发中,并且当然不是微软的兼容性列表中,但我也检查,以防万一。
谷歌为“了解兼容性视图列表”,可悲的是垃圾邮件引擎不会让我上传超过2个网址。
我发现这样做的两种常用方法的问题:
与定制标题(这样做<customHeaders>
web.config中)允许相同应用程序的不同的部署来不同地具有这个集。 我认为这是一个更可能出错的事情,所以我认为这是更好的,如果应用程序指定此代码。 此外, IIS6不支持此 。
包括HTML <meta>
在Web窗体母版页或MVC布局页标签似乎比上述更好。 但是,如果某些页不从这些则继承标签需要被复制,所以有一个潜在的可维护性和可靠性问题。
网络流量可以通过仅发送可以减少X-UA-Compatible
标头到Internet Explorer的客户端。
结构良好的应用
如果你的应用程序中,导致所有页面,最终由一个根页面继承的方式构成,包括<meta>
标签,如图其他的答案 。
遗留应用程序
否则,我认为要做到这一点的最好办法是自动的HTTP标头添加到所有HTML的响应。 要做到这一点的方法之一是使用IHttpModule
:
public class IeCompatibilityModeDisabler : IHttpModule
{
public void Init(HttpApplication context)
{
context.PreSendRequestHeaders += (sender, e) => DisableCompatibilityModeIfApplicable();
}
private void DisableCompatibilityModeIfApplicable()
{
if (IsIe && IsPage)
DisableCompatibilityMode();
}
private void DisableCompatibilityMode()
{
var response = Context.Response;
response.AddHeader("X-UA-Compatible", "IE=edge");
}
private bool IsIe { get { return Context.Request.Browser.IsBrowser("IE"); } }
private bool IsPage { get { return Context.Handler is Page; } }
private HttpContext Context { get { return HttpContext.Current; } }
public void Dispose() { }
}
IE=edge
表明,IE浏览器应使用其最新的渲染引擎(而不是兼容模式)来渲染页面。
看来,HTTP模块在web.config文件中经常注册,但这让我们回到第一个问题。 但是, 您可以通过编程在Global.asax中注册它们是这样的:
public class Global : HttpApplication
{
private static IeCompatibilityModeDisabler module;
void Application_Start(object sender, EventArgs e)
{
module = new IeCompatibilityModeDisabler();
}
public override void Init()
{
base.Init();
module.Init(this);
}
}
请注意,这是很重要的模块是static
,并没有实例Init
,以便有每个应用程序只有一个实例。 当然,在现实世界的应用程序的IoC容器也许应该管理这个。
好处
缺点
- 网站管理员没有对标头值控制。 这可能是一个问题,如果Internet Explorer的一个新的版本出来,并会导致网站的渲染。 然而,这可以通过具有该模块来克服读取来自应用程序的配置文件,而不是使用硬编码值标头值。
- 这可能需要修改与ASP.NET MVC工作。
- 这并不适用于静态HTML页面的工作。
- 该
PreSendRequestHeaders
在上面的代码的事件似乎并没有在IIS6火。 我还没有想出如何解决这个错误呢。
我的头更改为以下解决问题:
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
更新:更多有用的信息是什么<META HTTP-当量= “X-UA兼容”内容= “IE =边缘”>吗?
也许这个网址可以帮助你: 激活与文档类型的浏览器模式
编辑:今天我们能够重写与兼容性视图: <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />
对于节点/快速开发,你可以使用中间件,并通过服务器设置此。
app.use(function(req, res, next) {
res.setHeader('X-UA-Compatible', 'IE=edge');
next();
});