检查用户是否正在使用IE浏览器

490

我会通过点击具有特定类的div来调用以下类似的函数。

是否有一种方法可以在启动函数时检查用户是否正在使用Internet Explorer,并在他们使用其他浏览器时中止/取消它,以便它仅适用于IE用户?这里的用户都将在IE8或更高版本上运行,因此我不需要覆盖IE7和更低版本。

如果我能知道他们正在使用哪个浏览器,那就太好了,但并非必需。

示例函数:

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

7
按照现代Web开发标准,开发旧版IE的做法是不好的。 - Rosseyn
11
实际上,这种“不良做法”是由标准本身强制实施的,所以这不是开发者的错......浏览器的工作方式不同,规范对实现问题过于宽松。为了做出既不会有漏洞又不会无聊透顶的东西,必须进行浏览器检测。我建议采用另一种最佳实践:随着现代Web开发的发展,支持非基于Chromium的浏览器是一种不良做法(其中Safari被认为根本不是基于Chromium的)。很抱歉,但这种疯狂必须在某个时候以某种方式结束...... - user2173353
4
现今最好的实践是使用“特性检测”而非“浏览器检测”。询问所需功能是否由浏览器提供即可。 - Chris Rogers
2
@Chris - 抱歉...我的本意是想让那句话更有幽默感。我要把责任归咎于IE窃取了我的快乐,留下了苦涩和沮丧。 :) - JDB
2
@JDB - 完全不用担心。IE浏览器(又称“欢乐的月亮面孔杀手”)已经扼杀了许多人的灵魂。 :-) - Chris Rogers
显示剩余9条评论
33个回答

8
function detectIE() {
    var ua = window.navigator.userAgent;
    var ie = ua.search(/(MSIE|Trident|Edge)/);

    return ie > -1;
}

不回答问题。Edge 不是 IE。 - hda
hda,问题的日期可以追溯到2013年,我认为今天不应忽视“Edge”。 - Boss COTIGA

6

使用Modernizr

Modernizr.addTest('ie', function () {
    var ua = window.navigator.userAgent;
    var msie = ua.indexOf('MSIE ') > 0;
    var ie11 = ua.indexOf('Trident/') > 0;
    var ie12 = ua.indexOf('Edge/') > 0;
    return msie || ie11 || ie12;
});

不回答这个问题,因为Edge不是IE。而且Edge也不是IE12。当基于Chromium的Edge发布时,您还应该将Chrome或Opera添加到此列表中。(无论您想通过此实现什么目标,检测Firefox会更容易些) - hda

6

或者这个更简短的版本,如果浏览器是Internet Explorer,则返回true:

function isIe() {
    return window.navigator.userAgent.indexOf("MSIE ") > 0
        || !!navigator.userAgent.match(/Trident.*rv\:11\./);
}

5

这是另一个简单易懂的函数,用于检测浏览器是否为IE(不包括并不差的Edge):

function isIE() {
  var ua = window.navigator.userAgent;
  var msie = ua.indexOf('MSIE '); // IE 10 or older
  var trident = ua.indexOf('Trident/'); //IE 11

  return (msie > 0 || trident > 0);
}

5
如果您使用的是jQuery版本>=1.9,请尝试以下方法:
var browser;
jQuery.uaMatch = function (ua) {
    ua = ua.toLowerCase();

    var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
        /(webkit)[ \/]([\w.]+)/.exec(ua) ||
        /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
        /(msie) ([\w.]+)/.exec(ua) || 
        ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
       /(Trident)[\/]([\w.]+)/.exec(ua) || [];

    return {
        browser: match[1] || "",
        version: match[2] || "0"
    };
};
// Don't clobber any existing jQuery.browser in case it's different
if (!jQuery.browser) {
    matched = jQuery.uaMatch(navigator.userAgent);
    browser = {};

    if (matched.browser) {
        browser[matched.browser] = true;
        browser.version = matched.version;
    }

    // Chrome is Webkit, but Webkit is also Safari.
    if (browser.chrome) {
        browser.webkit = true;
    } else if (browser.webkit) {
        browser.safari = true;
    }

    jQuery.browser = browser;
}

