最简单/最轻的替代浏览器检测jQuery 1.9?

我有几个客户抱怨昨天有些代码停止工作。 显然,这涉及到插件使用现在不推荐使用的jQuery.browser ,当jQuery 1.9发布的时候,它停止了工作。

我(很快)看了1.9版的变更文档, 似乎他们想让我replace一些相当沉重的库,只是为了这个function。

是否有推荐最轻的插件或代码片段来恢复该function?

对于这些网站所需要的,这是非常基本的; 我只需要最基本的检测IE与FF与其他人。

build议?

我已经使用了由Alexx Roche回答的以下代码,但是我想要检测MSIE:

 <script type="text/javascript"> $(document).ready(function() { if (navigator.userAgent.match(/msie/i) ){ alert('I am an old fashioned Internet Explorer'); } }); </script> 

希望能帮助到你!

创build jQuery Migrate是为了在更新代码时实现向后兼容 。

https://github.com/jquery/jquery-migrate

作为奖励,它使用它们时logging已弃用的function。 当你解决问题的时候,我会试试看。 另外,你应该为你的网站设置特定版本的jQuery。 升级很好,但是在投入生产之前一定要testing这些升级。 如果您使用的是CDN,则仍然可以在文件名中指定特定的版本。

现在,你不需要为你所要求的jQuery插件 。 检出navigator对象 。

 appCodeName: "Mozilla" appName: "Netscape" appVersion: "5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17" cookieEnabled: true doNotTrack: null geolocation: Geolocation language: "en-US" mimeTypes: MimeTypeArray onLine: true platform: "MacIntel" plugins: PluginArray product: "Gecko" productSub: "20030107" userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17" vendor: "Google Inc." vendorSub: "" 
 var browser = { chrome: false, mozilla: false, opera: false, msie: false, safari: false }; var sUsrAg = navigator.userAgent; if(sUsrAg.indexOf("Chrome") > -1) { browser.chrome = true; } else if (sUsrAg.indexOf("Safari") > -1) { browser.safari = true; } else if (sUsrAg.indexOf("Opera") > -1) { browser.opera = true; } else if (sUsrAg.indexOf("Firefox") > -1) { browser.mozilla = true; } else if (sUsrAg.indexOf("MSIE") > -1) { browser.msie = true; } console.log(browser.msie); 

把这个代码放在你的网站(比如js文件,或者jQuery代码之后):

 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" }; }; 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; 

当我遇到同样的问题时,我使用了下面的代码:

 <script type="text/javascript"> $(document).ready(function() { //if (!$.browser.webkit && ! $.browser.mozilla) { //depricated if (!navigator.userAgent.match(/mozilla/i) && ! navigator.userAgent.match(/webkit/i) ){ alert('Let me tell you about Mozilla'); } }); </script> 

你可以不更新,直到你离开折旧方法。

你真的不应该从CDN中包含jquery而不指定版本号,它在某种程度上挫败了使用CDN(不caching)的目的。

以下是支持$ .browser的jQuery最新版本的链接:

jquery-1.8.3.min.js

只需将jquery.js srcreplace为该链接,并且代码将继续运行,直到您准备好前进并停止使用折旧function。

注意:Fancybox2仍然使用$ .browser,这是我更新以来最常见的一个。

更新:Slickgrid仍然使用$.browser ,截至02/11/2013没有更新

我将jQuery.browser的逻辑抽象成一个插件jquery.browser 。 该插件是在MIT许可下发布的。

我还增加了对IE11,Opera Webkit和Android检测的支持。

尝试Conditionizr

希望这可以帮助 :)

IE的精确版​​本可以通过额外检查特定IE版本中添加的标准全局对象的存在来检测。

 10 or older document.all 9 or older document.all && !window.atob 8 or older document.all && !document.addEventListener 7 or older document.all && !document.querySelector 6 or older document.all && !window.XMLHttpRequest 5.x document.all && !document.compatMode if (document.all && !document.querySelector) { alert('IE7 or lower'); } 

这些testing避免使用用于欺骗的userAgent

 if(!$.browser){ $.browser={chrome:false,mozilla:false,opera:false,msie:false,safari:false}; var ua=navigator.userAgent; $.each($.browser,function(c,a){ $.browser[c]=((new RegExp(c,'i').test(ua)))?true:false; if($.browser.mozilla && c =='mozilla'){$.browser.mozilla=((new RegExp('firefox','i').test(ua)))?true:false;}; if($.browser.chrome && c =='safari'){$.browser.safari=false;}; }); }; 

http://jsfiddle.net/R3AAX/3/

如果你想要的只是你的第三方jQuery插件能够使用jQuery.browser.msie,这是一个单线程。 只需在jQuery之后包含它。

 jQuery.browser = jQuery.browser || {msie: navigator.userAgent.match(/msie/i) ? true : false}; 

这是最愚蠢的解决办法,但这是我所需要的,而且确实有效,所以在这里!

添加到这个讨论。 我只是想出了一个jQuery的$ .browser插件,而不是“检测”,只是将用户代理parsing为一个易于使用的对象。 进一步的逻辑可以很容易地被用来进一步分解和parsing特定的浏览器和平台。

我在这里发现的useragents上有非常可靠的结果:UserAgentString.com 。 我甚至包括ie11的版本检测(靠近底部)。

 //The following code is by no means perfect, nor is it meant to be a standalone 'detection' plugin. //It demonstrates parsing the useragent string into an easy to manage object. //Even if it does make detection rediculously easy.. :) //Because this regex makes no assumptions in advance. //IMO, It's compatibilty and maintainability is much higher than those based on static identifiers. /* uaMatch replacement that parses a useragent string into an object useragent segments can be Name Value OR Name/Value OR Name Segment: Name Value Name: parsed to the last whitespace character Value: value after the last whitespace character Matches: (.NET CLR) (#.##), Android 2.3.4, etc Note: this regex can have leading/trailing whitespace (trimmed for object properties) Segment: Name/Value Matches: all values matching Name/Value Example: Firefox/24.0, Safari/533.1, Version/12.1, etc Segment: Name Matches: identifiers that hold no values (value of 'true' is implied) Example: Macintosh, Linux, Windows, KHTML, U, etc WARNING: not necessarily compatible with jQuery's $.browser implementation. - not recommended as a replacement for plugins that require it to function. */ (function ($) { var ua = navigator.userAgent.toLowerCase(); var regex = /compatible; ([\w.+]+)[ \/]([\w.+]*)|([\w .+]+)[: \/]([\w.+]+)|([\w.+]+)/g; var match = regex.exec(ua); var browser = { }; while (match != null) { var prop = {}; if (match[1]) { prop.type = match[1]; prop.version = match[2]; } else if (match[3]) { prop.type = match[3]; prop.version = match[4]; } else { prop.type = match[5]; } // some expressions have leading whitespace (i couldn't avoid this without a more complex expression) // trim them and get rid of '.' (' .NET CLR' = 'net_clr') prop.type = $.trim(prop.type).replace(".","").replace(" ","_"); var value = prop.version ? prop.version : true; if (browser[prop.type]) { if (!$.isArray(browser[prop.type])) browser[prop.type] = new Array(browser[prop.type]); browser[prop.type].push(value); } else browser[prop.type] = value; match = regex.exec(ua); } for (var i in browser) if (i.indexOf("mac") > -1) browser.mac = true; if (browser.windows_nt && !browser.windows) browser.windows = true; //put known browsers into the 'version' property for 'some' jquery compatibility //for sake of argument chromium 'is' chrome if (browser.chromium && !browser.chrome) browser.chrome = browser.chromium; //chrome / safari / webkit if (browser.chrome) { browser.version = browser.chrome; } else if (browser.safari) { browser.version = browser.safari; } else { if (browser.applewebkit) browser.webkit = browser.applewebkit; if (browser.webkit) browser.version = browser.webkit; } //firefox / gecko if (browser.firefox) { if (browser.rv) browser.version = browser.rv; else browser.version = browser.firefox; } else if (browser.gecko) { if (browser.rv) browser.version = browser.rv; else browser.version = browser.gecko; } //opera if (browser.opera && !browser.version) browser.version = browser.opera; //msie if (browser.trident && browser.rv) //ie11 browser.msie = browser.rv; if (browser.msie) browser.version = browser.msie; $.browser = browser;//Rename to reduce confliction? //WAS USED FOR TESTING & DISCOVERY (very useful) //TODO: remove line below alert(JSON.stringify($.browser)); }) (jQuery); 

在Internet Explorer 10上,JSON.stringify将输出如下所示:

 {"mozilla":"5.0","msie":"10.0","windows_nt":"6.2","trident":"6.0","net4.0e":true,"net4.0c":true,"net_clr":["3.5.30729","2.0.50727","3.0.30729"],"windows":true,"version":"10.0"} 

简短而强大。

 // chrome, safari, webkit, mozilla, msie, opera var chrome = /chrome/i.test(navigator.userAgent);