2013-01-17 15 views
5

Tak, wiem, że funkcja wykrywania jest lepsza.Co to jest szybki, czysty zamiennik javascript dla jquery.browser (usunięty w jquery 1.9)?

Mam sprawę w mojej bazie kodu, w której używamy $.browser.msie i $.browser.version, aby zdecydować, czy renderować niektóre CSS, czy nie. Deweloper, który napisał kod, nie jest już z nami i nie do końca rozumiem, jaki rodzaj wykrywania cech powinienem tutaj napisać.

Jak szybko naprawić, jaki jest najkrótszy sposób wdrożenia $ .browser.msie i $ .browser.version?

+1

Czy nie najłatwiej byłoby nie uaktualnić jQuery? Wtedy nie będziesz musiał niczego zmieniać. –

+0

Dlaczego w ogóle musisz wykrywać przeglądarkę? Zamiast funkcji wykrywania przeglądarki można użyć funkcji "modernizr" zamiast funkcji wykrywania obiektów. –

+0

@JamesAllardice - rozwijamy rozszerzenie, nasi klienci mogą wybrać dowolną wersję jQuery, jakiej chcą. – ripper234

Odpowiedz

11

Ja po prostu skopiować kod z 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

Użyj conditional comments zamiast JavaScript.

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

Dziękuję, nie dotyczy mnie, potrzebuję czystego rozwiązania javascript (rozwijanie wtyczki javascript do stron zewnętrznych) – ripper234

+1

@ ripper234 Zobacz http://stackoverflow.com/questions/5653788/is-there-a-way-to- wprowadzenie-internet-explorer-warunkowe-komentarze-używając-javascr –

1

Quick Fix więc skrypt nie złamie dopóki nie zostanie prawidłowo refactored (dodawać komentarze warunkowe dla innych wersji, jeśli jest to konieczne):

<!--[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 wydała Migrate plugin która przywraca $ .browser gdy używana z 1.9. Tylko pamiętaj, aby użyć wersji produkcyjnej Migrate na serwerach produkcyjnych. Wersja rozwojowa wygeneruje kilka komunikatów konsoli informujących o tym, gdzie złamałby się kod w ciągu 1,9 sans Migrate.

Używanie JQuery Migrate do przywrócenia pliku $ .browser prawdopodobnie nie jest najlepszym rozwiązaniem długoterminowym. Jak sama nazwa wskazuje, jest to narzędzie przejściowe i nie wiem, czy jego funkcja wykrywania przeglądarki będzie aktywnie obsługiwana. Alternatywą może być Modernizr.

To, co osobiście zrobię, to utrzymywanie mojej strony produkcyjnej na JQ 1.8 na razie i testowanie rzeczy za pomocą wersji rozwojowej Migrate na mojej maszynie programistycznej, aby uzyskać lepsze wyobrażenie o tym, co 1.9 się zepsuje (zrobili to znacznie więcej niż tylko usunięcie $ .browser) przed podjęciem decyzji o strategii aktualizacji.

Powiązane problemy