Подтвердить что ты не робот

Как правильно определить изменение ориентации с помощью Phonegap на iOS?

Я нашел этот код теста ориентации ниже в поисках справочного материала JQTouch. Это работает правильно в симуляторе iOS на мобильном Safari, но неправильно обрабатывается в Phonegap. Мой проект сталкивается с той же проблемой, которая убивает эту тестовую страницу. Есть ли способ почувствовать изменение ориентации с помощью JavaScript в 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 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 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 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;
  }
}
4b9b3361

Ответ 1

Это то, что я делаю:

function doOnOrientationChange() {
    switch(window.orientation) {  
      case -90: case 90:
        alert('landscape');
        break; 
      default:
        alert('portrait');
        break; 
    }
}
  
window.addEventListener('orientationchange', doOnOrientationChange);
  
// Initial execution if needed
doOnOrientationChange();

Ответ 2

Я использую window.onresize = function(){ checkOrientation(); } И в checkOrientation вы можете использовать window.orientation или проверку ширины тела но идея в том, что "window.onresize" - это самый перекрестный браузерный метод, по крайней мере, с большинством мобильных и настольных браузеров, с которыми у меня была возможность протестировать.

Ответ 3

Я тоже очень новичок в iOS и Phonegap, но я смог сделать это, добавив в eventListener. Я сделал то же самое (используя пример, который вы ссылаетесь), и не мог заставить его работать. Но это, казалось, делало трюк:

// 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;
    }
}

Возможно, вам удастся найти в Google PhoneGap Google Group для термина "ориентация" .

В одном примере, который я читал как пример того, как определить ориентацию, был Pie Guy: (game, js file). Это похоже на код, который вы опубликовали, но как вы... Я не мог заставить его работать.

Одно предостережение: eventListener работал у меня, но я не уверен, что это чрезмерно интенсивный подход. Пока это был единственный способ, который работал у меня, но я не знаю, есть ли лучшие, более упорядоченные способы.


UPDATE исправил код выше, теперь он работает

Ответ 4

if (window.matchMedia("(orientation: portrait)").matches) {
   // you're in PORTRAIT mode
}

if (window.matchMedia("(orientation: landscape)").matches) {
  // you're in LANDSCAPE mode
}

Ответ 5

Во время работы с событием orientationchange мне понадобился тайм-аут, чтобы получить правильные размеры элементов на странице, но matchMedia работал нормально. Мой последний код:

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)
  });
}

Ответ 6

Я считаю, что правильный ответ уже был опубликован и принят, но есть проблема, которую я испытал сам и что некоторые другие упомянули здесь.

На некоторых платформах различные свойства, такие как размеры окна (window.innerWidth, window.innerHeight) и свойство window.orientation, не будут обновляться к моменту начала события "orientationchange". Много раз свойство window.orientation равно undefined в течение нескольких миллисекунд после запуска "orientationchange" (по крайней мере, это в Chrome на iOS).

Лучший способ, который я нашел для решения этой проблемы, заключался в следующем:

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);

Я проверяю, является ли ориентация либо undefined, или если ориентация равна последней обнаруженной ориентации. Если значение true, я жду десять миллисекунд, а затем снова проанализирую ориентацию. Если ориентация является правильным значением, я вызываю функции showXOrientation. Если ориентация недействительна, я продолжаю цикл моей функции проверки, ожидая десять миллисекунд каждый раз, пока она не будет действительной.

Теперь я сделал бы JSFiddle для этого, как я обычно делал, но JSFiddle не работал у меня, и моя ошибка поддержки была закрыта, поскольку никто другой не сообщал об одной и той же проблеме. Если кто-то еще хочет превратить это в JSFiddle, пожалуйста, продолжайте.

Спасибо! Надеюсь, это поможет!

Ответ 7

вот что я сделал:

window.addEventListener('orientationchange', doOnOrientationChange);

function doOnOrientationChange()
{
      if (screen.height > screen.width) {
         console.log('portrait');
      } else {
         console.log('landscape');
      }
}

Ответ 8

Я нашел этот код, чтобы определить, находится ли устройство в альбомной ориентации, и в этом случае добавьте всплывающую страницу с надписью "изменить ориентацию, чтобы увидеть сайт". Он работает на iOS, Android и Windows-телефонах. Я считаю, что это очень полезно, так как оно довольно изящно и не позволяет установить пейзаж для мобильного сайта. Код работает очень хорошо. Единственное, что не полностью удовлетворяет, заключается в том, что если кто-то загружает страницу, находящуюся в ландшафтном представлении, страница всплеска не появляется.

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

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

Ответ 9

if (window.DeviceOrientationEvent) {
    // Listen for orientation changes
    window.addEventListener("orientationchange", orientationChangeHandler);
    function orientationChangeHandler(evt) {
        // Announce the new orientation number
        // alert(screen.orientation);
        // Find matches
        var mql = window.matchMedia("(orientation: portrait)");

        if (mql.matches)  //true
    }
}

Ответ 10

Следующие работали для меня:

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);
        }

Мне нужен таймаут, потому что значение window.orientation не обновляется сразу.

Ответ 11

Я создаю приложение jQTouch в PhoneGap для iPhone. Я боролся с этой проблемой в течение нескольких дней. Я видел решение eventlistener несколько раз, но просто не мог заставить его работать.

В конце концов я придумал другое решение. Он в основном проверяет ширину тела периодически, используя setimeout. Если ширина равна 320, тогда ориентация - портретная, если 480 - пейзаж. Затем, если ориентация изменилась со времени последней проверки, она сгенерирует функцию портретного материала или функцию ландшафтного материала, где вы можете сделать свою вещь для каждой ориентации.

Код (заметьте, я знаю, что в коде есть повторение, просто не надо было его обрезать!):

// 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!');
}