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

IT技术 javascript internet-explorer user-agent browser-detection
2021-02-07 04:57:02

如果我们网站的用户使用的是Internet Explorerv9 之前的版本,我想将他们的网站用户退回到错误页面只是不值得我们花时间和金钱来支持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. 是的,我知道微软有“条件注释”,可用于精确的浏览器版本检测。从 开始,IE 不再支持条件注释IE 10,这使得这种方法完全无用。

还有其他明显的问题需要注意吗?

6个回答

这是我的首选方式。它提供了最大程度的控制。(注意:条件语句仅在 IE5-9 中受支持。)

首先正确设置您的 ie 类

<!DOCTYPE html>
<!--[if lt IE 7]> <html class="lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>    <html class="lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>    <html class="lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html> <!--<![endif]-->    
<head>

然后你可以只使用 CSS 来创建样式异常,或者,如果你需要,你可以添加一些简单的 JavaScript:

(function ($) {
    "use strict";

    // Detecting IE
    var oldIE;
    if ($('html').is('.lt-ie7, .lt-ie8, .lt-ie9')) {
        oldIE = true;
    }

    if (oldIE) {
        // Here's your JS for IE..
    } else {
        // ..And here's the full-fat code for everyone else
    }

}(jQuery));

感谢保罗爱尔兰

我在 w3 html 验证器上收到一个错误: Error: Saw <!-- within a comment. Probable cause: Nested comment (not allowed). At line 5, column 21 if gt IE 8]><!--><html
2021-03-22 04:57:02
鉴于 OP 要求纯粹的 JavaScript 解决方案,我相信下面@Tim Down 的答案更好,因为它不涉及更改现有的 HTML,而且它不使用 jQuery:stackoverflow.com/a/10965203/134120
2021-03-24 04:57:02

返回 IE 版本,否则 IE 返回 false

function isIE () {
  var myNav = navigator.userAgent.toLowerCase();
  return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : false;
}

例子:

if (isIE () == 8) {
 // IE8 code
} else {
 // Other versions IE or not IE
}

或者

if (isIE () && isIE () < 9) {
 // is IE version less than 9
} else {
 // is IE 9 and later or not IE
}

或者

if (isIE()) {
 // is IE
} else {
 // Other browser
}
请注意,在 FF 中“false < 9”是“true”。所以,条件应该是if (isIE () && isIE () < 9) {
2021-03-18 04:57:02
批准的答案是如何检测 HTML 中的 IE 版本。这回答了最初的问题。
2021-03-24 04:57:02
@PrasadGayan - Microsoft Edge 不是 Internet Explorer。所以返回 false 似乎是它做的正确的事情。
2021-03-26 04:57:02
不适用于 IE11。从 IE 11 开始,他们已将 UA 字符串更改为"mozilla/5.0 (windows nt 6.3; wow64; trident/7.0; .net4.0e; .net4.0c; media center pc 6.0; .net clr 3.5.30729; .net clr 2.0.50727; .net clr 3.0.30729; rv:11.0) like gecko"
2021-03-27 04:57:02
@DeadlyChambers 也许它在 IE7 标准模式下运行?msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx
2021-04-07 04:57:02

使用条件注释。您正在尝试检测 IE < 9 的用户,并且条件注释将在这些浏览器中工作;在其他浏览器(IE >= 10 和非 IE)中,注释将被视为普通的 HTML 注释,这就是它们。

示例 HTML:

<!--[if lt IE 9]>
WE DON'T LIKE YOUR BROWSER
<![endif]-->

如果需要,您也可以完全使用脚本执行此操作:

var div = document.createElement("div");
div.innerHTML = "<!--[if lt IE 9]><i></i><![endif]-->";
var isIeLessThan9 = (div.getElementsByTagName("i").length == 1);
if (isIeLessThan9) {
    alert("WE DON'T LIKE YOUR BROWSER");
}
@Tim Down 的答案的 JavaScript 版本对我很有用。我使用 BrowserStack 在 Windows 7 和 IE 8、9、10 和 11 上对其进行了测试;Mac OS X Snow Leopard 与 Safari 5.1、Firefox 28.0、Chrome 33.0 和 Opera 20.0;iPhone 5 移动版 Safari;和 Android 三星 Galaxy Tab 2 10.1 4.0。正如预期的那样,只有 IE8 报告它是 IeLessThan9。好的!
2021-04-08 04:57:02

如果没有其他人添加了addEventLister-method 并且您使用的是正确的浏览器模式,那么您可以使用以下命令检查 IE 8 或更低版本

if (window.attachEvent && !window.addEventListener) {
    // "bad" IE
}

旧版 Internet Explorer 和 attachEvent (MDN)

这似乎是完全在 JavaScript 中检测 IE <= 8 的最有效方法 - 对于像我这样正在寻找方法的人来说非常有用。
2021-03-17 04:57:02
虽然这是一个“易于使用”的解决方案,但它有一些风险。您公司中的任何人(不知道您的解决方案)都可以实现“addEventListener”或“attachEvent”来解决 IE 8 中缺少它的问题。然后,您的代码将停止工作。
2021-03-17 04:57:02
伟大的!这也会在 Quirks 模式下检测 IE9,这正是我一直在寻找的。
2021-03-31 04:57:02

轻松检测 MSIE (v6 - v7 - v8 - v9 - v10 - v11):

if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) {
   // MSIE
}
用于检测 IE10,因为它不支持条件注释。在 IE11 中不起作用,但 IE11 通常具有良好的行为
2021-03-17 04:57:02
最后一个答案不讲使用特征检测,而是实际回答了这个问题。
2021-04-03 04:57:02