检查用户是否使用 IE

IT技术 javascript jquery internet-explorer browser-detection
2021-01-13 18:33:57

我通过单击具有特定类的 div 来调用如下所示的函数。

如果用户正在使用 Internet Explorer,有没有办法在启动该功能时进行检查,如果他们使用其他浏览器,我可以中止/取消它,以便它仅对 IE 用户运行?这里的用户都在 IE8 或更高版本上,所以我不需要涵盖 IE7 和更低版本。

如果我能告诉他们正在使用哪个浏览器,那会很棒,但不是必需的。

示例函数:

$('.myClass').on('click', function(event)
{
    // my function
});
6个回答

几年后,Edge 浏览器现在使用 Chromium 作为其渲染引擎。
遗憾的是,检查 IE 11 仍然是一件事。

这是一个更直接的方法,因为旧版本的 IE 应该消失了。

if (window.document.documentMode) {
  // Do IE stuff
}

这是我的旧答案(2014):

在 Edge 中,用户代理字符串已更改。

/**
 * detect IEEdge
 * returns version of IE/Edge or false, if browser is not a Microsoft browser
 */
function detectIEEdge() {
    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 => return version number
       return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
    }

    // other browser
    return false;
}

示例用法:

alert('IEEdge ' + detectIEEdge());

IE 10 的默认字符串:

Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)

IE 11 的默认字符串:

Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko 

Edge 12 的默认字符串:

Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0 

Edge 13 的默认字符串(感谢 @DrCord):

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586 

Edge 14 的默认字符串:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/14.14300 

Edge 15 的默认字符串:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063 

Edge 16 的默认字符串:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299 

Edge 17 的默认字符串:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134 

Edge 18 的默认字符串(内幕预览):

Mozilla/5.0 (Windows NT 10.0; Win64; x64; ServiceUI 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17730 

在 CodePen 上测试:

http://codepen.io/gapcode/pen/vEJNZN

只是好奇,他们为什么要在新版本的 IE 中更改用户代理行?MS 真的不希望我们检测到他们糟糕的网络浏览器。
2021-03-16 18:33:57
谢谢你的评论。我还没有验证你的答案,但我想评论一件事:因为第一个 'if' 包含一个 'return',之后你不需要'else'。
2021-03-26 18:33:57
应该注意的是,Edge 并不是真正的“IE12”,但实际上是一个完全独立的浏览器。Windows 10 安装了 IE11 和 Edge。
2021-03-26 18:33:57
我对 IE 的仇恨与日俱增
2021-03-29 18:33:57
@SameerAlibhai 这在理论上听起来不错,但在实践中,尤其是目前,它不切实际。有时会出现单个“功能”检测不包含的问题,并且某些功能具有实现怪癖,只能通过浏览器的知识来解决。如果我想做一些简单的事情,比如收集浏览器统计信息怎么办?
2021-03-30 18:33:57

使用以下 JavaScript 方法:

function msieversion() 
{
    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

    if (msie > 0) // If Internet Explorer, return version number
    {
        alert(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))));
    }
    else  // If another browser, return 0
    {
        alert('otherbrowser');
    }

    return false;
}

您可以在以下 Microsoft 支持网站上找到详细信息:

如何从脚本确定浏览器版本

更新:(IE 11 支持)

function msieversion() {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

    if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./))  // If Internet Explorer, return version number
    {
        alert(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))));
    }
    else  // If another browser, return 0
    {
        alert('otherbrowser');
    }

    return false;
}
尽管这会很有效,因为 ua 变量永远不会以 MSIE 开头,但这样写if (msie > 0)会产生误导。如果未找到该值,则 indexOf() 函数返回 -1 而不是 0。因此if (msie > -1)会更具说明性。
2021-03-15 18:33:57
/Edge\/|Trident\/|MSIE /.test(window.navigator.userAgent) 我知道这适用于 10 和 11。如果您可以验证 <IE9 和 Edge,请编辑答案。
2021-03-17 18:33:57
navigator.userAgent.indexOf("MSIE") > 0 || navigator.userAgent.indexOf("Trident") > 0 || navigator.userAgent.indexOf("Edge") > 0
2021-03-19 18:33:57
@verism 和其他人:检查这个也适用于的答案IE 11stackoverflow.com/a/21712356/114029
2021-03-21 18:33:57
对我来说,这在 IE11 中返回 NaN。
2021-03-27 18:33:57

