O jQuery $ .browser está obsoleto?

Alguém pode me dizer se estou certo em acreditar que o $ .browser do jQuery está / foi preterido?

As minhas implementações existentes continuarão funcionando? Se não, existe uma alternativa fácil de implementar.

Da documentação :

A propriedade $ .browser está obsoleta no jQuery 1.3 e sua funcionalidade pode ser movida para um plug-in suportado por equipe em uma versão futura do jQuery.

Então, sim, está obsoleto, mas suas implementações existentes continuarão funcionando. Se a funcionalidade for removida, provavelmente será facilmente acessível usando um plug-in.

Quanto a saber se existe uma alternativa … A resposta é “sim, provavelmente”. É muito melhor fazer a detecção de resources usando o $.support do que a detecção do navegador: detectar o recurso real de que você precisa, não o navegador que o fornece. Os resources mais importantes que variam de navegador para navegador são detectados com isso.


Atualização de 16 de fevereiro de 2013: No jQuery 1.9, esse recurso foi removido ( docs ). É muito melhor não usá-lo. Se você realmente precisa usar sua funcionalidade, você pode restaurá-la com o plugin jQuery Migrate .

Segunda questão

As minhas implementações existentes continuarão funcionando? Se não, existe uma alternativa fácil de implementar.

A resposta é sim , mas não sem um pouco de trabalho.

O $ .browser é um plugin oficial que foi incluído em versões mais antigas do jQuery, assim como qualquer plugin você pode copiá-lo e incorporá-lo em seu projeto ou simplesmente adicioná-lo ao final de qualquer release do jQuery.

Eu extraí o código para você caso queira usá-lo.


 // Limit scope pollution from any deprecated API (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" }; }; 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.sub = function() { function jQuerySub( selector, context ) { return new jQuerySub.fn.init( selector, context ); } jQuery.extend( true, jQuerySub, this ); jQuerySub.superclass = this; jQuerySub.fn = jQuerySub.prototype = this(); jQuerySub.fn.constructor = jQuerySub; jQuerySub.sub = this.sub; jQuerySub.fn.init = function init( selector, context ) { if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { context = jQuerySub( context ); } return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); }; jQuerySub.fn.init.prototype = jQuerySub.fn; var rootjQuerySub = jQuerySub(document); return jQuerySub; }; })(); 

Se você está perguntando por que alguém precisaria de um plugin depreciado, preparei a seguinte resposta.

Em primeiro lugar, a resposta é a compatibilidade. Como o jQuery é baseado em plugins, alguns desenvolvedores optaram por usar o $ .browser e com as versões mais recentes do jQuery, que não incluem o $ .browser em todos esses plugins inutilizados.

O jQuery lançou um plug-in de migration , que foi criado para que os desenvolvedores detectassem se seus plug-ins usavam dependencies depreciadas, como $ .browser.

Embora isso tenha ajudado os desenvolvedores a corrigir seus plugins. jQuery derrubou $ .browser completamente, então a correção acima é provavelmente a única solução até que seus desenvolvedores atualizem ou incorporem os itens acima.

Sobre: jQuery.browser

Aqui eu apresento uma maneira alternativa de detectar um navegador, com base na disponibilidade de resources.

