【发布时间】:2008-11-11 13:32:38
【问题描述】:
在一些现有代码中,通过检查对象 Browser.Engine.trident 是否已定义并返回 true 来测试用户是否正在运行 IE。
但是如何确定用户运行的是 IE6(或更早版本)还是 IE7(或更高版本)?
需要在 JavaScript 函数中进行测试,因此条件注释似乎不合适。
【问题讨论】:
标签: javascript internet-explorer browser
在一些现有代码中,通过检查对象 Browser.Engine.trident 是否已定义并返回 true 来测试用户是否正在运行 IE。
但是如何确定用户运行的是 IE6(或更早版本)还是 IE7(或更高版本)?
需要在 JavaScript 函数中进行测试,因此条件注释似乎不合适。
【问题讨论】:
标签: javascript internet-explorer browser
来自detecting Internet Explorer More Effectively@msdn:
function getInternetExplorerVersion()
// Returns the version of Internet Explorer or a -1
// (indicating the use of another browser).
{
var rv = -1; // Return value assumes failure.
if (navigator.appName == 'Microsoft Internet Explorer')
{
var ua = navigator.userAgent;
var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
if (re.exec(ua) != null)
rv = parseFloat( RegExp.$1 );
}
return rv;
}
function checkVersion()
{
var msg = "You're not using Internet Explorer.";
var ver = getInternetExplorerVersion();
if ( ver > -1 )
{
if ( ver >= 6.0 )
msg = "You're using a recent copy of Internet Explorer."
else
msg = "You should upgrade your copy of Internet Explorer.";
}
alert( msg );
}
【讨论】:
如果您真的想确定您使用的是 IE 和特定版本,那么您显然可以使用 IE 的条件标签来仅在 IE 中运行某些代码。它不是真的那么漂亮,但至少你可以确定它是真正的 IE,而不是一些欺骗版本。
<script>
var isIE = false;
var version = -1;
</script>
<!--[if IE 6]>
<script>
isIE = true;
version = 6
</script>
<![endif]-->
<!--[if IE 7]>
<script>
isIE = true;
version = 7
</script>
<![endif]-->
这很不言自明。在 IE6 中 isIE 是 true 和 version 是 6,在 IE7 中 isIE 是 true 和 version 是 7 否则 isIE@ 是 false 和 @98765433333 /p>
或者,您可以使用从 jQuery 抄袭的代码推出自己的解决方案。
var userAgent = navigator.userAgent.toLowerCase();
var version = (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
var isIE = /msie/.test( userAgent ) && !/opera/.test( userAgent ),
【讨论】:
如果您已经在 1.9 之前的版本中使用 jQuery,并且不需要检测 IE 11,您可以这样做:
if (jQuery.browser.msie == true) {
if (jQuery.browser.version == 7.0)
// .. do something for 7.0
else
// .. do something for < 7.0
}
【讨论】:
Navigator 对象包含有关用户浏览器的所有信息:
例如:
var browser=navigator.appName;
var b_version=navigator.appVersion;
var version=parseFloat(b_version);
见:
【讨论】:
如果您正在检查某个功能,您应该直接检查它,例如if (window.focus) {window.focus();} 浏览器检测永远不够可靠。
有关对象与浏览器检测的更多详细信息,check out this article at Quirksmode。
另一方面,如果您需要的功能是浏览器类型和版本,例如出于统计目的,请使用 navigator.appName 和 navigator.appVersion。 (但请注意 - 许多不太流行的浏览器将自己伪装成 MSIE 6 或 7,因为某些网站会在“所有现代浏览器都是 IE 的前提下阻止任何非 IE,对吗?”(提示:不再)。)
【讨论】:
因此,IE8 兼容性视图模式将自身报告为 IE7,即使它的行为并不总是相同。为此,我给你这个怪物:
// IE8's "Compatibility mode" is anything but. Oh well, at least it doesn't take 40 lines of code to detect and work around it.
// Oh wait:
/*
* Author: Rob Reid
* CreateDate: 20-Mar-09
* Description: Little helper function to return details about IE 8 and its various compatibility settings either use as it is
* or incorporate into a browser object. Remember browser sniffing is not the best way to detect user-settings as spoofing is
* very common so use with caution.
*/
function IEVersion(){
var _n=navigator,_w=window,_d=document;
var version="NA";
var na=_n.userAgent;
var ieDocMode="NA";
var ie8BrowserMode="NA";
// Look for msie and make sure its not opera in disguise
if(/msie/i.test(na) && (!_w.opera)){
// also check for spoofers by checking known IE objects
if(_w.attachEvent && _w.ActiveXObject){
// Get version displayed in UA although if its IE 8 running in 7 or compat mode it will appear as 7
version = (na.match( /.+ie\s([\d.]+)/i ) || [])[1];
// Its IE 8 pretending to be IE 7 or in compat mode
if(parseInt(version)==7){
// documentMode is only supported in IE 8 so we know if its here its really IE 8
if(_d.documentMode){
version = 8; //reset? change if you need to
// IE in Compat mode will mention Trident in the useragent
if(/trident\/\d/i.test(na)){
ie8BrowserMode = "Compat Mode";
// if it doesn't then its running in IE 7 mode
}else{
ie8BrowserMode = "IE 7 Mode";
}
}
}else if(parseInt(version)==8){
// IE 8 will always have documentMode available
if(_d.documentMode){ ie8BrowserMode = "IE 8 Mode";}
}
// If we are in IE 8 (any mode) or previous versions of IE we check for the documentMode or compatMode for pre 8 versions
ieDocMode = (_d.documentMode) ? _d.documentMode : (_d.compatMode && _d.compatMode=="CSS1Compat") ? 7 : 5;//default to quirks mode IE5
}
}
return {
"UserAgent" : na,
"Version" : version,
"BrowserMode" : ie8BrowserMode,
"DocMode": ieDocMode
}
}
var ieVersion = IEVersion();
var IsIE8 = ieVersion.Version != "NA" && ieVersion.Version >= 8;
【讨论】:
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7, IE=9">
这可能会被否决,因为它没有直接回答问题,但是……您应该不编写特定于浏览器的代码。在为大多数被广泛接受的浏览器编写代码时,几乎没有什么是您不能做的。
编辑:我发现有条件 cmets 唯一有用的时候是我需要包含 ie6.css 或 ie7.css。
【讨论】:
嗯...这是我想了一会儿后想到的。只是想找到一个简单的解决方案。
if (navigator.appName == 'Microsoft Internet Explorer') {
// Take navigator appversion to an array & split it
var appVersion = navigator.appVersion.split(';');
// Get the part that you want from the above array
var verNumber = appVersion[1];
alert(verNumber);
}
它返回 ex:- MSIE 10.0、MSIE 9.0、MSIE 8.0
进一步扩展,如果你想检查它是“低于”还是“高于”IE版本,你可以稍微修改一下
if (navigator.appName == 'Microsoft Internet Explorer') {
var appVersion = navigator.appVersion.split(';');
var verNumber = appVersion[1];
// Reaplce "MSIE " from the srting and parse it to integer value
var IEversion = parseInt(verNumber.replace('MSIE ', ''));
if(IEversion <= 9){
alert(verNumber);
}
}
从w3schools 得到了基本的想法,希望这对某人有所帮助...:D
【讨论】:
这是我使用的脚本,它似乎运行良好:
// Returns 0 if the browser is anything but IE
function getIEVersion() {
var ua = window.navigator.userAgent;
var ie = ua.indexOf("MSIE ");
return ((ie > 0) ? parseInt(ua.substring(ie+5, ua.indexOf(".", ie))) : 0);
}
希望对某人有所帮助...
【讨论】:
这应该会给你比你想要的更多的细节:
var agent = navigator.userAgent;
var msiePattern = /.*MSIE ((\d+).\d+).*/
if( msiePattern.test( agent ) ) {
var majorVersion = agent.replace(msiePattern,"$2");
var fullVersion = agent.replace(msiePattern,"$1");
var majorVersionInt = parseInt( majorVersion );
var fullVersionFloat = parseFloat( fullVersion );
}
【讨论】:
似乎还没有人说过:
需要在 JavaScript 函数中进行测试,因此条件注释似乎不合适。
您可以轻松地将条件注释 — JScript 条件注释,而不是 HTML 注释 — 在函数中:
function something() {
var IE_WIN= false;
var IE_WIN_7PLUS= false;
/*@cc_on
@if (@_win32)
IE_WIN= true;
@if (@_jscript_version>=5.7)
IE_WIN_7PLUS = true;
@end
@end @*/
...
}
更典型的做法是在全局级别进行一次测试,然后只检查存储的标志。
CC 比筛选用户代理字符串如今变得如此混乱更可靠。 navigator.userAgent 上的字符串匹配方法可能会误识别 Opera 等欺骗浏览器。
当然,在可能的情况下,能力嗅探对于跨浏览器代码来说要好得多,但在某些情况下 — 通常是错误修复解决方法 — 您确实需要专门识别 IE,而 CC 可能是当今最好的方法。
【讨论】:
<script>
alert("It is " + isIE());
//return ie number as int else return false
function isIE() {
var myNav = navigator.userAgent.toLowerCase();
if (myNav.indexOf('msie') != -1) //ie less than ie11 (6-10)
{
return parseInt(myNav.split('msie')[1]);
}
else
{
//Is the version more than ie11? Then return false else return ie int number
return (!!(myNav.match(/trident/) && !myNav.match(/msie/)) == false)?false : parseInt(myNav.split('rv:')[1].substring(0, 2));
}
}
</script>
【讨论】: