如何确定用户在JavaScript中运行的IE版本?

时间:2008-11-11 13:32:39

标签: javascript internet-explorer browser

在一些现有代码中,通过检查对象Browser.Engine.trident是否已定义并返回true,进行测试以查看用户是否正在运行IE。

但是如何确定用户是在运行IE6(或更早版本)还是运行IE7(或更高版本)?

在JavaScript函数中需要进行测试,因此条件注释似乎不合适。

12 个答案:

答案 0 :(得分:18)

来自msdn的detecting Internet Explorer More Effectively

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 );
}

答案 1 :(得分:12)

如果你真的想确定你使用的是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中,isIEtrueversion6,在IE7中,isIEtrueversion7 }否则isIE为false,version-1

或者你可以使用jQuery中的代码来推广你自己的解决方案。

var userAgent = navigator.userAgent.toLowerCase();
var version = (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
var isIE = /msie/.test( userAgent ) && !/opera/.test( userAgent ),    

答案 2 :(得分:4)

如果你已经在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
}

答案 3 :(得分:3)

Navigator对象包含有关用户浏览器的所有信息:

例如:

var browser = navigator.appName;

var b_version = navigator.appVersion;

var version = parseFloat(b_version);

请参阅:

http://www.w3schools.com/js/js_browser.asp

答案 4 :(得分:3)

如果您要检查某项功能,则应直接检查,例如: if (window.focus) {window.focus();} 浏览器检测永远不够可靠。

有关对象与浏览器检测的更多详细信息,请check out this article at Quirksmode

另一方面,如果您需要的功能是浏览器类型和版本,例如出于统计目的,请使用navigator.appNamenavigator.appVersion。 (请注意 - 许多不那么受欢迎的浏览器将自己伪装成MSIE 6或7,因为某些网站在“所有现代浏览器都是IE,对吧?”的前提下阻止任何不是IE的东西。(提示:不再)。)

答案 5 :(得分:3)

因此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;

答案 6 :(得分:2)

这可能会被拒绝,因为它没有直接回答问题,但是......你应该编写特定于浏览器的代码。在为最广泛接受的浏览器编码时,你几乎无法做到。

编辑:我发现有条件评论的唯一时间是我需要包括ie6.css或ie7.css。

答案 7 :(得分:1)

嗯......这是我想了一会儿后才出现的。只是想找到一个简单的解决方案。

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

答案 8 :(得分:0)

这是我使用的脚本,它似乎运作良好:

// 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);
}

希望有人帮助......

答案 9 :(得分: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 );
}

答案 10 :(得分:0)

因为似乎还没有人说过:

  

在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比筛选User-Agent字符串最近成为的混乱更可靠。 navigator.userAgent上的字符串匹配方法可能会错误识别欺骗性浏览器,例如Opera。

当然,对于可能的跨浏览器代码,功能嗅探要好得多,但在某些情况下 - 通常是错误修复解决方法 - 你需要专门识别IE,而CC可能是今天最好的方法。 / p>

答案 11 :(得分:0)

<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>