Jak prawidłowo wykryć zmianę orientacji za pomocą Phonegap na iOS?

Znalazłem ten kod testu orientacji poniżej szukając materiału referencyjnego JQTouch. Działa to poprawnie w symulatorze iOS na mobilnym Safari, ale nie jest obsługiwane poprawnie w Phonegap. Mój projekt natrafia na 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;
  }
}
Author: Xufox, 2011-03-12

10 answers

Oto co robiÄ™:

function doOnOrientationChange() {
    switch(window.orientation) {  
      case -90 || 90:
        alert('landscape');
        break; 
      default:
        alert('portrait');
        break; 
    }
}
  
window.addEventListener('orientationchange', doOnOrientationChange);
  
// Initial execution if needed
doOnOrientationChange();
 266
Author: Benny Neugebauer,
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
2017-04-16 20:02:55

Używam window.onresize = function(){ checkOrientation(); } A w checkOrientation możesz użyć window.sprawdzanie orientacji lub szerokości ciała ale chodzi o to, " okno.onresize " to metoda najbardziej cross browser, przynajmniej z większością przeglądarek mobilnych i desktopowych, które miałem okazję przetestować.

 20
Author: Raine,
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-15 23:01:40

Jestem całkiem nowy w iOS i Phonegap, ale udało mi się to zrobić, dodając w eventListener. Zrobiłem to samo (używając przykładu, do którego się odwołujesz) i nie mogłem go uruchomić. Ale to chyba zadziałało:

// Event listener to determine change (horizontal/portrait)
window.addEventListener("orientationchange", updateOrientation); 

function updateOrientation(e) {
switch (e.orientation)
{   
    case 0:
        // Do your thing
        break;

    case -90:
        // Do your thing
        break;

    case 90:
        // Do your thing
        break;

    default:
        break;
    }
}
Możesz mieć trochę szczęścia w wyszukiwaniu PhoneGap Google Group pod kątem terminu "orientacja".

Jednym z przykładów, o którym czytałem jako przykład jak wykryć orientację, był Pie Guy: ( Gra, plik js ). Jest podobny do kodu napisałeś, ale jak ty... Nie mogłem go uruchomić.

Jedno zastrzeżenie: eventListener pracował dla mnie, ale nie jestem pewien, czy jest to zbyt intensywne podejście. Do tej pory to był jedyny sposób, który działa dla mnie, ale nie wiem, czy są lepsze, bardziej usprawnione sposoby.


UPDATE Naprawiono powyższy kod, działa teraz

 10
Author: avoision,
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-03-28 17:42:11
if (window.matchMedia("(orientation: portrait)").matches) {
   // you're in PORTRAIT mode
}

if (window.matchMedia("(orientation: landscape)").matches) {
  // you're in LANDSCAPE mode
}
 10
Author: Alyssa Reyes,
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-08-07 06:16:37

Podczas pracy ze zdarzeniem orientationchange potrzebowałem limitu czasu, aby uzyskać poprawne wymiary elementów na stronie, ale matchMedia działało dobrze. Mój ostatni kod:

var matchMedia = window.msMatchMedia || window.MozMatchMedia || window.WebkitMatchMedia || window.matchMedia;

if (typeof(matchMedia) !== 'undefined') {
  // use matchMedia function to detect orientationchange
  window.matchMedia('(orientation: portrait)').addListener(function() {
    // your code ...
  });
} else {
  // use orientationchange event with timeout (fires to early)
  $(window).on('orientationchange', function() {
    window.setTimeout(function() {
      // your code ...
    }, 300)
  });
}
 4
Author: oncode,
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-08-15 07:28:31

Oto co zrobiłem:

window.addEventListener('orientationchange', doOnOrientationChange);

function doOnOrientationChange()
{
      if (screen.height > screen.width) {
         console.log('portrait');
      } else {
         console.log('landscape');
      }
}
 2
Author: Raul Gomez,
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-11-12 18:41:19

Uważam, że poprawna odpowiedź została już opublikowana i zaakceptowana, ale jest kwestia, której doświadczyłem sam i o której niektórzy inni tutaj wspominali.

Na niektórych platformach różne właściwości, takie jak wymiary okien(window.innerWidth, window.innerHeight) Właściwość window.orientation nie zostanie zaktualizowana do czasu wywołania zdarzenia "orientationchange". Wiele razy Właściwość window.orientation wynosi undefined przez kilka milisekund po uruchomieniu "orientationchange" (przynajmniej jest w Chrome na iOS).

The najlepszy sposób na rozwiązanie tego problemu to:

var handleOrientationChange = (function() {
    var struct = function(){
        struct.parse();
    };
    struct.showPortraitView = function(){
        alert("Portrait Orientation: " + window.orientation);
    };
    struct.showLandscapeView = function(){
        alert("Landscape Orientation: " + window.orientation);
    };
    struct.parse = function(){
        switch(window.orientation){
            case 0:
                    //Portrait Orientation
                    this.showPortraitView();
                break;
            default:
                    //Landscape Orientation
                    if(!parseInt(window.orientation) 
                    || window.orientation === this.lastOrientation)
                        setTimeout(this, 10);
                    else
                    {
                        this.lastOrientation = window.orientation;
                        this.showLandscapeView();
                    }
                break;
        }
    };
    struct.lastOrientation = window.orientation;
    return struct;
})();
window.addEventListener("orientationchange", handleOrientationChange, false);

