在JavaScript中检测IE版本(v9之前)

253

如果用户使用早于v9的Internet Explorer版本,我希望将其反弹到错误页面,因为我们不值得花时间和金钱来支持IE pre-v9。其他非IE浏览器的用户都可以正常使用且无需反弹。这是建议的代码:

if(navigator.appName.indexOf("Internet Explorer")!=-1){     //yeah, he's using IE
    var badBrowser=(
        navigator.appVersion.indexOf("MSIE 9")==-1 &&   //v9 is ok
        navigator.appVersion.indexOf("MSIE 1")==-1  //v10, 11, 12, etc. is fine too
    );

    if(badBrowser){
        // navigate to error page
    }
}

这段代码能实现吗?

在此之前,我想先回应几个可能会出现的评论:

  1. 是的,我知道用户可以伪造他们的 useragent 字符串,但我并不担心。
  2. 是的,我知道编程专家更喜欢检测特性支持而不是浏览器类型,但我认为这种方法在这种情况下并不合理。我已经知道所有(相关的)非 IE 浏览器都支持我需要的功能,而所有的 pre-v9 IE 浏览器都不支持。在整个站点逐个检查每个特性将是一种浪费。
  3. 是的,我知道有人试图使用 IE v1(或 >= 20)来访问网站将不会将 'badBrowser' 设置为 true 并且警告页面将无法正常显示。我们愿意承担这种风险。
  4. 是的,我知道 Microsoft 有 "条件注释" 可以用于精确的浏览器版本检测。但自从 IE 10 起,IE 就不再支持条件注释了,使这种方法变得绝对无用。

还有其他显而易见的问题需要注意吗?


125
“支持IE v9之前的版本不值得我们浪费时间和金钱。” 我很希望我能够做到。 - user377628
2
基于第二点,我不建议使用Modernizr(http://en.wikipedia.org/wiki/Modernizr)-每个人都必须在某个地方划定界限-但是IE9似乎是一个高标准。 - amelvin
1
条件注释只是普通的注释。只有IE将它们解释为特殊注释。IE10+不再这样做了。 - Andreas
3
IE 10将与非IE浏览器一样处理条件注释。它们是有效的HTML注释,将被视为这样的注释。我同意Andreas的看法,并认为条件注释是可行的方法。 - Tim Down
1
谁在乎IE10是否支持条件注释,如果它不是你要检测的浏览器之一?你不需要检测它是否是IE9或更高版本,你只需要检测它是否是IE8或更低版本。你的错误在于认为你需要弄清楚它是什么,才能知道它不是什么。这是不正确的。你不需要检测IE10,你只需要知道它不是IE8(或更低版本)。任何你放在lt IE 9条件中的代码都将在IE8及以下版本中运行,而其他地方则不会。就是这么简单。这是微软在IE方面做对的唯一一件事情。 - Jimbo Jonny
显示剩余5条评论
37个回答

0
以下的 CodePen 可以在所有情况下(IE<=9、IE10、IE11 和 IE/Edge)识别 IE 版本。
function detectIE() {
    var ua = window.navigator.userAgent;
    var msie = ua.indexOf('MSIE ');
    if (msie > 0) {
        // IE 10 or older => return version number
        return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
    }
    var trident = ua.indexOf('Trident/');
    if (trident > 0) {
        // IE 11 => return version number
        var rv = ua.indexOf('rv:');
        return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
    }
    var edge = ua.indexOf('Edge/');
    if (edge > 0) {
        // Edge (IE 12+) => return version number
        return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
    }
    // other browser
    return false;
}

参考:https://codepen.io/gapcode/pen/vEJNZN


0
// Detect ie <= 10
var ie = /MSIE ([0-9]+)/g.exec(window.navigator.userAgent)[1] || undefined;

console.log(ie);
// Return version ie or undefined if not ie or ie > 10

0
检测IE及其版本非常简单,您只需要一点本地/原生JavaScript即可:
var uA = navigator.userAgent;
var browser = null;
var ieVersion = null;

if (uA.indexOf('MSIE 6') >= 0) {
    browser = 'IE';
    ieVersion = 6;
}
if (uA.indexOf('MSIE 7') >= 0) {
    browser = 'IE';
    ieVersion = 7;
}
if (document.documentMode) { // as of IE8
    browser = 'IE';
    ieVersion = document.documentMode;
}

这是使用它的一种方式:

if (browser == 'IE' && ieVersion <= 9) 
    document.documentElement.className += ' ie9-';

.

适用于所有IE版本,包括在较低的兼容性视图/模式中使用更高版本,并且documentMode是IE专有的。


0
var isIE9OrBelow = function()
{
   return /MSIE\s/.test(navigator.userAgent) && parseFloat(navigator.appVersion.split("MSIE")[1]) < 10;
}

0
不要把简单的事情复杂化。只需使用简单明了的JScript条件注释即可。它是最快的,因为它对非IE浏览器的检测不会添加任何代码,并且它具有向前兼容性,可以支持HTML条件注释之前的IE版本。简而言之,
var IE_version=(-1/*@cc_on,@_jscript_version@*/);

小心缩小器:大多数(如果不是全部)都会将特殊条件注释误认为是普通注释,并将其删除

基本上,上面的代码将IE_version的值设置为您正在使用的IE版本,或者如果您没有使用IE,则为-1。现场演示:

var IE_version=(-1/*@cc_on,@_jscript_version@*/);
if (IE_version!==-1){
    document.write("<h1>You are using Internet Explorer " + IE_version + "</h1>");
} else {
    document.write("<h1>You are not using a version of Internet Explorer less than 11</h1>");
}

这个方法的原理是基于条件注释只在旧版本的Internet Explorer中可见,而IE会将@_jscript_version设置为浏览器的版本。例如,如果您正在使用Internet Explorer 7,则@_jscript_version将被设置为7,因此,将执行的后处理JavaScript实际上看起来像这样:
var IE_version=(-1,7);

被计算为7。


-1

这不是纯粹的JavaScript。 - Stelios333

-1

简单解决方案,别再纠结于浏览器了,直接使用年份。

var year = eval(today.getYear());
if(year < 1900 )
 {alert('Good to go: All browsers and IE 9 & >');}
else
 {alert('Get with it and upgrade your IE to 9 or >');}

1
请问您能否解释一下为什么您认为这会奏效。 - user7892745
任何浏览器都会返回这个错误:today is not defined。而且你为什么要使用年份来检测IE版本呢? - Stelios333

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接