2013-01-17 8 views
5

Sì, so che è preferibile il rilevamento delle funzioni.Cos'è una sostituzione javascript semplice e veloce per jquery.browser (rimosso in jquery 1.9)?

Ho un caso nella mia base di codici in cui stiamo usando $.browser.msie e $.browser.version per decidere se rendere alcuni CSS o meno. Lo sviluppatore che ha scritto il codice non è più con noi e non capisco esattamente quale tipo di rilevamento di funzionalità dovrei scrivere qui.

Come soluzione rapida, qual è il modo più semplice per implementare $ .browser.msie e $ .browser.version?

+1

Non sarebbe l'opzione più semplice non aggiornare jQuery? Quindi non sarà necessario modificare nulla. –

+0

Perché è necessario rilevare il browser? Potresti usare 'modernizr' invece per il rilevamento delle funzionalità invece del rilevamento del browser. –

+0

@JamesAllardice - stiamo sviluppando un'estensione, i nostri clienti possono scegliere qualsiasi versione jQuery che desiderano. – ripper234

risposta

11

mi limiterò a copiare il codice da jQuery 1.8.3.

// 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; 
})(); 
4

Utilizzare conditional comments anziché JavaScript.

<!--[if lte IE 7]> 
<link rel="stylesheet" href="ie.css" type="text/css"> 
<![endif]--> 
+0

Grazie, non pertinente per me, ho bisogno di una soluzione javascript pura (sviluppo di un plugin javascript per siti di terze parti) – ripper234

+1

@ ripper234 Vedere http://stackoverflow.com/questions/5653788/is-there-a-way-to- introdurre-internet-explorer-condizionali-commenti-con-javascr –

1

Una soluzione rapida modo lo script non si romperà fino a quando è correttamente riscritta (aggiungere commenti condizionali per le altre versioni, se necessario):

<!--[if IE 7]> 
<script> if(typeof $!== typeof undefined){ $.browser = { msie : true, version : 7 }} </script> 
<![endif]--> 
<!--[if IE 8]> 
<script> if(typeof $!== typeof undefined){ $.browser = { msie : true, version : 8 }} </script> 
<![endif]--> 
1

JQuery pubblicato un Migrate plugin che ripristina $ .Browser quando viene utilizzato con 1.9. Assicurati di utilizzare la versione di produzione di Migrazione sui server di produzione. La versione di sviluppo genererà un sacco di messaggi della console che ti diranno dove il tuo codice si spezzerebbe in 1.9 sans Migrate.

Utilizzo di JQuery Migrate per ripristinare $ .browser probabilmente non è la soluzione migliore a lungo termine, tuttavia. Come suggerisce il nome, è inteso come uno strumento di transizione e non so se la sua funzionalità di rilevamento del browser verrà mantenuta attivamente. Un'alternativa sarebbe Modernizr.

Quello che farò personalmente è mantenere il mio sito di produzione su JQ 1.8 per il momento, e testare le cose con la versione di sviluppo di Migrate sulla mia macchina di sviluppo per avere un'idea migliore di ciò che 1.9 si romperà (hanno fatto molto di più che rimuovere $ .browser) prima di decidere una strategia di aggiornamento.

Problemi correlati