JavaScript:如果它处于 IE7 或 IE8 兼容模式,我可以检测到 IE9 吗?
Posted
技术标签:
【中文标题】JavaScript:如果它处于 IE7 或 IE8 兼容模式,我可以检测到 IE9 吗?【英文标题】:JavaScript: Can I detect IE9 if it's in IE7 or IE8 compatibility mode? 【发布时间】:2011-08-15 02:04:31 【问题描述】:我需要知道通过用户代理字符串将自己标识为 IE7 或 IE8 的浏览器是否真的是那些浏览器,或者它是否是 IE9 的 7 或 8 兼容模式。
从我在用户代理字符串中可以看到,IE7 兼容模式下的 IE9 提供了与真正的 IE7 相同的字符串。是否有一个额外的属性/元素/对象可以测试以查看它是否是“真的”变相的 IE9?
我认为文档模式无济于事,因为我的脚本加载到的页面可能是强制怪癖或强制特定设置。
我希望 IE9 将具有一些存在且可测试的属性,无论它是处于 7、8 还是 9 模式。
已编辑添加…
好的,我知道我现在哪里出错了。我正在使用“浏览器模式”下拉菜单并将其切换到 IE8 和 IE7,并认为这分别是“IE8 兼容模式”和“IE7 兼容模式”。这当然不是真的。开发者工具的浏览器模式真的是把它切换到“像”那些旧浏览器,所以报告原始用户代理字符串是正确的。
如果我将浏览器模式保留为 IE9 或 IE9 兼容性并尝试使用文档模式下拉变体,那么实际上我确实会在所有 8 种组合(两种浏览器模式和 4 种文档模式)中出现“Trident/5.0”。我只需要避免选择浏览器模式 IE7 和 IE8,因为它们确实是(模拟的)IE7 和 IE8。
因此,页面、非开发人员用户、元标记或 Microsoft 的兼容性列表都无法将 IE9 置于这种无法识别的状态。
只需使用if(navigator.userAgent.indexOf("Trident/5")>-1)
就足够了。
别担心,这不适用于样式、格式、逻辑或页面内容。我对这些事情使用特征检测。我只需要检测 IE9(无论它处于何种模式)并对此做出非页面内容决定。
感谢您通过您的建议和链接引导我找到答案。
【问题讨论】:
永远不要相信用户代理...它可以完美地撒谎,并且无法确定它是否说真话...您应该测试特定的功能或特性 @JCOC611 是和否。这是一个具体的问题,如何在兼容性视图中找出是否是IE9,这是一个合理的问题。一般来说,不应该依赖用户代理字符串来实现网站功能,因为很容易伪造它,真的。 即使用户代理是准确的,如果可能的话,最好还是使用特征检测。那么,你一开始就不需要知道 IE 是否处于兼容模式。 我只想补充一点,如果您想为使用错误浏览器模式的用户提供快速教程,这非常有用。 @JCOC611 谁会欺骗他们的用户代理并期望事情正常工作 - 我们真的应该关心这种情况吗? 【参考方案1】:实际上,在 IE7 兼容模式下运行时,IE9 的用户代理字符串是不同的,因此这将是区分不同 IE 版本的最佳方法之一。
Introducing IE9’s User Agent String:
类似于 IE8,IE9 的兼容性 视图将映射到 IE7 标准模式, 和 IE9 的 UA 字符串 兼容性视图将是:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0)
在兼容性视图中,IE9 报告 通过应用程序本身作为 IE7 版本号 (Mozilla/4.0) 和 版本令牌(MSIE 7.0)。这个做完了 为了兼容性。 递增 三叉戟代币,从‘Trident/4.0’到 “Trident/5.0”,允许网站 区分IE9运行在 Compat View 和 IE8 在 Compat 中运行 查看。
(强调由我添加)。因此,用户代理字符串与它报告自己为“Mozilla/4.0”和 MSIE 7.0 相同,但 IE9 将始终为 Trident/5.0 - 无论它显示的是 MSIE 7.0、MSIE 8.0 还是 MSIE 9.0。
其实你应该看看这个很棒的汇编:Browser ID (User-Agent) Strings 或者更好的useragentstrings.com
【讨论】:
嗨,月泪。我还看到当 IE9 处于 IE7 模式时应该出现“Trident/5.0”,但这不是我在 Win7 Pro x64 上的(最终)IE9 上看到的。它在 IE7 模式下根本没有显示三叉戟(这是真正的 IE7 的样子),它在 IE8 模式下显示了三叉戟 4(再次,真正的 IE8 的样子)。我是用IE9开发者工具先下拉选择浏览器模式然后在地址栏alerting javascript:alert(navigator.userAgent) "Trident/5.0" 在所有模式下都出现在 IE9 的用户代理字符串中。 正如 EricLaw 所说,Dee。使用兼容模式时必须存在 Trident/5.0(浏览器模式可能不同?)。你如何检查用户代理字符串?尝试通过whatsmyuseragent.com查看并报告。 在下面查看我的回复(我不得不使用另一个 id Dee2001,因为关于添加对您自己的消息的回复的堆栈溢出 8 小时规则)。是的,Eric 和 Moontear 都是正确的,Trident/5.0 存在于所有 IE9 的模式中。我的大错误是在开发人员工具中将“浏览器模式”更改为 IE7 或 IE8,但这不是页面/元标记/兼容性列表可以强制执行的“模式”。相反,它实际上是在模拟浏览器本身,所以自然地 useragent 字符串真的很像 IE7/8。 这太完美了!非常感谢。我没有根据报告的浏览器设置样式,但我在我正在处理的网站顶部设置了一个警告栏,表示用户需要升级(如果条件标签说它小于或等于 ie7) -- 在这种情况下,我不希望消息说升级,而是禁用兼容模式【参考方案2】:document.documentMode
是文档模式的最佳方式。
【讨论】:
请扩大答案。更多上下文。 为什么人们不加这个,它正是需要的 这确实是最好的方法。你可以这样使用它:<script> if (document.documentMode == 7) alert("Yo, put it in its normal mode, will ya?") </script>
。真正的(!)IE7 和所有非 IE 都返回“未定义”,Comp 中只有 IE8/9。 mode return 7. 我无法测试 IE10,但应该是一样的。
刚刚在 IE10 中用边缘 META 标签试过这个;通常,它返回“10”。对所有站点强制打开兼容模式,它仍然返回“10”。
在 IE10 和 IE11 预览版中为我工作【参考方案3】:
IE7 不包含任何关于 Trident 的信息
User-Agent : Mozilla/4.0 (compatible; MSIE 7.0)
IE8 包含这个字符串:“Trident/4.0”
User-Agent : Mozilla/4.0 (compatible; MSIE 8.0; Trident/4.0)
IE9 包含这个字符串:“Trident/5.0”
IE9 兼容模式:
User-Agent : Mozilla/4.0 (compatible; MSIE 7.0; Trident/5.0)
普通模式下的IE9:
User-Agent : Mozilla/5.0 (compatible; MSIE 9.0; Trident/5.0)
【讨论】:
太好了,IE10 也增加 Trident 吗? Internet explorer 10 用户 Trident/6.0....见blogs.msdn.com/b/ie/archive/2012/07/12/… 而IE11使用Trident/7.0【参考方案4】:这是table of all Browser and Document modes for IE9:
【讨论】:
您是否有机会获得包含 IE10 和 IE11 的更新版本?【参考方案5】:我希望 IE9 具有一些存在且可测试的属性,无论它是处于 7、8 还是 9 模式。
检查例如对于 style.opacity,它是在 IE9 中引入的,无论兼容模式如何都可用:
<![if IE]>
<script>
if(typeof document.documentElement.style.opacity!='undefined')
//this must be at least IE9
</script>
<![endif]>
【讨论】:
谢谢 Dr.Molle,我会试一试并报告。 不幸的是,这只适用于浏览器模式(IE9 开发人员工具中的左侧下拉菜单)。它不适用于文档模式(右侧下拉菜单)。对于文档模式,它仅适用于 IE9 文档模式。如果它处于 IE8、IE7 或 Quirks 模式,则该逻辑失败。 该死,你的权利。我找到了另一个属性,在每种模式下都适用于我:window.performance @Dee2000:它也适用于 DocumentMode。 IE。仅当 DocumentMode = "Internet Explorer 9 standard" 时,此测试才会成功。 @Dr.Molle 谢谢你,window.performance 做得很好。【参考方案6】:有时需要从服务器变量中读取用户代理字符串,而不是从 javascript navigator 对象中读取。
比较差异:
ASP 经典,IE11
客户端 javascript,navigator.userAgent:“Mozilla/5.0(兼容;MSIE 9.0;Windows NT 6.1;WOW64;Trident/7.0;SLCC2;.NET CLR 2.0.50727;.NET CLR 3.5。 30729;.NET CLR 3.0.30729;媒体中心 PC 6.0;.NET4.0C;.NET4.0E;BOIE9;ENUS)"
服务器 ASP, Request.ServerVariables("HTTP_USER_AGENT"): "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; BOIE9;ENUS; rv:11.0) 像 Gecko "
ASP 经典,IE11 兼容模式:
客户端 javascript,navigator.userAgent:“Mozilla/5.0(兼容;MSIE 9.0;Windows NT 6.1;WOW64;Trident/7.0;SLCC2;.NET CLR 2.0.50727;.NET CLR 3.5。 30729;.NET CLR 3.0.30729;媒体中心 PC 6.0;.NET4.0C;.NET4.0E;BOIE9;ENUS))"
服务器 ASP,Request.ServerVariables("HTTP_USER_AGENT"): "Mozilla/4.0(兼容;MSIE 7.0;Windows NT 6.1;WOW64;Trident/7.0;SLCC2;.NET CLR 2.0.50727; .NET CLR 3.5.30729;.NET CLR 3.0.30729;媒体中心 PC 6.0;.NET4.0C;.NET4.0E;BOIE9;ENUS)"
【讨论】:
【参考方案7】:来自https://***.com/a/29288153/2879498
假设您有一个 ID 为 compat-warning 的隐藏元素:
带有 jQuery 的 Javascript:
$(function()
function showCompatWarning()
$('#compat-warning')
.css('display','block')
.css('height','auto')
.show();
var tridentOffset = navigator.appVersion.indexOf('Trident/');
if ( tridentOffset === -1 ) return;
var jscriptVersion = 0;
/*@cc_on @*/
/*@if (@_jscript) jscriptVersion = @_jscript_version ; @*/;
/*@end @*/
var tridentVersion = parseInt(navigator.appVersion.substr(tridentOffset+8),10);
var guessIEVersion = tridentVersion + 4;
if (( document.documentMode && jscriptVersion && jscriptVersion < 10 && jscriptVersion !== document.documentMode ) ||
( document.compatMode && document.compatMode === 'BackCompat') ||
( document.documentMode && document.documentMode < 10 && document.documentMode != guessIEVersion ))
showCompatWarning();
);
检测和警告,您抵御兼容性地狱的第一道和最后一道防线。
【讨论】:
以上是关于JavaScript:如果它处于 IE7 或 IE8 兼容模式,我可以检测到 IE9 吗?的主要内容,如果未能解决你的问题,请参考以下文章
您对在您的页面中包含 ie7.js 或 ie8.js 感觉如何?