vau*_*boy 14 javascript compatibility internet-explorer browser-detection
在IE7兼容模式下,我可以区分客户端的浏览器是IE7还是IE9?我想知道我是否可以在我的网站上进行JS检查,这会检查两种不同的东西并根据结果做不同的事情
我有第一个条件正常工作,因为它几乎说到处都是如何做到这一点.不确定第二个和/或两者的组合.
对于至少IE8和IE9,您可以检查其中是否navigator.userAgent包含子字符串Trident.IE8 + 在其用户代理中总是有一个Trident,而IE7则没有.请参阅此答案及其中的MSDN链接.
IE10看起来比较棘手:在下面的评论中报告了IE7仿真模式Trident并不总是存在.如果IE10在IE7可用的任何平台上都不可用,OS字符串(例如Windows NT 6.2)可能仍会显示IE10.
另请注意,HTTP User-Agent标头可能并不总是匹配navigator.userAgent.至少IE9具有兼容模式(发送IE7 User-Agent标头)但检测到IE=Edge响应中的内容(navigator.userAgent转回IE9)就是这种情况.
我不相信有一种方法可以检测用户的浏览器是否处于compat模式.他们的用户代理字符串将由他们的浏览器模式确定,他们的文档模式将由x-ua-compatible元标记(或标题)的存在确定,或者可能由所使用的doctype确定.
兼容模式旨在保护现代浏览器用户免受依赖旧的和过时的功能或黑客攻击的页面的影响.这不是你想要测试的东西.相反,编写符合标准的代码,浏览器将在compat模式或非compat模式下理解这些代码.
以下是不同浏览器模式和文档模式的各种结果:
浏览器模式:IE10 Compat View/Document Mode:IE7标准
navigator.userAgent
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/6.0;
.NET4.0E; .NET4.0C; Media Center PC 6.0; .NET CLR 3.5.30729;
.NET CLR 2.0.50727; .NET CLR 3.0.30729; BRI/2)"
document.documentMode
7
Run Code Online (Sandbox Code Playgroud)
浏览器模式:IE7 /文档模式:IE7标准
navigator.userAgent
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; .NET4.0E;
.NET4.0C; Media Center PC 6.0; .NET CLR 3.5.30729; .NET CLR 2.0.50727;
.NET CLR 3.0.30729; BRI/2)"
document.documentMode
7
Run Code Online (Sandbox Code Playgroud)
如您所见,通过这两种方法无法判断用户是否处于compat视图中.
如果您的站点出现在兼容性视图列表中,则可以通过提供自己的x-ua-compatible标头来覆盖其建议的呈现选项:
<meta http-equiv="x-ua-compatible" content="IE=9" />
Run Code Online (Sandbox Code Playgroud)
这会强制您的浏览器进入IE9标准模式(不评估doctype).您可以使用IE=edge它来强制进入最新模式(在Internet Explorer 10上,这将是IE 10标准),但不鼓励这样做.而是将其设置为您测试过的最新模式.
如果x-ua-compatible标题设置为IE10,但用户在较早的浏览器上访问您的页面,则将使用最近的渲染引擎.例如,如果用户使用IE9访问您的页面,并且您的元标记指示浏览器使用IE10,则浏览器将回退到IE9标准模式.
请注意,IE=9导致浏览器进入IE9标准模式.它不一定会导致浏览器表现得像IE9一样.如果您希望浏览器的行为就像IE9一样,您可能希望使用以下EmulateIE9内容:
<meta http-equiv="x-ua-compatible" content="IE=EmulateIE9" />
Run Code Online (Sandbox Code Playgroud)
这会导致浏览器回退到DOCTYPE(如果存在),以确定文档模式是标准模式还是Quirks模式.
有关详细信息,请参阅定义文档兼容性.