Sprawdzam, czy orientacja jest niezdefiniowana lub czy orientacja jest równa ostatniej wykrytej orientacji. Jeśli jedno z nich jest prawdziwe, czekam dziesięć milisekund, a następnie analizuję orientację ponownie. Jeśli orientacja jest wartością właściwą, wywołuję funkcje showXOrientation. Jeśli orientacja jest nieprawidłowa, kontynuuję pętlę funkcji sprawdzania, czekając dziesięć milisekund za każdym razem, aż będzie ona ważna.

Teraz zrobiłbym JSFiddle do tego, jak zwykle, ale JSFiddle nie działa dla mnie i mój błąd wsparcia dla niego został zamknięty, ponieważ nikt inny nie zgłasza tego samego problemu. Jeśli ktoś jeszcze chce zmienić to w JSFiddle, proszę bardzo.

Dzięki! Mam nadzieję, że to pomoże!
 2
Author: WebWanderer,
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
2016-03-18 15:01:34

Znalazłem ten kod, aby wykryć, czy urządzenie jest w orientacji poziomej i w tym przypadku dodać stronę powitalną z napisem "Zmień orientację, aby zobaczyć stronę". Działa na telefonach z systemem iOS, android i windows. Myślę, że jest to bardzo przydatne, ponieważ jest dość eleganckie i unikaj ustawiania widoku krajobrazu dla strony mobilnej. Kod działa bardzo dobrze. Jedyną rzeczą nie do końca satysfakcjonującą jest to, że jeśli ktoś załaduje stronę znajdującą się w widoku poziomym, strona powitalna nie pojawia się.

<script>
(function() {
    'use strict';

    var isMobile = {
        Android: function() {
            return navigator.userAgent.match(/Android/i);
        },
        BlackBerry: function() {
            return navigator.userAgent.match(/BlackBerry/i);
        },
        iOS: function() {
            return navigator.userAgent.match(/iPhone|iPad|iPod/i);
        },
        Opera: function() {
            return navigator.userAgent.match(/Opera Mini/i);
        },
        Windows: function() {
            return navigator.userAgent.match(/IEMobile/i);
        },
        any: function() {
            return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows());
        }
    };
    if (isMobile.any()) {
        doOnOrientationChange();
        window.addEventListener('resize', doOnOrientationChange, 'false');
    }

    function doOnOrientationChange() {
        var a = document.getElementById('alert');
        var b = document.body;
        var w = b.offsetWidth;
        var h = b.offsetHeight;
        (w / h > 1) ? (a.className = 'show', b.className = 'full-body') : (a.className = 'hide', b.className = '');
    }
})();
</script>

Oraz 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>

 1
Author: Luigi,
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-06-21 15:17:14

Zadziałało dla mnie:

function changeOrientation(){
switch(window.orientation) {
case 0: // portrait, home bottom
case 180: // portrait, home top
 alert("portrait H: "+$(window).height()+" W: "+$(window).width());       
 break;
          case -90: // landscape, home left
          case 90: // landscape, home right
        alert("landscape H: "+$(window).height()+" W: "+$(window).width());
            break;
        }
    }

 window.onorientationchange = function() { 
            //Need at least 800 milliseconds
            setTimeout(changeOrientation, 1000);
        }

Potrzebowałem limitu czasu, ponieważ wartość window.orientation nie aktualizuje się od razu

 -1
Author: catalyst294,
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-06-12 21:15:22

Tworzę aplikację jQTouch w PhoneGap dla iPhone ' a. Walczę z tym problemem od kilku dni. Widziałem rozwiązanie eventlistener zasugerował kilka razy, ale po prostu nie mógł go do pracy.

W końcu wymyśliłem inne rozwiązanie. Zasadniczo sprawdza okresowo szerokość ciała za pomocą settimeout. Jeśli szerokość wynosi 320 to orientacja jest pionowa, jeśli 480 to pozioma. Następnie, jeśli orientacja zmieniła się od ostatniego sprawdzenia, odpali albo a funkcja portrait stuff lub funkcja landscape stuff, w której możesz robić swoje rzeczy dla każdej orientacji.

Code (Uwaga, wiem, że jest jakieś powtórzenie w kodzie, po prostu nie zadałem sobie jeszcze trudu, aby go przyciąć!):

// get original orientation based on body width
deviceWidth = $('body').width();
if (deviceWidth == 320) {
    currentOrientation = "portrait";
}
else if (deviceWidth == 480) {
    currentOrientation = "landscape";
}

// fire a function that checks the orientation every x milliseconds
setInterval(checkOrientation, 500);

// check orientation
function checkOrientation() {
    deviceWidth = $('body').width();
    if (deviceWidth == '320') {
        newOrientation = "portrait";
    }
    else if (deviceWidth == '480') {
        newOrientation = "landscape";
    }
    // if orientation changed since last check, fire either the portrait or landscape function
    if (newOrientation != currentOrientation) {
        if (newOrientation == "portrait") {
            changedToPortrait();
        }
        else if (newOrientation == "landscape") {
            changedToLandscape();
        }
        currentOrientation = newOrientation;
    }
}

// landscape stuff
function changedToLandscape() {
    alert('Orientation has changed to Landscape!');
}

// portrait stuff
function changedToPortrait() {
    alert('Orientation has changed to Portrait!');
}
 -2
Author: Danny Connell,
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-06-16 13:49:39