Szukam funkcji, która zwraca wartość logiczną, jeśli użytkownik ma przeglądarkę mobilną, czy nie.
Wiem, że mogę używać navigator.userAgent
i pisać tę funkcję za pomocą wyrażenia regularnego, ale programy klienckie są zbyt różne dla różnych platform. Wątpię, aby dopasowanie wszystkich możliwych urządzeń było łatwe i myślę, że ten problem został rozwiązany wiele razy, więc powinno być jakieś kompletne rozwiązanie dla takiego zadania.
Patrzyłem na tę stronę , ale niestety skrypt jest tak tajemniczy, że nie mam pojęcia, jak użyć go do moich celów, czyli do utworzenia funkcji zwracającej wartość prawda / fałsz.
Vary: User-Agent
do swojej odpowiedzi, w przeciwnym razie buforujące serwery proxy przechowają jedną wersję i wysyłają ją do innego rodzaju przeglądarki. AleVary: User-Agent
sprawia, że odpowiedź jest nieosiągalna w IE.Odpowiedzi:
Za pomocą Regex (z wykryciamobilebrowsers.com ):
Oto funkcja, która używa niezwykle długiego i kompleksowego wyrażenia regularnego, który zwraca wartość a
true
lub wfalse
zależności od tego, czy użytkownik przegląda telefon komórkowy.Dla tych, którzy chcą włączyć tablety do tego testu (choć prawdopodobnie nie powinieneś), możesz skorzystać z następującej funkcji:
Oryginalna odpowiedź
Możesz to zrobić, po prostu przeglądając listę urządzeń i sprawdzając, czy
useragent
pasuje coś takiego:Ponieważ jednak uważasz, że ta metoda jest zawodna, możesz założyć, że każde urządzenie o rozdzielczości 800 x 600 lub mniejszej było również urządzeniem mobilnym, co jeszcze bardziej zawęziło cel (chociaż obecnie wiele urządzeń mobilnych ma znacznie wyższe rozdzielczości niż to)
to znaczy
Odniesienie:
źródło
|android|ipad|playbook|silk
do pierwszego wyrażenia regularnego.Co powiesz na:
... ponieważ smartfony zwykle obsługują tę właściwość, a przeglądarki stacjonarne nie.
EDYCJA: Jak wskazał @Gajus, to rozwiązanie jest obecnie przestarzałe i nie powinno być używane ( https://developer.mozilla.org/en-US/docs/Web/API/Window/orientation )
źródło
window.orientation
to przestarzała właściwość ( developer.mozilla.org/en-US/docs/Web/API/Window/orientation , zgodność.spec.whatwg.org /# dom-window-orientation ), którą niektóre przeglądarki mobilne wybierają do obsługi z nieznanych przyczyn . Implementacja tych samych przeglądarekwindow.screen.orientation
(która jest również zdefiniowana w przeglądarkach komputerowych). Mogę tylko założyć, żewindow.orientation
zostało tam ze względów starszych i dlatego nie powinien być stosowany w nowych aplikacjach.Jak używać
Aby sprawdzić, czy użytkownik korzysta z określonego urządzenia mobilnego:
Ref: http://www.abeautifulsite.net/blog/2011/11/detecting-mobile-devices-with-javascript
Ulepszona wersja na github: https://github.com/smali-kazmi/detect-mobile-browser
źródło
any()
for ... w pętliisMobile
członków ORed ?Oto proste rozwiązanie ze źródła procy Facebooka
źródło
Przybyłem tutaj, szukając prostego, czystego sposobu na wykrycie „urządzeń z ekranem dotykowym”, które klasyfikuję jako telefony komórkowe i tablety. W obecnych odpowiedziach nie znalazłem czystego wyboru, ale opracowałem następujące, które mogą również komuś pomóc.
Edycja : Aby jednocześnie obsługiwać komputery stacjonarne z ekranem dotykowym i telefony komórkowe, możesz użyć:
źródło
touchstart|end|etc
.navigator.maxTouchPoints
(bezms
prefiksu). Jest też artykuł MDN do sprawdzenia.Jak wielu stwierdziło, poleganie na ruchomym celu danych klienta użytkownika jest problematyczne. To samo można powiedzieć o liczeniu na ekranie.
Moje podejście zapożyczono z techniki CSS, aby ustalić, czy interfejs jest dotykowy:
Używając tylko javascript (obsługa wszystkich współczesnych przeglądarek), dopasowanie zapytania medialnego może łatwo wywnioskować, czy urządzenie jest mobilne .
źródło
Zgodnie z artykułem MDN na temat wykrywania przeglądarki przy użyciu klienta , zaleca się unikanie tego podejścia, jeśli to możliwe, i sugerowanie innych sposobów, takich jak wykrywanie funkcji.
Jeśli jednak trzeba użyć klienta użytkownika jako środka do wykrywania, czy urządzenie jest mobilne, sugerują:
Dlatego wystarczy jedna linijka:
const isMobileDevice = window.navigator.userAgent.toLowerCase().includes("mobi");
[AKTUALIZACJA]:
Jak sugeruje @ zenw0lf w komentarzach, lepiej byłoby użyć wyrażenia regularnego:
const isMobileDevice = /Mobi/i.test(window.navigator.userAgent)
źródło
.includes
nie wspierane przez IE-11Mobile
ciągu agenta użytkownikaIf the device is large enough that it's not marked with “Mobi”, you should serve your desktop site (which, as a best practice, should support touch input anyway, as more desktop machines are appearing with touchscreens).
const isMobile = /Mobi/.test(window.navigator.userAgent)
Nie ma idealnego rozwiązania do wykrywania, czy kod JS jest wykonywany w przeglądarce mobilnej, ale następujące dwie opcje powinny w większości przypadków działać.
Opcja 1: wąchanie przeglądarki
Ten konkretny kod podsłuchujący przeglądarkę jest biblioteką o nazwie isMobile .
Opcja 2: orientacja okna
Sprawdź, czy
window.orientation
jest zdefiniowany:Uwaga
Nie wszystkie urządzenia z ekranem dotykowym są mobilne i odwrotnie. Tak więc, jeśli chcesz zaimplementować coś specjalnie dla ekranu dotykowego, nie powinieneś testować, czy twoja przeglądarka działa na urządzeniu mobilnym, a raczej czy urządzenia obsługują ekran dotykowy:
źródło
window.orientation
rozwiązanie, ale doktorzy mówią, że jest przestarzałe! developer.mozilla.org/en-US/docs/Web/API/Window/orientationOto rozwiązanie UserAgent, które jest bardziej skuteczne niż dopasowanie ...
źródło
/iphone|etc/i.test(navigator.userAgent)
Aby dodać dodatkową warstwę kontroli, używam pamięci HTML5, aby wykryć, czy używa ona pamięci mobilnej czy stacjonarnej. Jeśli przeglądarka nie obsługuje pamięci, mam tablicę mobilnych nazw przeglądarek i porównuję agenta użytkownika z przeglądarkami w tablicy.
To jest dość proste. Oto funkcja:
źródło
sessionStorage.desktop
nie istnieje w przeglądarce Safari, Chrome ani Firefox (wszystkie najnowsze wersje w momencie publikacji). Otrzymujesz jednak głos w górę, ponieważ twoje rozwiązanie idzie w lepszym kierunku niż inne. Ale nie zapomnij użyćvar mobile =
zamiastmobile =
.Wykrywanie funkcji jest znacznie lepsze niż próba ustalenia, na którym urządzeniu się znajdujesz, i bardzo trudno jest nadążyć za nowymi urządzeniami, biblioteka taka jak Modernizr informuje, czy dana funkcja jest dostępna, czy nie.
źródło
Co powiesz na coś takiego?
źródło
screen.width
zamiast tego? Wydaje mi się, że jest bardziej niezawodny niżwindow.matchMedia
.Gdy element zyska ostrość, natychmiast go rozmyjesz. Bootstrap-datepicker, który jest bardzo popularnym i dobrze utrzymanym składnikiem z prawie 10.000 gwiazd w GitHub, wykorzystuje to podejście:
https://github.com/uxsolutions/bootstrap-datepicker
Dzięki Tigger za pomoc.
źródło
Naprawdę dobrym sposobem na wykrycie urządzeń mobilnych lub tabletów jest sprawdzenie, czy przeglądarka może utworzyć zdarzenie dotykowe.
Zwykły kod JavaScript:
To działało dla mnie naprawdę dobrze, ale może występować problem z urządzeniami laptopów, które zawierają ekran dotykowy.
Nie jestem pewien, czy laptop z ekranem dotykowym zostanie wykryty jako urządzenie mobilne, ponieważ jeszcze go nie testowałem.
źródło
Oto moje przemyślane rozwiązanie problemu. Wciąż nie jest idealny. Jedynym prawdziwym rozwiązaniem byłoby, gdyby producenci urządzeń zaczęli poważnie traktować ciągi agenta użytkownika „Mobile” i „Tablet”.
Co się stanie, gdy tablet Nexus 7 ma tylko ciąg znaków UA? Po pierwsze, komórka staje się prawdą, później tablet staje się również prawdą, ale tablet usunie ciąg Mobile UA z tagu body.
CSS:
alert
linie dodane do programowania. Konsola Chrome może emulować wiele urządzeń przenośnych. Przetestuj tam.EDYTOWAĆ:
Po prostu nie używaj tego, zamiast tego użyj funkcji wykrywania. Istnieje tak wiele urządzeń i marek, że kierowanie na markę NIGDY nie będzie właściwym rozwiązaniem.
źródło
Radzę sprawdzić http://wurfl.io/
Krótko mówiąc, jeśli importujesz mały plik JS:
pozostanie obiekt JSON, który wygląda następująco:
(przy założeniu, że używasz Nexusa 7, oczywiście) i będziesz mógł robić takie rzeczy jak:
Tego właśnie szukasz.
Oświadczenie: Pracuję dla firmy, która oferuje tę bezpłatną usługę. Dzięki.
źródło
Oto jedna linijka
źródło
Zależy od przypadku użycia. Wszystkie urządzenia mobilne wymagają baterii. Jeśli szukasz mocy obliczeniowej bez rozładowywania baterii, użyj interfejsu API stanu baterii :
Jeśli szukasz prezentacji
matchMedia
, która zwraca wartość logiczną:Lub połącz je, aby uzyskać jeszcze lepszą obsługę na tabletach.
źródło
Oto rozwiązanie ECMAScript 6 (kompatybilne z TypeScript)
źródło
if
warunek zamiast mieć tę całącheck
zmienną?Prostą sztuczką jest wykrycie, czy jest to urządzenie mobilne, czy nie. Wystarczy sprawdzić, czy istnieje zdarzenie ontouchstart :
źródło
Napotkałem kilka scenariuszy, w których powyższe odpowiedzi nie działają dla mnie. Więc wymyśliłem to. Może być komuś pomocny.
To zależy od twojego przypadku użycia. Jeśli skupiasz się na użyciu ekranu
screen.availWidth
lub możesz użyć,document.body.clientWidth
jeśli chcesz renderować na podstawie dokumentu.źródło
Najlepsze muszą być:
Ale tak jak mówi Yoav Barnea ...
Po tych 3 testach mam nadzieję, że var isMobile jest ... ok
źródło
Oto pełna funkcja
źródło
możesz również wykonać ten samouczek, aby wykryć określony telefon komórkowy. Kliknij tutaj .
źródło
Mobile
do swojego RXco z użyciem „window.screen.width”?
lub
To chyba najlepszy sposób, ponieważ każdego dnia pojawia się nowe urządzenie mobilne!
(chociaż myślę, że nie jest tak obsługiwane w starych przeglądarkach, ale spróbuj :))
źródło
Pamiętaj, że większość urządzeń mobilnych nowej generacji ma teraz rozdzielczości większe niż 600 x 400. tj. iPhone 6 ....
Dowód testu: uruchomiłem tutaj najbardziej uprzywilejowane i najnowsze posty, z opcjonalnym sprawdzeniem po uruchomieniu tak:
Jakoś następujące wyniki zostały zwrócone w następujących aplikacjach przeglądarki. Specyfikacja: iPhone 6S, iOS 10.3.1.
Safari (najnowszy): wykryto jako urządzenie mobilne.
Chrome (najnowszy): nie wykryłem go jako telefonu komórkowego.
SO, następnie przetestowałem sugestię od Lanti ( https://stackoverflow.com/a/31864119/7183483 ) i zwróciło prawidłowe wyniki (mobilne dla wszystkich urządzeń iOS i stacjonarne dla mojego Maca). Dlatego zacząłem go trochę edytować, ponieważ uruchomi się dwukrotnie (zarówno na telefonie komórkowym, jak i tablecie). Zauważyłem wtedy podczas testowania na iPadzie, że zwrócił również jako telefon komórkowy, co ma sens, ponieważ parametry, które Lantiużywa sprawdzić system operacyjny bardziej niż cokolwiek innego. Dlatego po prostu przeniosłem instrukcję IF tabletu do czeku mobilnego, który zwróciłby komórkę, jeśli wynik testu tabletu był ujemny, a tablet inaczej. Następnie dodałem klauzulę else, aby czek mobilny powrócił jako komputer stacjonarny / laptop, ponieważ oba kwalifikują się, ale zauważyłem, że przeglądarka wykrywa markę procesora i systemu operacyjnego. Więc zamiast tego dodałem to, co jest tam zwracane w ramach instrukcji else if. Podsumowując, dodałem ostrzeżenie, na wypadek gdyby nic nie zostało wykryte. Zobacz poniżej, wkrótce zaktualizuje się z testem na komputerze z systemem Windows 10.
Aha, a także dodałem zmienną „debugMode”, aby łatwo przełączać się między debugowaniem a normalną kompilacją.
Zastrzeżenie: pełne uznanie dla Lanti , a także to, że nie zostało to przetestowane na tabletach z systemem Windows ... które mogą zwrócić komputer stacjonarny / laptop, ponieważ system operacyjny to czysty Windows. Sprawdzę, gdy znajdę przyjaciela, który go używa.
źródło
To tylko port es6 zaakceptowanej odpowiedzi , której używam w swoim projekcie. Pamiętaj, że dotyczy to również tabletów.
źródło
Co powiesz na to, rozszerza się przy odpowiedzi powyżej, ale sprawdza również rozmiar ekranu
źródło
Za pomocą Regex (z wykryciamobilebrowsers.com ):
źródło
To może być również rozwiązanie.
Jeśli użyjesz obu metod, uzyskasz doskonały sposób na wykrycie różnych urządzeń.
źródło