Jak wykryć przeglądarkę Safari za pomocą JavaScript? Wypróbowałem kod poniżej i wykrywa on nie tylko Safari, ale także przeglądarkę Chrome.
function IsSafari() {
var is_safari = navigator.userAgent.toLowerCase().indexOf('safari/') > -1;
return is_safari;
}
Odpowiedzi:
Możesz łatwo użyć indeksu Chrome, aby odfiltrować Chrome:
źródło
Uwaga: zawsze staraj się wykryć określone zachowanie, które próbujesz naprawić, zamiast kierować go na nie
isSafari?
W ostateczności wykryj Safari za pomocą tego wyrażenia regularnego:
Używa negatywnych rozejrzeń i wyklucza Chrome, Edge i wszystkie przeglądarki Androida, które zawierają
Safari
nazwę w swoim kliencie użytkownika.źródło
Jak już zauważyły inne osoby, wykrywanie funkcji jest lepsze niż sprawdzanie konkretnej przeglądarki. Jednym z powodów jest to, że można zmienić ciąg agenta użytkownika. Innym powodem jest to, że ciąg może się zmienić i uszkodzić kod w nowszych wersjach.
Jeśli nadal chcesz to zrobić i przetestować dla dowolnej wersji Safari, sugeruję użycie tego
Działa to z każdą wersją Safari na wszystkich urządzeniach: Mac, iPhone, iPod, iPad.
Edytować
Aby przetestować w bieżącej przeglądarce: https://jsfiddle.net/j5hgcbm2/
Edytuj 2
Zaktualizowano zgodnie z dokumentacją Chrome, aby poprawnie wykryć Chrome na iOS
Warto zauważyć, że wszystkie przeglądarki na iOS są po prostu opakowaniami dla Safari i używają tego samego silnika. Zobacz komentarz bfred.it do jego własnej odpowiedzi w tym wątku.
Edytuj 3
Zaktualizowano zgodnie z dokumentacją Firefoksa w celu poprawnego wykrywania Firefoksa na iOS
źródło
isSafari
będzietrue
w przeglądarce Safarifalse
. Możesz po prostu użyć powyższego fragmentu kodu, a następnie użyć swojego prawie tak, jak go opublikowałeś.if (isSafari) { do_this(); } else { do_that(); }
.&& !navigator.userAgent.match('FxiOS')
podobny test do Chrome - ref ( developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/ ... )Po prostu użyj:
źródło
getUserMedia
.Ten kod służy do wykrywania tylko przeglądarki Safari
źródło
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36 OPR/24.0.1558.51 (Edition Next)
lub standardowa przeglądarka systemu Android:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24
Ponieważ userAgent dla chrome i safari są prawie takie same, łatwiej będzie przyjrzeć się dostawcy przeglądarki
Safari
Chrom
FireFox (dlaczego jest pusty?)
IE (dlaczego jest niezdefiniowane?)
źródło
Tylko Safari bez Chrome:
Po wypróbowaniu innych kodów nie znalazłem żadnego, który działałby z nową i starszą wersją Safari.
Na koniec zrobiłem ten kod, który działa bardzo dobrze:
źródło
Zauważyłem, że tylko jedno słowo odróżnia Safari - „Wersja”. Więc to wyrażenie regularne będzie działać idealnie:
źródło
Nie wiem, dlaczego operator operacyjny chciał wykryć Safari, ale w rzadkich przypadkach, gdy potrzebujesz wąchania przeglądarki, obecnie prawdopodobnie ważniejsze jest wykrycie silnika renderującego niż nazwy przeglądarki. Na przykład w iOS wszystkie przeglądarki używają silnika Safari / Webkit, więc nie ma sensu umieszczać „chrome” lub „firefox” jako nazwy przeglądarki, jeśli podstawowym rendererem jest Safari / Webkit. Nie testowałem tego kodu ze starymi przeglądarkami, ale działa ze wszystkim, co jest całkiem nowe na Androidzie, iOS, OS X, Windows i Linux.
W celu wyjaśnienia:
źródło
używam tego
źródło
Najprostsza odpowiedź:
źródło
navigator.vendor.toLowerCase().indexOf('apple') > -1
if (navigator.vendor.match(/apple/i)) { ... }
.Dla przypomnienia, najbezpieczniejszym sposobem, jaki znalazłem, jest zaimplementowanie części Safari kodu wykrywania przeglądarki z tej odpowiedzi :
Oczywiście najlepszym sposobem radzenia sobie z problemami specyficznymi dla przeglądarki jest zawsze wykrywanie funkcji, jeśli jest to w ogóle możliwe. Użycie fragmentu kodu takiego jak powyższy jest jednak nadal lepsze niż wykrywanie ciągu agentów.
źródło
Wiem, że to pytanie jest stare, ale i tak pomyślałem o zamieszczeniu odpowiedzi, ponieważ może to komuś pomóc. Powyższe rozwiązania zawodziły w niektórych skrajnych przypadkach, więc musieliśmy zaimplementować je w sposób, który obsługuje osobno iOS, Desktop i inne platformy.
źródło
Zmodyfikowane wyrażenie regularne dla powyższej odpowiedzi
źródło
Ten wyjątkowy „problem” jest w 100% oznaką, że przeglądarka to Safari (wierz lub nie).
Oznacza to, że deskryptor obiektu cookie jest ustawiony na false w Safari, podczas gdy w pozostałych jest true, co w rzeczywistości przyprawia mnie o ból głowy w innym projekcie. Miłego kodowania!
źródło
Może to działa:
EDYCJA: BEZ PRACY
źródło
Tworzę funkcję, która zwraca typ boolowski:
źródło
Wąchanie klienta użytkownika jest naprawdę trudne i zawodne. Próbowaliśmy wykryć Safari na iOS z czymś w rodzaju odpowiedzi @ qingu powyżej, działało całkiem dobrze w Safari, Chrome i Firefox. Ale fałszywie wykrył Operę i Edge jako Safari.
Poszliśmy więc z wykrywaniem funkcji, jak wygląda na dzień dzisiejszy,
serviceWorker
jest obsługiwane tylko w Safari, a nie w żadnej innej przeglądarce na iOS. Jak podano w https://jakearchibald.github.io/isserviceworkerready/Więc zrobiliśmy coś takiego
Uwaga : nie testowano w Safari na MacOS.
źródło