jQuery 检测浏览器 IE9 及以下并抛出一个升级模式

Posted

技术标签:

【中文标题】jQuery 检测浏览器 IE9 及以下并抛出一个升级模式【英文标题】:jQuery Detect browser IE9 and below and throw up a modal to upgrade 【发布时间】:2013-11-02 22:34:24 【问题描述】:

我希望能够使用 jQuery 检测 IE9 或更低版本(或者是否有更好的方法?)。如果浏览器版本是 IE9 或更低,我想加载一个带有升级到 Chrome、FF 等选项的模式。

我已经读到 $.browser 不再工作了,所以只是想知道实现我想要的最好方法是什么:

$(document).ready(function()

   /* Get browser */
   $.browser.chrome = /chrome/.test(navigator.userAgent.toLowerCase());

   /* Detect Chrome */
   if($.browser.chrome)
      /* Do something for Chrome at this point */
      alert("You are using Chrome!");

      /* Finally, if it is Chrome then jQuery thinks it's 
       Safari so we have to tell it isn't */
       $.browser.safari = false;
  

  /* Detect Safari */
  if($.browser.safari)
      /* Do something for Safari */
      alert("You are using Safari!");
  

);

【问题讨论】:

仅对 IE9 使用条件注释。这样您就不必担心会嗅到丑陋的用户代理字符串。 可以参考这个msdn.microsoft.com/en-us/library/ms537509(v=vs.85).aspx 尽管这个问题很老并且已经有了答案,但我觉得有必要建议您不要使用模式来提醒您的用户。较旧的浏览器无法正确处理模式的显示,因此如果用户使用 IE5,例如,可能不会出现警报。 【参考方案1】:
var browser = 
        isIe: function () 
            return navigator.appVersion.indexOf("MSIE") != -1;
        ,
        navigator: navigator.appVersion,
        getVersion: function() 
            var version = 999; // we assume a sane browser
            if (navigator.appVersion.indexOf("MSIE") != -1)
                // bah, IE again, lets downgrade version number
                version = parseFloat(navigator.appVersion.split("MSIE")[1]);
            return version;
        
    ;

if (browser.isIe() && browser.getVersion() <= 9) 

    console.log("You are currently using Internet Explorer" + browser.getVersion() + " or are viewing the site in Compatibility View, please upgrade for a better user experience.")

【讨论】:

注意 IE 11 不再包含 MSIE【参考方案2】:

不要使用 jQuery 来检测 IE 版本。请改用条件 cmets。

为什么?好吧,首先考虑一下为什么要针对这些旧版本。这可能是因为它们不支持您需要的某些 JS/CSS 功能。那么你真的想维护你自己的 JS 代码,你确定会在这些旧版本中运行吗?如果你走那条路,那么你需要开始考虑你编写的检测代码是否可以在 IE6 或 5 或 4 中工作......很痛苦!

请尝试以下方法:

    将模态/横幅元素添加到 html。 在您的主 css 文件中,使用 display: none 隐藏此元素。这可确保最新版本的 IE 和非 IE 浏览器不会看到它。 创建一个仅用于 IE 的 css 或 js 文件以显示此元素。 将此文件包含在针对所需 IE 版本的条件 cmets 中。

下面的示例使用 CSS 进行了简单的显示,但如果您愿意,可以轻松地将其替换为 JS。只是不要让它太复杂,否则它很容易在早期的 IE 版本中崩溃。

#index.html
<html>
  <head>
    <link rel="stylesheet" type="text/css" href="main.css">
    <!--[if lte IE 9]>
      <link rel="stylesheet" type="text/css" href="ie-only.css">
    <![endif]-->
  </head>
  <body>
    <div class="ie-only">Go upgrade your browser!</div>
  </body>
</html>

#main.css
.ie-only  display: none 

#ie-only.css
.ie-only  display: block 

这是一个有用的conditional comments reference。

【讨论】:

【参考方案3】:
var isIE9OrBelow = function()

   return /MSIE\s/.test(navigator.userAgent) && parseFloat(navigator.appVersion.split("MSIE")[1]) < 10;

【讨论】:

navigator.appVersion.split("MSIE")[1] 是一个字符串,而不是一个数字,例如:`9.0;视窗 NT 6.1;哇64;三叉戟/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729;媒体中心PC 6.0; .NET4.0C; .NET4.0E; MS-RTC LM 8)`【参考方案4】:

$.browser() 已在 jquery version 1.9 中删除,请在您的脚本中使用以下代码,

(function($) 

    var matched, browser;

    // Use of jQuery.browser is frowned upon.
    // More details: http://api.jquery.com/jQuery.browser
    // jQuery.uaMatch maintained for back-compat
    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 ) ||
            [];

        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);

【讨论】:

【参考方案5】:

从Sitepoint调整:

if(navigator.appVersion.indexOf("MSIE 9.") !== -1)

【讨论】:

只检测 IE9。也不检测较低的 IE 版本。

以上是关于jQuery 检测浏览器 IE9 及以下并抛出一个升级模式的主要内容,如果未能解决你的问题,请参考以下文章

解决输入框placeholder属性不兼容IE9及以下浏览器问题

填个小坑,Vue不支持IE8及以下,跨域ajax不支持IE9

js或者jQuery实现在ie9以下浏览器中自动出现升级提示

JS检测IE版本

解决jquery ajax在跨域访问post请求的时候,ie9以下无效(包括ie9)的问题

检测浏览器中的 flex-wrap 支持