Znalazłem ten kod testu orientacji poniżej, szukając materiału referencyjnego JQTouch. Działa to poprawnie w symulatorze iOS w mobilnym Safari, ale nie jest obsługiwane poprawnie w Phonegap. Mój projekt napotyka ten sam problem, który zabija tę stronę testową. Czy istnieje sposób na wyczucie zmiany orientacji za pomocą JavaScript w Phonegap?
window.onorientationchange = function() {
/*window.orientation returns a value that indicates whether iPhone is in portrait mode, landscape mode with the screen turned to the
left, or landscape mode with the screen turned to the right. */
var orientation = window.orientation;
switch (orientation) {
case 0:
/* If in portrait mode, sets the body's class attribute to portrait. Consequently, all style definitions matching the body[class="portrait"] declaration
in the iPhoneOrientation.css file will be selected and used to style "Handling iPhone or iPod touch Orientation Events". */
document.body.setAttribute("class", "portrait");
/* Add a descriptive message on "Handling iPhone or iPod touch Orientation Events" */
document.getElementById("currentOrientation").innerHTML = "Now in portrait orientation (Home button on the bottom).";
break;
case 90:
/* If in landscape mode with the screen turned to the left, sets the body's class attribute to landscapeLeft. In this case, all style definitions matching the
body[class="landscapeLeft"] declaration in the iPhoneOrientation.css file will be selected and used to style "Handling iPhone or iPod touch Orientation Events". */
document.body.setAttribute("class", "landscape");
document.getElementById("currentOrientation").innerHTML = "Now in landscape orientation and turned to the left (Home button to the right).";
break;
case -90:
/* If in landscape mode with the screen turned to the right, sets the body's class attribute to landscapeRight. Here, all style definitions matching the
body[class="landscapeRight"] declaration in the iPhoneOrientation.css file will be selected and used to style "Handling iPhone or iPod touch Orientation Events". */
document.body.setAttribute("class", "landscape");
document.getElementById("currentOrientation").innerHTML = "Now in landscape orientation and turned to the right (Home button to the left).";
break;
}
}
Odpowiedzi:
Tym się właśnie zajmuję:
Aktualizacja z maja 2019 r .:
window.orientation
jest przestarzałą funkcją i według MDN nie jest obsługiwana przez większość przeglądarek .orientationchange
Zdarzenie jest związane z window.orientation i dlatego nie powinna być używana.źródło
window.onorientationchange = function() { setTimeout(functionName, 0); };
Używam
window.onresize = function(){ checkOrientation(); }
I w checkOrientation możesz zastosować sprawdzanie window.orientation lub szerokości ciała, ale pomysł jest taki, że "window.onresize" jest metodą najbardziej korzystającą z przeglądarek, przynajmniej w przypadku większości przeglądarek mobilnych i stacjonarnych, które miałem możliwość przetestowania.źródło
źródło
resize
wydarzenia. Jednak IIRC, te zapytania nie będą działać poprawnie przy podniesionej klawiaturze.Jestem całkiem nowy w iOS i Phonegap, ale udało mi się to zrobić, dodając eventListener. Zrobiłem to samo (używając przykładu, do którego się odnosisz) i nie mogłem go uruchomić. Ale to zdawało się działać:
Możesz mieć trochę szczęścia, wyszukując w grupie PhoneGap Google termin „orientacja” .
Jednym z przykładów, o którym czytałem jako przykład wykrywania orientacji, był Pie Guy: ( gra , plik js ). Jest podobny do kodu, który opublikowałeś, ale tak jak Ty ... Nie mogłem go uruchomić.
Jedno zastrzeżenie: eventListener zadziałał dla mnie, ale nie jestem pewien, czy jest to zbyt intensywne podejście. Jak dotąd był to jedyny sposób, który działał dla mnie, ale nie wiem, czy są lepsze, bardziej usprawnione sposoby.
UPDATE naprawił powyższy kod, teraz działa
źródło
Podczas pracy z
orientationchange
wydarzeniem potrzebowałem limitu czasu, aby uzyskać prawidłowe wymiary elementów na stronie, ale matchMedia działało dobrze. Mój ostateczny kod:źródło
Uważam, że poprawna odpowiedź została już opublikowana i zaakceptowana, ale jest problem, którego sam doświadczyłem i o którym wspominali tutaj inni.
Na niektórych platformach różne właściwości, takie jak wymiary okna (
window.innerWidth
,window.innerHeight
) iwindow.orientation
właściwość nie zostaną zaktualizowane do czasu uruchomienia zdarzenia"orientationchange"
. Wielokrotnie nieruchomośćwindow.orientation
utrzymuje sięundefined
przez kilka milisekund po wypaleniu"orientationchange"
(przynajmniej w Chrome na iOS).Najlepszym sposobem rozwiązania tego problemu było:
Sprawdzam, czy orientacja jest niezdefiniowana lub czy orientacja jest równa ostatniej wykrytej orientacji. Jeśli jedno jest prawdą, czekam dziesięć milisekund, a następnie ponownie analizuję orientację. Jeśli orientacja jest właściwą wartością, nazywam
showXOrientation
funkcje. Jeśli orientacja jest nieprawidłowa, kontynuuję pętlę funkcji sprawdzającej, za każdym razem czekając dziesięć milisekund, aż będzie ona prawidłowa.Teraz zrobiłbym do tego JSFiddle, jak zwykle, ale JSFiddle nie działa dla mnie, a mój błąd wsparcia został zamknięty, ponieważ nikt inny nie zgłasza tego samego problemu. Jeśli ktoś jeszcze chce zamienić to w JSFiddle, proszę bardzo.
Dzięki! Mam nadzieję, że to pomoże!
źródło
oto co zrobiłem:
źródło
Chociaż pytanie dotyczy tylko wykorzystania PhoneGap i iOS i chociaż już na nie odpowiedziano, do szerszej kwestii wykrywania orientacji ekranu za pomocą JS w 2019 roku mogę dodać kilka punktów:
window.orientation
Właściwość jest przestarzała i nie jest obsługiwana przez przeglądarki z systemem Android.Istnieje nowsza właściwość, która zawiera więcej informacji o orientacji -screen.orientation
. Ale nadal jest eksperymentalny i nie jest obsługiwany przez iOS Safari . Tak, aby osiągnąć najlepszy wynik prawdopodobnie trzeba użyć kombinacji dwóch:const angle = screen.orientation ? screen.orientation.angle : window.orientation
.Jak @benallansmith wspomniał w swoim komentarzu ,
window.onorientationchange
zdarzenie jest uruchamiane wcześniejwindow.onresize
, więc nie otrzymasz rzeczywistych wymiarów ekranu, chyba że dodasz opóźnienie po zdarzeniu zmiany orientacji.Istnieje wtyczka Cordova Screen Orientation do obsługi starszych przeglądarek mobilnych, ale uważam, że obecnie nie ma potrzeby jej używać.
Wystąpiło również
screen.onorientationchange
zdarzenie, ale jest ono przestarzałe i nie powinno być używane. Dodano tylko dla kompletności odpowiedzi.W moim przypadku nie przejmowałem się zbytnio rzeczywistą orientacją, ale raczej rzeczywistą szerokością i wysokością okna, która oczywiście zmienia się wraz z orientacją. Użyłem więc
resize
zdarzenia, aby uniknąć opóźnień międzyorientationchange
zdarzeniem a aktualizacją wymiarów okna:Uwaga 1: Użyłem tutaj składni EcmaScript 6, w razie potrzeby skompiluj ją do ES5.
Uwaga 2:
window.onresize
zdarzenie jest wyzwalane również przy przełączaniu klawiatury wirtualnej , a nie tylko przy zmianie orientacji.źródło
Znalazłem ten kod, aby wykryć, czy urządzenie jest w orientacji poziomej iw tym przypadku dodaj stronę powitalną z napisem „Zmień orientację, aby zobaczyć witrynę”. Działa na telefonach z systemem iOS, Android i Windows. Myślę, że jest to bardzo przydatne, ponieważ jest dość eleganckie i nie należy ustawiać widoku poziomego dla witryny mobilnej. Kod działa bardzo dobrze. Jedyną rzeczą nie do końca satysfakcjonującą jest to, że jeśli ktoś załaduje stronę w widoku poziomym, strona powitalna nie pojawi się.
A HTML:
<div id="alert" class="hide"> <div id="content">This site is not thought to be viewed in landscape mode, please turn your device </div> </div>
źródło
źródło
Pracowały dla mnie:
Potrzebowałem limitu czasu, ponieważ wartość
window.orientation
nie aktualizuje się od razuźródło
Tworzę aplikację jQTouch w PhoneGap na iPhone'a. Walczę z tym problemem od dni. Kilka razy widziałem sugerowane rozwiązanie Eventlistener, ale po prostu nie udało mi się go uruchomić.
W końcu wpadłem na inne rozwiązanie. Zasadniczo sprawdza okresowo szerokość korpusu za pomocą settimeout. Jeśli szerokość wynosi 320, orientacja jest pionowa, jeśli 480, to orientacja pozioma. Następnie, jeśli orientacja zmieniła się od ostatniego sprawdzenia, uruchomi się funkcja pionowa lub pozioma, w której możesz robić swoje dla każdej orientacji.
Kod (uwaga, wiem, że w kodzie jest pewne powtórzenie, tylko nie zadałem sobie trudu, aby go jeszcze przyciąć!):
źródło
onresize
zdarzenia, które uruchomi się natychmiast, a nie w 500 milisekundach 2) Ten kod jest specyficzny dla Androida,onorientationchange
zamiast tego użyj dla iPhone'a 3) Sprawdź, czy jest obsługiwany w przeglądarce:"onorientationchange" in window