检查用户是否正在使用带有jQuery的IE

use*_*510 340 javascript jquery internet-explorer browser-detection

我通过点击某个类的div来调用下面的函数.

有没有办法在用户使用Internet Explorer时检查何时启动该功能,如果他们使用其他浏览器就中止/取消它以便它只为IE用户运行?这里的用户都将使用IE8或更高版本,因此我不需要涵盖IE7及更低版本.

如果我可以告诉他们使用哪个浏览器那将是很好但不是必需的.

功能示例:

$('.myClass').on('click', function(event)
{
    // my function
});
Run Code Online (Sandbox Code Playgroud)

Mar*_*rio 537

从Internet Explorer 12+(也称为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;
}
Run Code Online (Sandbox Code Playgroud)

样品用法:

alert('IEEdge ' + detectIEEdge());
Run Code Online (Sandbox Code Playgroud)

IE 10的默认字符串:

Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)
Run Code Online (Sandbox Code Playgroud)

IE 11的默认字符串:

Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko 
Run Code Online (Sandbox Code Playgroud)

IE 12的默认字符串(aka Edge):

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 
Run Code Online (Sandbox Code Playgroud)

Edge 13的默认字符串(thx @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 
Run Code Online (Sandbox Code Playgroud)

边缘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 
Run Code Online (Sandbox Code Playgroud)

边缘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 
Run Code Online (Sandbox Code Playgroud)

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 
Run Code Online (Sandbox Code Playgroud)

边缘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 
Run Code Online (Sandbox Code Playgroud)

边缘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 
Run Code Online (Sandbox Code Playgroud)

在CodePen进行测试:

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

  • 应该注意的是Edge并不是真正的'IE12',而实际上是一个完全独立的浏览器.Windows 10同时安装了IE11和Edge. (33认同)
  • 只是好奇,为什么他们会改变IE新版本中的用户代理行?MS严重不希望我们检测到他们糟糕的网页浏览器. (27认同)
  • 我对IE的仇恨增长了 (13认同)
  • 感谢您的评论.我还没有验证你的答案,但我想评论一件事:第一个'if'包含'return',之后你不需要'else'. (4认同)
  • @SameerAlibhai这在理论上听起来不错,但在实践中,尤其是目前,它并不实用.有时出现单个"特征"检测不包含的问题,并且某些特征具有实现怪癖,这些怪癖只能通过浏览器的知识来解决.如果我想做一些简单的收集浏览器统计信息怎么办? (3认同)
  • Edge不是Internet Explorer或IE12。请停止暗示。另外,检测Edge有什么意义?它基于Chromium,因此您还应该在此代码中添加Opera和Chrome。 (3认同)

Spi*_*ode 436

使用以下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;
}
Run Code Online (Sandbox Code Playgroud)

