Wykrywanie JavaScript IE, dlaczego nie użyć prostych komentarzy warunkowych? [duplikat]
W celu wykrycia IE większość bibliotek Javascript wykonuje wszelkiego rodzaju sztuczki.
- JQuery wydaje się dodawać tymczasowy obiekt do DOM stron w celu wykrycia niektórych funkcji.]}
- YUI2 wykonuje regex na user agencie w jego
YAHOO.env.ua = function()
(Plikyahoo.js
)
Po przeczytaniu ta odpowiedź przyszło mi do głowy, że to prawda, aby wykryć po prostu IE w Javascript możemy po prostu dodać do naszych stron:
<!--[if IE]><script type="text/javascript">window['isIE'] = true;</script><![endif]-->
<script type="text/javascript" src="all-your-other-scripts-here.js"></script>
Teraz zmienna window.isIE
jest ustaw dla całego naszego kodu Javascript, po prostu wykonując:
if(window.isIE)
...
Poza tym, że może to spowodować ból, ponieważ musi być dodany na wszystkich stronach, czy są jakieś problemy/rozważania, których mogę być nieświadomy?
FYI: wiem, że lepiej jest użyć wykrywania obiektów zamiast wykrywania przeglądarki , ale są przypadki, w których nadal musisz użyć wykrywania przeglądarki.
15 answers
James Padolsey umieścił mały fragment na Githubie, który zacytuję tutaj:
// ----------------------------------------------------------
// A short snippet for detecting versions of IE in JavaScript
// without resorting to user-agent sniffing
// ----------------------------------------------------------
// If you're not in IE (or IE version is less than 5) then:
// ie === undefined
// If you're in IE (>=5) then you can determine which version:
// ie === 7; // IE7
// Thus, to detect IE:
// if (ie) {}
// And to detect the version:
// ie === 6 // IE6
// ie > 7 // IE8, IE9 ...
// ie < 9 // Anything less than IE9
// ----------------------------------------------------------
// UPDATE: Now using Live NodeList idea from @jdalton
var ie = (function(){
var undef,
v = 3,
div = document.createElement('div'),
all = div.getElementsByTagName('i');
while (
div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
all[0]
);
return v > 4 ? v : undef;
}());
Oczywiście wszystkie napisy powinny iść do Jamesa, jestem tylko posłańcem (ale proszę Zastrzel Posłańca, jeśli moja akcja Kopiuj-Wklej się pomyliła).
Spójrz także na widelce, które zostały stworzone. Paul Irish wyjaśnił wewnętrzne funkcjonowanie w komentarz .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-19 18:33:11
Jeśli chcesz to zrobić w ten sposób, myślę, że o wiele lepiej jest użyć kompilacji warunkowej, ponieważ możesz to zrobić wewnątrz javascript bez konieczności zmiany html:
var isIE = /*@cc_on!@*/false;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-12 21:40:15
ODPOWIEDŹ Marcela Korpela już nie działa(w IE 10 zwraca undef, więc IE 10 wydaje się nie być IE). Uwaga: teraz zaktualizowany do pracy z IE 11 również.
Jest to wariant tego kodu, ale który pochodzi z zaleceń Microsoftu . Jeśli używałeś poprzedniego kodu, możesz po prostu wpaść w ten zamiennik, ponieważ jest zbudowany tak, aby nazywać się dokładnie w ten sam sposób.
W przeciwieństwie do komentarzy warunkowych / kompilacji, powinna również działać dobrze z minimizery.
// ----------------------------------------------------------
// If you're not in IE (or IE version is less than 5) then:
// ie === undefined
// If you're in IE (>=5) then you can determine which version:
// ie === 7; // IE7
// Thus, to detect IE:
// if (ie) {}
// And to detect the version:
// ie === 6 // IE6
// ie > 7 // IE8, IE9, IE10 ...
// ie < 9 // Anything less than IE9
// ----------------------------------------------------------
var ie = (function(){
var undef,rv = -1; // Return value assumes failure.
var ua = window.navigator.userAgent;
var msie = ua.indexOf('MSIE ');
var trident = ua.indexOf('Trident/');
if (msie > 0) {
// IE 10 or older => return version number
rv = parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
} else if (trident > 0) {
// IE 11 (or newer) => return version number
var rvNum = ua.indexOf('rv:');
rv = parseInt(ua.substring(rvNum + 3, ua.indexOf('.', rvNum)), 10);
}
return ((rv > -1) ? rv : undef);
}());
zaktualizowany do pracy z IE11. Dzięki "acarlon" za wskazanie, że nie działa, a "mario" za Kod, na którym oparłem poprawkę!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-06 15:42:51
IE 11 wiele się zmieniło i obecnie wiele wcześniejszych metod wykrywania przeglądarki nie działa. Poniższy kod działa dla IE 11 i wcześniejszych.
function isIE()
{
var isIE11 = navigator.userAgent.indexOf(".NET CLR") > -1;
var isIE11orLess = isIE11 || navigator.appVersion.indexOf("MSIE") != -1;
return isIE11orLess;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-02 10:52:02
Myślę, że mam to, czego szukasz. Możesz uzyskać pełną wersję Internet Explorera jako ciąg znaków "AA. BB. CCCC. DDDD" za pomocą Javascript i clientCaps.
Http://www.pinlady.net/PluginDetect/IE/
Wydaje się działać dla IE 5.5 i wyższych (w tym IE 10). Jest odporny na nawigatora.tryb userAgent / document mode / browser mode. Nie ma potrzeby dodawania komentarzy warunkowych ani żadnych dodatkowych elementów HTML. Jest to czyste rozwiązanie Javascript.
Nie jestem pewien w tym razem jak IE Mobile zachowuje się, ale zawsze możesz użyć metody wykrywania kopii zapasowej w przypadku, gdy ta metoda clientCaps zawiedzie.
Jak na razie, muszę powiedzieć, że działa całkiem nieźle.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-21 13:59:48
Myślę, że odpowiedziałeś na własne pytanie: najpierw wykrywa TYLKO IE, więc skrypt w istocie podzieliłby wszechświat przeglądarek na 2 części: IE i .
Po drugie, musisz dodać zwariowany komentarz do każdej strony HTML. Biorąc pod uwagę, że szeroko zakrojone biblioteki JavaScript, takie jak jQuery i YUI, muszą być "łatwe" do wstawienia/wykorzystania dla szerokiego zakresu witryn, automatycznie sprawisz, że będą trudniejsze do wykorzystania poza bramą.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-12 21:45:24
navigator.userAgent
istnieje, jeśli wykrywanie przeglądarki (a nie wykrywanie funkcji) jest naprawdę potrzebne, a jQuery używa go do uzyskania informacji o obiekcie $.browser
. Jest to o wiele ładniejsze niż dołączanie komentarza warunkowego specyficznego dla IE na każdej stronie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-12 21:34:57
Tutaj znajdziesz kilka naprawdę prostych hacków do wykrywania przeglądarek: http://www.thespanner.co.uk/2009/01/29/detecting-browsers-javascript-hacks/
var isIE = IE='\v'=='v';
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-18 23:08:15
Używam tego kodu
Var isIE = Nawigator.userAgent.indexOf ('MSIE') > -1;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-16 14:46:05
var version = navigator.userAgent.match(/(msie) (\d+)/i);
console.log(version);
Coś szybkiego napisałem szybko Po spojrzeniu na to pytanie, na wypadek gdyby ktoś chciał.
** EDIT * *
Per Johnny Darvall ' s komentarz poniżej, dodaję link dla każdego, kto próbuje wywęszyć Internet Explorer 11:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-13 22:02:11
Sprawdzanie przeglądarek to zły pomysł - zamiast tego lepiej sprawdzić funkcje przeglądarki . Na przykład zazwyczaj sprawdzasz, czy użytkownik używa IE, ponieważ chcesz użyć jakiejś funkcji nie obsługiwanej w IE. Czy jednak wiesz, że wszystkie obecne i przyszłe przeglądarki spoza IE będą obsługiwać tę funkcję? Nie. Tak więc sposób np. używany przez jQuery jest lepszy: tworzy i wykonuje małe testy sprawdzające pewne błędy / funkcje - i możesz po prostu sprawdzić rzeczy takie jak if(browser_supports_XYZ) zamiast sprawdzania, czy użytkownik korzysta z określonej przeglądarki.
W każdym razie zawsze są przypadki, w których sprawdzanie przeglądarki jest konieczne, ponieważ jest to błąd wizualny, którego nie można przetestować pod kątem użycia skryptu. W tym przypadku lepiej jest użyć javascript zamiast komentarzy warunkowych, ponieważ masz sprawdzanie przeglądarki bezpośrednio w miejscu, w którym tego potrzebujesz, a nie w innym miejscu (wyobraź sobie .plik js, w którym sprawdzasz czy isIE nigdy nie jest zdefiniowane w tym pliku)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-12 21:41:13
W moim przypadku użycia, naprawdę muszę tylko wykryć, czy jest niższa niż IE9, więc używam
if (document.body.style.backgroundSize === undefined && navigator.userAgent.indexOf('MSIE') > -1)
{
//IE8- stuff
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-08 00:14:08
- zanieczyszcza globalną przestrzeń nazw
- wymaga zmian w dwóch plikach.
- działa tylko w IE
- technicznie, komentarz warunkowy jest nadal komentarzem
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-12 21:48:03
To działa całkiem dobrze.,var isIe = !!window.ActiveXObject;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-24 23:40:45
Dlaczego po prostu nie zaprogramujesz w HTML5 i nie sprawdzisz tego
if ( window.navigator.product !== "Gecko" )
?? Prawda, że będzie to zawierać IE11 w grupie "Gecko" , ale czy to nie powinno być wystarczająco dobre?
Uwaga: Specyfikacja HTML5. mówi ten Nawigator.produkt musi zwrócić "Gecko"... a IE10 i wcześniej wszystkie zwracają coś innego.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-03 16:14:58