Para detectar apenas o IE, você pode usar isto:

 if(/*@cc_on!@*/false || typeof ScriptEngineMajorVersion === "function") { //You are using IE>=4 (unreliable for IE11) } else { //You are using other browser } 

Para detectar os navegadores mais populares:

 if(/*@cc_on!@*/false || typeof ScriptEngineMajorVersion === "function") { //You are using IE >= 4 (unreliable for IE11!!!) } else if(window.chrome) { //You are using Chrome or Chromium } else if(window.opera) { //You are using Opera >= 9.2 } else if('MozBoxSizing' in document.body.style) { //You are using Firefox or Firefox based >= 3.2 } else if({}.toString.call(window.HTMLElement).indexOf('Constructor')+1) { //You are using Safari >= 3.1 } else { //Unknown } 

Esta resposta foi atualizada porque o IE11 não suporta mais a compilation condicional (o truque /*@cc_on!@*/false ).
Você pode verificar O IE11 removeu a compilation condicional do javascript? para mais informações sobre este tópico.
Eu usei a sugestão que eles apresentaram lá.
Alternativamente, você pode usar typeof document.body.style.msTransform == "string" ou document.body.style.msTransform !== window.undefined ou até mesmo 'msTransform' in document.body.style .

Atualizada! 24/03/2015 (rolar abaixo de hr)

A resposta da lonesomeday é absolutamente correta, eu apenas pensei em adicionar este detalhe. Eu tinha feito um método um tempo atrás para obter o navegador no Vanilla JS e, eventualmente, jQuery.browser lo para replace o jQuery.browser em versões posteriores do jQuery. Ele não interfere em nenhuma parte da nova biblioteca jQuery, mas fornece a mesma funcionalidade do object jQuery.browser tradicional, bem como alguns outros pequenos resources.


Nova versão estendida!

É muito mais completo para o navegador mais recente. Além disso, 90% de precisão nos testes móveis! Não vou dizer 100%, como não testei em todos os navegadores móveis, mas o novo recurso adiciona $.browser.mobile boolean / string. É falso se não for móvel, senão será um nome String para o dispositivo móvel ou navegador (melhores adivinhações como: Android, RIM Tablet, iPod, etc …).

Uma possível advertência pode não funcionar com alguns navegadores mais antigos (não suportados), pois depende completamente da string userAgent .

JS Minified

 /* quick & easy cut & paste */ ;;(function($){if(!$.browser&&1.9< =parseFloat($.fn.jquery)){var a={browser:void 0,version:void 0,mobile:!1};navigator&&navigator.userAgent&&(a.ua=navigator.userAgent,a.webkit=/WebKit/i.test(a.ua),a.browserArray="MSIE Chrome Opera Kindle Silk BlackBerry PlayBook Android Safari Mozilla Nokia".split(" "),/Sony[^ ]*/i.test(a.ua)?a.mobile="Sony":/RIM Tablet/i.test(a.ua)?a.mobile="RIM Tablet":/BlackBerry/i.test(a.ua)?a.mobile="BlackBerry":/iPhone/i.test(a.ua)?a.mobile="iPhone":/iPad/i.test(a.ua)?a.mobile="iPad":/iPod/i.test(a.ua)?a.mobile="iPod":/Opera Mini/i.test(a.ua)?a.mobile="Opera Mini":/IEMobile/i.test(a.ua)?a.mobile="IEMobile":/BB[0-9]{1,}; Touch/i.test(a.ua)?a.mobile="BlackBerry":/Nokia/i.test(a.ua)?a.mobile="Nokia":/Android/i.test(a.ua)&&(a.mobile="Android"),/MSIE|Trident/i.test(a.ua)?(a.browser="MSIE",a.version=/MSIE/i.test(navigator.userAgent)&&0 

jsFiddle "Plugin jQuery: Obtenha o navegador (Extended Alt Edition)"

 /** jQuery.browser * @author JD McKinstry (2014) * @description Made to replicate older jQuery.browser command in jQuery versions 1.9+ * @see http://jsfiddle.net/SpYk3/wsqfbe4s/ * * @extends jQuery * @namespace jQuery.browser * @example jQuery.browser.browser == 'browserNameInLowerCase' * @example jQuery.browser.version * @example jQuery.browser.mobile @returns BOOLEAN * @example jQuery.browser['browserNameInLowerCase'] * @example jQuery.browser.chrome @returns BOOLEAN * @example jQuery.browser.safari @returns BOOLEAN * @example jQuery.browser.opera @returns BOOLEAN * @example jQuery.browser.msie @returns BOOLEAN * @example jQuery.browser.mozilla @returns BOOLEAN * @example jQuery.browser.webkit @returns BOOLEAN * @example jQuery.browser.ua @returns navigator.userAgent String */ ;;(function($){if(!$.browser&&1.9< =parseFloat($.fn.jquery)){var a={browser:void 0,version:void 0,mobile:!1};navigator&&navigator.userAgent&&(a.ua=navigator.userAgent,a.webkit=/WebKit/i.test(a.ua),a.browserArray="MSIE Chrome Opera Kindle Silk BlackBerry PlayBook Android Safari Mozilla Nokia".split(" "),/Sony[^ ]*/i.test(a.ua)?a.mobile="Sony":/RIM Tablet/i.test(a.ua)?a.mobile="RIM Tablet":/BlackBerry/i.test(a.ua)?a.mobile="BlackBerry":/iPhone/i.test(a.ua)?a.mobile="iPhone":/iPad/i.test(a.ua)?a.mobile="iPad":/iPod/i.test(a.ua)?a.mobile="iPod":/Opera Mini/i.test(a.ua)?a.mobile="Opera Mini":/IEMobile/i.test(a.ua)?a.mobile="IEMobile":/BB[0-9]{1,}; Touch/i.test(a.ua)?a.mobile="BlackBerry":/Nokia/i.test(a.ua)?a.mobile="Nokia":/Android/i.test(a.ua)&&(a.mobile="Android"),/MSIE|Trident/i.test(a.ua)?(a.browser="MSIE",a.version=/MSIE/i.test(navigator.userAgent)&&0').append( $('', { text: x }), $('', { text: b[x] }) ).appendTo($('table')); } 
 table { border-collapse: collapse; } th, td { border: 1px solid; padding: .25em .5em; vertical-align: top; } th { text-align: right; } textarea { height: 500px; width: 100%; } 
  

“A propriedade $ .browser está obsoleta no jQuery 1.3, e sua funcionalidade pode ser movida para um plugin suportado pela equipe em uma versão futura do jQuery.”

De http://api.jquery.com/jQuery.browser/

A partir da documentação oficial em http://api.jquery.com/jQuery.browser/ :

Esta propriedade foi removida no jQuery 1.9 e está disponível somente através do plugin jQuery.migrate.

Você pode usar, por exemplo, jquery-migrate-1.4.1.js para manter seu código existente ou plugins que usam $ .browser ainda funcionando enquanto você descobre uma maneira de se livrar totalmente de $ .browser de seu código no futuro.