您可以在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;
}
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,这会在IE11中返回NaN. (55认同)
  • 虽然这样可以很好地工作,因为ua变量永远不会以MSIE开头,但是写if(msie> 0)`会产生误导.如果未找到该值,则indexOf()函数返回-1而不是0.因此`if(msie> -1)`将更具说明性. (24认同)
  • `/ Edge\/ | Trident\/ | MSIE /.test(window.navigator.userAgent)`我知道这适用于10和11.如果你可以验证<IE9和Edge,编辑答案. (12认同)
  • navigator.userAgent.indexOf("MSIE") &gt; 0 || navigator.userAgent.indexOf("Trident") &gt; 0 || navigator.userAgent.indexOf("Edge") &gt; 0 (8认同)
  • @verism和其他人:检查这个也适用于`IE 11`的答案:http://stackoverflow.com/a/21712356/114029 (7认同)
  • @IvoMori:我猜那不是拒绝投票的原因。相反,您应该支持Mario的答案。:) (2认同)

Dan*_*non 113

只是添加马里奥非常有用的答案.

如果您只想知道浏览器是否为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
}
Run Code Online (Sandbox Code Playgroud)

更新

我现在推荐这个.它仍然非常易读,代码少得多:)

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

if ( isIE ) {
  //IE specific code goes here
}
Run Code Online (Sandbox Code Playgroud)

感谢JohnnyFun对缩短答案的评论:)

  • 我的版本对人类更直接的感觉,但更少的字节总是好:) (10认同)
  • 或者`ms_ie = !! ua.match(/ MSIE | Trident /)` (7认同)
  • 或者在几个字节中相同:ms_ie = ~ua.indexOf('MSIE')|| 〜ua.indexOf( '三叉戟/'); ;-) (5认同)
  • 或ms_ie =/MSIE|Trident/.test(ua) (4认同)

ben*_*ree 45

这将返回true任何版本的Internet Explorer:

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

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

  • 你为什么要把Edge视为IE?在兼容性方面,它们现在几乎没有共同之处. (10认同)

joh*_*ith 27

您可以使用导航器对象来检测用户导航器,您不需要jquery

<script type="text/javascript">

if (/MSIE (\d+\.\d+);/.test(navigator.userAgent) || navigator.userAgent.indexOf("Trident/") > -1 ){ 

 // do stuff with ie-users
}

</script>
Run Code Online (Sandbox Code Playgroud)

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

  • 这给了我IE11的假 (4认同)
  • IE11的用户代理与MSIE(XX)不同; 通过检查Trident可以找到IE11. (2认同)

Thi*_*ark 24

这就是Angularjs团队的工作方式(v 1.6.5):

var msie, // holds major version number for IE, or NaN if UA is not IE.

// Support: IE 9-11 only
/**
 * documentMode is an IE-only property
 * http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx
 */
msie = window.document.documentMode;
Run Code Online (Sandbox Code Playgroud)

然后有几行代码分散在一起使用它作为一个数字,如

if (event === 'input' && msie <= 11) return false;
Run Code Online (Sandbox Code Playgroud)

if (enabled && msie < 8) {
Run Code Online (Sandbox Code Playgroud)

  • 它在MS Edge中未定义,因为MS Edge不是IE! (18认同)
  • IE8+ 支持`document.documentMode`。对于 Edge 或 Chrome/FireFox...,它将是“未定义的”。我将此代码更改为 `var IEver = window.document.documentMode || (window.attachEvent? 1 : 99);` 这样它对于 IE8+ 返回精确的 IE 版本,对于非 IE 浏览器(通常它将是现代浏览器)返回 99,对于旧的 IE5-7 返回 1。之所以这样写是因为我们通常只需要对一些较旧的 IE 进行特殊处理。所以,`if (IEver &lt; 9) { ... }` 表示它是否是一个旧的 IE (2认同)

ken*_*238 19

你可以简单地这样做:

var isIE = window.document.documentMode ? true : false; // this variable will hold if the current browser is IE
Run Code Online (Sandbox Code Playgroud)

我知道这个问题很老了,但如果有人滚动到那么远,他们可以看到简单的答案:)


gdi*_*ble 10

使用上面的答案; 简单和精简返回布尔值:

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


Aam*_*zad 9

方法01:
$ .browser在jQuery 1.3版中已弃用,在1.9中已删除

if ( $.browser.msie) {
  alert( "Hello! This is IE." );
}
Run Code Online (Sandbox Code Playgroud)

方法02:
使用条件注释

<!--[if gte IE 8]>
<p>You're using a recent version of Internet Explorer.</p>
<![endif]-->

<!--[if lt IE 7]>
<p>Hm. You should upgrade your copy of Internet Explorer.</p>
<![endif]-->

<![if !IE]>
<p>You're not using Internet Explorer.</p>
<![endif]>
Run Code Online (Sandbox Code Playgroud)

方法03:

 /**
 * Returns the version of Internet Explorer or a -1
 * (indicating the use of another browser).
 */
function getInternetExplorerVersion()
{
    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 >= 8.0 ) 
            msg = "You're using a recent copy of Internet Explorer."
        else
            msg = "You should upgrade your copy of Internet Explorer.";
    }

    alert( msg );
}
Run Code Online (Sandbox Code Playgroud)

方法04:
使用JavaScript /手动检测

/*
     Internet Explorer sniffer code to add class to body tag for IE version.
     Can be removed if your using something like Modernizr.
 */
 var ie = (function ()
 {

     var undef,
     v = 3,
         div = document.createElement('div'),
         all = div.getElementsByTagName('i');

     while (
     div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i>< ![endif]-->',
     all[0]);

     //append class to body for use with browser support
     if (v > 4)
     {
         $('body').addClass('ie' + v);
     }

 }());
Run Code Online (Sandbox Code Playgroud)

参考链接


hea*_*one 6

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

    return ie > -1;
}
Run Code Online (Sandbox Code Playgroud)


Flo*_*ris 6

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

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


Bil*_*_VA 6

我只想检查浏览器是否为IE11或更旧版本,因为它们很糟糕。

function isCrappyIE() {
    var ua = window.navigator.userAgent;
    var crappyIE = false;
    var msie = ua.indexOf('MSIE ');
    if (msie > 0) {// IE 10 or older => return version number        
        crappyIE = true;
    }
    var trident = ua.indexOf('Trident/');
    if (trident > 0) {// IE 11 => return version number        
        crappyIE = true;
    }
    return crappyIE;
}   

if(!isCrappyIE()){console.table('not a crappy browser);}
Run Code Online (Sandbox Code Playgroud)

  • 我因其对命名约定标准的高度重视而投票 (3认同)

Roh*_*mar 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;
}
Run Code Online (Sandbox Code Playgroud)

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

$('.myClass').on('click', function (event) {
    if ($.browser.msie) {
        alert($.browser.version);
    }
});
Run Code Online (Sandbox Code Playgroud)


kev*_*vnk 5

Using 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;
});
Run Code Online (Sandbox Code Playgroud)


Chu*_*utt 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);
}
Run Code Online (Sandbox Code Playgroud)