如果您只想知道浏览器是否为 IE,您可以这样做:

var isIE = false;
var ua = window.navigator.userAgent;
var old_ie = ua.indexOf('MSIE ');
var new_ie = ua.indexOf('Trident/');

if ((old_ie > -1) || (new_ie > -1)) {
    isIE = true;
}

if ( isIE ) {
    //IE specific code goes here
}

更新 1:更好的方法

我现在推荐这个。它仍然非常可读,并且代码少得多:)

var ua = window.navigator.userAgent;
var isIE = /MSIE|Trident/.test(ua);

if ( isIE ) {
  //IE specific code goes here
}

感谢 JohnnyFun 在评论中缩短答案:)

更新 2:在 CSS 中测试 IE

首先,如果可以,您应该使用@supports语句而不是 JS 来检查浏览器是否支持某个 CSS 功能。

.element {
  /* styles for all browsers */
}

@supports (display: grid) {
  .element {
    /* styles for browsers that support display: grid */
  }
}

(请注意,IE 根本不支持@supports,并且会忽略放置在@supports语句中的任何样式。)

如果问题无法解决,@supports那么您可以执行以下操作:

// JS

var ua = window.navigator.userAgent;
var isIE = /MSIE|Trident/.test(ua);

if ( isIE ) {
  document.documentElement.classList.add('ie')
}
/* CSS */

.element {
  /* styles that apply everywhere */
}

.ie .element {
  /* styles that only apply in IE */
}

(注意:classListJS 相对较新,我认为,在 IE 浏览器中,它仅适用于 IE11。可能也适用于 IE10。)

如果您在项目中使用 SCSS (Sass),这可以简化为:

/* SCSS (Sass) */

.element {
  /* styles that apply everywhere */

  .ie & {
    /* styles that only apply in IE */
  }
}

更新 3:添加 Microsoft Edge(不推荐)

如果您还想将 Microsoft Edge 添加到列表中,您可以执行以下操作。但是我不推荐它,因为 Edge 是一个比 IE 更胜任的浏览器。

var ua = window.navigator.userAgent;
var isIE = /MSIE|Trident|Edge\//.test(ua);

if ( isIE ) {
  //IE & Edge specific code goes here
}
或 ms_ie = /MSIE|Trident/.test(ua)
2021-03-17 18:33:57
我的版本对人类来说更直接,但更少的字节总是好的:)
2021-03-24 18:33:57
或者几个字节相同: ms_ie = ~ua.indexOf('MSIE ') || ~ua.indexOf('三叉戟/'); ;-)
2021-03-25 18:33:57
或者 ms_ie = !!ua.match(/MSIE|Trident/)
2021-03-26 18:33:57
@SimonSteinberger~有什么意义吗?
2021-04-06 18:33:57

true对于任何版本的 Internet Explorer 都会返回

function isIE(userAgent) {
  userAgent = userAgent || navigator.userAgent;
  return userAgent.indexOf("MSIE ") > -1 || userAgent.indexOf("Trident/") > -1 || userAgent.indexOf("Edge/") > -1;
}

userAgent参数是可选的,默认为浏览器的用户代理。

为什么要将 Edge 视为 IE?在兼容性方面,它们现在几乎没有共同之处。
2021-03-19 18:33:57
这应该很好,但是您基本上忘记了为 IE 浏览器设置默认的“return true”或“return 1”值。当检测到 IE 浏览器时,当前不会返回任何值。
2021-03-22 18:33:57
@docta_faustus userAgent 是一个参数,而不是一个全局变量
2021-04-09 18:33:57

您可以使用 navigator 对象来检测用户导航器,您不需要 jquery,下面的 4 条注释已经包含在内,因此此代码段按预期工作

if (/MSIE (\d+\.\d+);/.test(navigator.userAgent) || navigator.userAgent.indexOf("Trident/") > -1 ){ 
 // Do stuff with Internet-Exploders ... :)
}

http://www.javascriptkit.com/javatutors/navigator.shtml

这在 Firefox 45.0.2 中给出了误报。
2021-03-21 18:33:57
IE11 的用户代理不同于 MSIE (XX);通过检查 Trident 可以找到 IE11。
2021-03-29 18:33:57
错误的测试 indexOf 不会像测试函数正则表达式那样返回真或假 navigator.userAgent.indexOf("Trident/") != -1
2021-04-05 18:33:57
这给了我错误的 IE11
2021-04-07 18:33:57