如果使用的是jQuery版本<1.9($.browser在jQuery 1.9中已被删除),请改用下面的代码:

$('.myClass').on('click', function (event) {
    if ($.browser.msie) {
        alert($.browser.version);
    }
});

谢谢您的回复。不幸的是,我们仍在使用1.7.2版本,目前还无法更改。 - user2571510
据我所见,这似乎没有考虑到基于Trident引擎的较新版本IE浏览器。 - Bram Vanroy
基于Trident更新了最新的IE浏览器 - Rohan Kumar

4
如果您不想使用用户代理,您也可以通过以下方式检查浏览器是否为IE。该注释代码实际上在IE浏览器中运行,并将“false”更改为“true”。
var isIE = /*@cc_on!@*/false;
if(isIE){
    //The browser is IE.
}else{
    //The browser is NOT IE.
}   

1
IE11不支持条件编译。 - Gabriel Llamas
我刚试了一下,它仍然有效。你确定它不支持吗? - dev4life

3

我知道这是一个老问题,但是如果有人再次遇到检测IE11的问题,这里有一个适用于所有当前版本的IE的有效解决方案。

var isIE = false;
if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) {
    isIE = true;   
}

3

我用过这个。

function notIE(){
    var ua = window.navigator.userAgent;
    if (ua.indexOf('Edge/') > 0 || 
        ua.indexOf('Trident/') > 0 || 
        ua.indexOf('MSIE ') > 0){
       return false;
    }else{
        return true;                
    }
}

3

死灵术。

为了不依赖于用户代理字符串,只需检查一些属性:

if (document.documentMode) 
{
    console.log('Hello Microsoft IE User!');
}

if (!document.documentMode && window.msWriteProfilerMark) {
    console.log('Hello Microsoft Edge User!');
}

if (document.documentMode || window.msWriteProfilerMark) 
{
    console.log('Hello Microsoft User!');
}

if (window.msWriteProfilerMark) 
{
    console.log('Hello Microsoft User in fewer characters!');
}

此外,这还可以检测新版Chredge/Edgium(Anaheim):

function isEdg()
{ 

    for (var i = 0, u="Microsoft", l =u.length; i < navigator.plugins.length; i++)
    {
        if (navigator.plugins[i].name != null && navigator.plugins[i].name.substr(0, l) === u)
            return true;
    }

    return false;
}

这个可以检测到Chromium:

function isChromium()
{ 

    for (var i = 0, u="Chromium", l =u.length; i < navigator.plugins.length; i++)
    {
        if (navigator.plugins[i].name != null && navigator.plugins[i].name.substr(0, l) === u)
            return true;
    }

    return false;
}

还有这个Safari:

if(window.safari)
{
    console.log("Safari, yeah!");
}

2
有很多答案在这里,我想要添加我的意见。IE 11在flexbox方面存在诸多问题和不一致(请参见此处),所以我真的需要一种简单的方法来检查用户是否使用任何IE浏览器(包括11版本及以下),但是排除Edge浏览器,因为Edge其实相当不错。

基于这里提供的答案,我编写了一个简单的函数,返回一个全局布尔变量,你可以在后续使用它。很容易检查是否为IE浏览器。

var isIE;
(function() {
    var ua = window.navigator.userAgent,
        msie = ua.indexOf('MSIE '),
        trident = ua.indexOf('Trident/');

    isIE = (msie > -1 || trident > -1) ? true : false;
})();

if (isIE) {
    alert("I am an Internet Explorer!");
}

这样,您只需要进行一次查找,并将结果存储在变量中,而不必在每个函数调用时获取结果。(据我所知,您甚至不必等待文档准备好就可以执行此代码,因为用户代理与DOM无关。)


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