在IE7兼容模式下区分IE7浏览器和浏览器
如果客户端的浏览器是IE7或IE9兼容模式,我可以区分吗? 我试图弄清楚是否可以在我的网站上做一个JS检查来识别两个不同的东西,根据结果做不同的事情
- 该浏览器是IE7
- 该浏览器处于IE7兼容模式
我有第一个条件正常工作,因为它到处都说如何做到这一点。 不确定第二个和/或两者的组合。
对于至lessIE8和IE9,你可以检查navigator.userAgent
是否有子串Trident
。 一个IE8 +在其用户代理中总是有一个Trident
,IE7没有。 看到这个答案和它的MSDN链接 。
IE10似乎比较棘手:在下面的评论中报道, Trident
并不总是以IE7仿真模式出现。 如果IE10在IE7可用的任何平台上都不可用,则操作系统string(例如Windows NT 6.2
)可能仍会显示IE10。
另请注意,HTTP User-Agent
头可能并不总是与navigator.userAgent
匹配。 这种情况至less在具有兼容模式的IE9(发送IE7 User-Agent
标题)的情况下,但是在响应( navigator.userAgent
转回到IE9)中检测到类似于IE=Edge
的内容。
我不相信有一种方法来检测用户的浏览器是否在compat模式。 他们的用户代理string将由他们的浏览器模式确定,他们的文档模式将由x-ua-compatible
元标记(或标题)的存在或可能由所使用的文档types来确定。
兼容模式旨在保护现代浏览器用户免受依赖于过时function或黑客的页面的侵害。 这不是你想要testing的东西。 相反,编写符合标准的代码将被浏览器在compat模式或non-compat模式下理解。
以下是不同浏览器模式和文档模式的各种结果:
浏览器模式:IE10兼容查看/文件模式: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
浏览器模式: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
正如你所看到的,通过这两种方法,没有办法确定用户是否在同一个视图中。
重写“兼容查看列表”
如果您的网站出现在兼容性视图列表中,则可以通过提供您自己的x-ua-compatible
标头来覆盖其build议的呈现选项:
<meta http-equiv="x-ua-compatible" content="IE=9" />
这迫使您的浏览器进入IE9的标准模式(没有评估的DOCTYPE)。 您可以使用IE=edge
强制它进入最新的模式(在Internet Explorer 10上,这将是IE 10标准),但这并不鼓励。 相反,将其设置为您testing的最新模式。
如果x-ua-compatible
标题设置为IE10,但用户在较早的浏览器上访问了您的页面,则将使用最近的呈现引擎。 例如,如果用户使用IE9访问您的页面,并且您的元标记指示浏览器使用IE10,则浏览器将回退到IE9标准模式。
请注意, IE=9
会导致浏览器进入IE9标准模式。 它不一定会导致浏览器像IE9一样行事。 如果您希望浏览器的行为与IE9一样,您可能需要使用EmulateIE9
内容:
<meta http-equiv="x-ua-compatible" content="IE=EmulateIE9" />
这会导致浏览器在DOCTYPE(如果存在)确定文档模式是“标准”还是“怪癖”。
有关更多信息,请参阅定义文档兼容性 。
对于任何人在Google上达到此线程,这里是另一个选项:
使用位于http://www.quirksmode.org/js/detect.html的脚本;….
if (BrowserDetect.browser == 'Explorer') { if (document.documentMode == 7 && BrowserDetect.version > 7) { // user is running IE in compatability mode } }
这适用于我:
/** * Actual IE8-Browser running in IE8-Compat-Mode or IE7 Mode? */ MyUtils.isIE8CompatMode= function(){ if($.browser.msie && navigator.userAgent.indexOf('MSIE 7.0')>=0){ return true; } return false; }
一个真正的IE8浏览器有3个文档模式(IE7,IE8和怪癖)和3浏览器模式(IE7,IE8和IE8兼容性)。 我们可以强制文档模式为IE8:
<meta http-equiv="X-UA-Compatible" content="IE=8,chrome=1"/>
但是,我们无法执行由浏览器configuration确定的浏览器模式。 例如:我们的一些客户在兼容性 – 查看 – 设置 – 对话框中选中了“在兼容模式下渲染所有页面” – 勾选框。 如果是这样的话,我们无能为力。
看到这个网站非常有启发性的图表:
– > ie8如何确定兼容模式
我们使用上述function是什么? 由于我们的页面在兼容模式下显示一些故障,我们需要告诉用户,为什么看起来不好,以及他可以做些什么。 所以我们使用上面的函数来告诉我们是否有麻烦,然后给用户一个小警告。
在ie9和ie10兼容模式我们的应用程序看起来不错,所以我们不需要在那里。 这个响应可能被认为是对这个问题的回答: 检测ie8兼容模式 ,这个模式被标记为这个模式的一个副本。 也许它有助于某人。
这是一个相当防弹的检查,我为圣何塞的一个大型拍卖网站。
var userAgentString = navigator.userAgent; if(/MSIE 7\.0/gi.test(userAgentString) && /Trident/gi.test(userAgentString)){ // compatibility mode // .... code goes here .... }