Wiem, że w Safari na iPhonie możesz wykryć orientację ekranu i zmianę orientacji, nasłuchując onorientationchange
zdarzenia i sprawdzając window.orientation
kąt.
Czy jest to możliwe w przeglądarce na telefonach z Androidem?
Dla jasności pytam, czy obrót urządzenia z Androidem można wykryć przez JavaScript działający na standardowej stronie internetowej. Jest to możliwe na iPhonie i zastanawiałem się, czy można to zrobić na telefonach z Androidem.
źródło
Rzeczywiste zachowanie na różnych urządzeniach jest niespójne . Zdarzenia zmiany rozmiaru i orientacji mogą być uruchamiane w innej sekwencji z różną częstotliwością. Ponadto niektóre wartości (np. Screen.width i window.orientation) nie zawsze zmieniają się zgodnie z oczekiwaniami. Unikaj screen.width - nie zmienia się podczas obracania w iOS.
Wiarygodne podejście polega na nasłuchiwaniu zarówno zdarzeń zmiany rozmiaru, jak i orientacji Zmień (z pewnymi ankietami jako zaczepem bezpieczeństwa), a ostatecznie uzyskasz prawidłową wartość orientacji. Podczas moich testów urządzenia z Androidem czasami nie uruchamiają zdarzeń podczas obracania o pełne 180 stopni, więc dołączyłem również setInterval do odpytywania orientacji.
Oto wyniki z czterech urządzeń, które przetestowałem (przepraszam za tabelę ASCII, ale wydawało się, że to najłatwiejszy sposób na przedstawienie wyników). Oprócz spójności między urządzeniami z iOS istnieje wiele różnych urządzeń. UWAGA: Zdarzenia są wymienione w kolejności ich uruchomienia.
źródło
previousOrientation
należy zainicjować z obecną orientacją:var previousOrientation = window.orientation;
jeśli chcesz zignorować obrót o 180 stopni, tzn. nie musisz rozróżniać między krajobrazem z lewej lub prawej strony a wariantami odwróconymi do góry nogami, dodaj następujące jako pierwsza linia docheckOrientation()
:if (0 === (previousOrientation + window.orientation) % 180) return;
Jednak bez dodatkowychsetTimeout
sztuczek skorzystasz z tego tylko na iOS, gdzie szybki obrót o 180 stopni tworzy tylko jednoorientationchange
wydarzenie.doskonała odpowiedź two-bit-głupca zapewnia całe tło, ale pozwól mi spróbować zwięzłego, pragmatycznego podsumowania, jak radzić sobie ze zmianami orientacji w iOS i Androidzie :
resize
tylko wydarzenie.window.innerWidth
iwindow.InnerHeight
wyłącznie.window.orientation
- nie będzie aktualne na iOS.resize
imprezę, na Androida i tylko naorientationchange
zdarzenie na iOS.window.orientation
(window.innerWidth
iwindow.InnerHeight
)Podejścia te oferują niewielkie korzyści w porównaniu z zapamiętywaniem poprzedniej orientacji i porównywaniem:
window.orientation
nie jest dostępny w przeglądarkach komputerowych).źródło
Zawsze możesz odsłuchać zdarzenie zmiany rozmiaru okna. Jeśli w takim przypadku okno zmieniło się z wyższego niż szerokie na szersze niż wysokie (lub odwrotnie), możesz być całkiem pewien, że orientacja telefonu została właśnie zmieniona.
źródło
Jest to możliwe w HTML5.
Możesz przeczytać więcej (i wypróbować demo na żywo) tutaj: http://slides.html5rocks.com/#slide-orientation .
Obsługuje również przeglądarki deskop, ale zawsze zwraca tę samą wartość.
źródło
Miałem ten sam problem. Korzystam z telefonów komórkowych Phonegap i Jquery dla urządzeń z systemem Adroid. Aby właściwie zmienić rozmiar, musiałem ustawić limit czasu:
źródło
Oto rozwiązanie:
źródło
Kolejna gotcha - niektóre tablety z Androidem (uważam, że Motorola Xoom i niższy Elonex, na którym przeprowadzam testy, prawdopodobnie też i inne) mają skonfigurowane akcelerometry, aby okno.orientacja == 0 w trybie KRAJOBRAZ, a nie portret !
źródło
możesz wypróbować rozwiązanie kompatybilne ze wszystkimi przeglądarkami.
Poniżej znajduje się
orientationchange
pic kompatybilności: dlatego, jaorientaionchange
piszę polifill, jest on oparty na atrybucie @media do naprawy biblioteki narzędziowej orientacji --—orientchange -fixźródło
Warto zauważyć, że na moim urządzeniu Epic 4G Touch musiałem skonfigurować widok internetowy, aby korzystać z WebChromeClient, zanim zadzwoni javascript.
źródło
Sposób na przeglądarkę
źródło
Mały wkład w odpowiedź dwumitowego głupca:
Jak opisano w tabeli na telefonach z systemem Android, zdarzenie „orientacja” jest uruchamiane wcześniej niż zdarzenie „zmiana rozmiaru”, blokując w ten sposób następne wywołanie zmiany rozmiaru (z powodu instrukcji if). Właściwość Szerokość nadal nie jest ustawiona.
Obejściem, choć może nie idealnym, może być niewypuszczenie zdarzenia „zmiana orientacji”. Można to zarchiwizować, zawijając powiązanie zdarzenia „orientacja wymiany” w instrukcji „if”:
Mam nadzieję, że to pomoże
(testy przeprowadzono na Nexusie S)
źródło