我需要知道通过用户代理字符串识别自己的IE7或IE8的浏览器是否真的是那些浏览器,或者它是否是7或8兼容模式下的IE9。
从我在用户代理字符串中看到的,IE7兼容模式下的IE9,为真正的IE7提供了相同的字符串。是否有一个额外的属性/元素/对象,我可以测试它是否真的“伪装”IE9?
我认为文档模式无效,因为我的脚本加载到的页面可能会强制怪癖或强制执行特定设置。
我希望IE9会有一些存在的属性,无论是在7,8或9模式下都可以测试。
已编辑添加...
好的,我知道我现在哪里出错了。我正在使用“浏览器模式”下拉菜单并将其切换到IE8和IE7,并认为这分别是“IE8兼容模式”和“IE7兼容模式”。这当然不是真的。开发人员工具的浏览器模式实际上是将它切换为“就像”那些旧浏览器一样,因此报告原始的useragent字符串是正确的。如果我在IE9或IE9兼容性下退出浏览器模式并尝试使用文档模式下拉变体,那么我确实在所有8种组合(两种浏览器模式和4种文档模式)中都会出现“Trident / 5.0”。我只需要避免选择浏览器模式IE7和IE8,因为它们确实是(模拟)IE7和IE8。
因此,页面,非开发人员用户,元标记或Microsoft的兼容性列表都无法将IE9置于这种无法识别的状态。
只需使用if(navigator.userAgent.indexOf("Trident/5")>-1)
即可。
别担心,这不适用于样式,格式,逻辑或页面内容。我对这些东西使用特征检测。我只需要检测IE9(无论它处于什么模式)并对此做出非页面内容决定。
感谢您根据自己的建议和链接指导我。
答案 0 :(得分:67)
实际上IE9在IE7兼容模式下运行时,用户代理字符串是不同的,因此这将是区分不同IE版本的最佳方式之一。
Introducing IE9’s User Agent String:
类似于IE8,IE9的兼容性 View将映射到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中运行的Compat View和IE8 图强>
(我强调)。因此,用户代理字符串与报告自身为“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
答案 1 :(得分:47)
document.documentMode
是文档模式的最佳方式。
答案 2 :(得分:20)
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)
答案 3 :(得分:17)
答案 4 :(得分:11)
我希望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]>
答案 5 :(得分:3)
有时需要从服务器变量读取用户代理字符串,而不是从javascript导航器对象读取。
比较差异:
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; Media Center 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 classic, 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; Media Center 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; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS)“
答案 6 :(得分:0)
来自https://stackoverflow.com/a/29288153/2879498
假设您有一个带有ID compat-warning的隐藏元素:
Javascript w / jQuery:$(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();
});
检测和警告,你对兼容地狱的第一道防线和最后一道防线。