Обнаружение вращения Android-телефона в браузере с помощью JavaScript

Я знаю, что в Safari на iPhone вы можете определить ориентацию экрана и изменить ориентацию, прослушивая событие onorientationchange и запрашивая window.orientation для угла.

Возможно ли это в браузере на телефонах Android?

Чтобы быть ясным, я спрашиваю, может ли ротация Android-устройства быть обнаружена с помощью JavaScript, запущенного на стандартной веб-странице. Это возможно на iPhone, и я задавался вопросом, можно ли это сделать для телефонов Android.

Ответ 1

Чтобы обнаружить изменение ориентации в браузере Android, присоедините прослушиватель к событию orientationchange или resize на window:

// Detect whether device supports orientationchange event, otherwise fall back to
// the resize event.
var supportsOrientationChange = "onorientationchange" in window,
    orientationEvent = supportsOrientationChange ? "orientationchange" : "resize";

window.addEventListener(orientationEvent, function() {
    alert('HOLY ROTATING SCREENS BATMAN:' + window.orientation + " " + screen.width);
}, false);

Проверьте свойство window.orientation, чтобы выяснить, каким образом устройство ориентировано. С телефонами Android screen.width или screen.height также обновляется по мере поворота устройства. (это не относится к iPhone).

Ответ 2

Фактическое поведение для разных устройств несовместимо. События изменения размера и ориентации могут меняться в различной последовательности с различной частотой. Кроме того, некоторые значения (например, screen.width и window.orientation) не всегда меняются, когда вы ожидаете. Избегайте screen.width - он не изменяется при вращении в iOS.

Надежный подход заключается в прослушивании как изменений размера, так и ориентации. Изменить события (с некоторым опросом в качестве защитного ключа), и в конечном итоге вы получите действительное значение для ориентации. В моем тестировании устройства Android иногда не запускают события при повороте на 180 градусов, поэтому я также включил setInterval для опроса ориентации.

var previousOrientation = window.orientation;
var checkOrientation = function(){
    if(window.orientation !== previousOrientation){
        previousOrientation = window.orientation;
        // orientation changed, do your magic here
    }
};

window.addEventListener("resize", checkOrientation, false);
window.addEventListener("orientationchange", checkOrientation, false);

// (optional) Android doesn't always fire orientationChange on 180 degree turns
setInterval(checkOrientation, 2000);

Ниже приведены результаты четырех тестируемых устройств (извините за таблицу ASCII, но это был самый простой способ представить результаты). Помимо согласованности между устройствами iOS, существует множество разновидностей устройств. ПРИМЕЧАНИЕ. События перечислены в том порядке, в котором они были запущены.

|==============================================================================|
|     Device     | Events Fired      | orientation | innerWidth | screen.width |
|==============================================================================|
| iPad 2         | resize            | 0           | 1024       | 768          |
| (to landscape) | orientationchange | 90          | 1024       | 768          |
|----------------+-------------------+-------------+------------+--------------|
| iPad 2         | resize            | 90          | 768        | 768          |
| (to portrait)  | orientationchange | 0           | 768        | 768          |
|----------------+-------------------+-------------+------------+--------------|
| iPhone 4       | resize            | 0           | 480        | 320          |
| (to landscape) | orientationchange | 90          | 480        | 320          |
|----------------+-------------------+-------------+------------+--------------|
| iPhone 4       | resize            | 90          | 320        | 320          |
| (to portrait)  | orientationchange | 0           | 320        | 320          |
|----------------+-------------------+-------------+------------+--------------|
| Droid phone    | orientationchange | 90          | 320        | 320          |
| (to landscape) | resize            | 90          | 569        | 569          |
|----------------+-------------------+-------------+------------+--------------|
| Droid phone    | orientationchange | 0           | 569        | 569          |
| (to portrait)  | resize            | 0           | 320        | 320          |
|----------------+-------------------+-------------+------------+--------------|
| Samsung Galaxy | orientationchange | 0           | 400        | 400          |
| Tablet         | orientationchange | 90          | 400        | 400          |
| (to landscape) | orientationchange | 90          | 400        | 400          |
|                | resize            | 90          | 683        | 683          |
|                | orientationchange | 90          | 683        | 683          |
|----------------+-------------------+-------------+------------+--------------|
| Samsung Galaxy | orientationchange | 90          | 683        | 683          |
| Tablet         | orientationchange | 0           | 683        | 683          |
| (to portrait)  | orientationchange | 0           | 683        | 683          |
|                | resize            | 0           | 400        | 400          |
|                | orientationchange | 0           | 400        | 400          |
|----------------+-------------------+-------------+------------+--------------|

Ответ 3

Отличный ответ с двумя бит-дурами обеспечивает весь фон, но позвольте мне попробовать краткое, прагматичное резюме того, как обрабатывать изменения ориентации в iOS и Android:

  • Если вы только заботитесь о размерах окна (типичный сценарий), а не о конкретной ориентации:
    • Обрабатывать только событие resize.
    • В вашем обработчике действуйте только на window.innerWidth и window.InnerHeight.
    • НЕ использовать window.orientation - это не будет актуально для iOS.
  • Если вы заботитесь о конкретной ориентации:
    • Обрабатывать только событие resize на Android и только событие orientationchange на iOS.
    • В вашем обработчике действуйте на window.orientationwindow.innerWidth и window.InnerHeight)

Эти подходы дают небольшие преимущества перед тем, как запомнить предыдущую ориентацию и сравнить:

  • подход, основанный на измерениях, также работает при разработке на настольных браузерах, которые могут имитировать мобильные устройства, например, Chrome 23. (window.orientation недоступно в настольных браузерах).
  • не требуется переменная уровня global/anonymous-file-level-function-wrapper.

Ответ 4

Вы всегда можете прослушивать событие изменения размера окна. Если на этом событии окно перешло от более высокого к широкому, чем оно высокое (или наоборот), вы можете быть уверены, что ориентация телефона была просто изменена.

Ответ 5

Это возможно в HTML5.
Вы можете прочитать больше (и попробовать демо-версию) здесь: http://slides.html5rocks.com/#slide-orientation.

window.addEventListener('deviceorientation', function(event) {
    var a = event.alpha;
    var b = event.beta;
    var g = event.gamma;
}, false);

Он также поддерживает браузерные браузеры, но он всегда будет возвращать одинаковое значение.

Ответ 6

У меня была та же проблема. Я использую Phonegap и JQuery mobile для устройств Adroid. Чтобы правильно изменить размер, мне пришлось установить тайм-аут:

$(window).bind('orientationchange',function(e) {
  fixOrientation();
});

$(window).bind('resize',function(e) {
  fixOrientation();
});

function fixOrientation() {

    setTimeout(function() {

        var windowWidth = window.innerWidth;

        $('div[data-role="page"]').width(windowWidth);
        $('div[data-role="header"]').width(windowWidth);
        $('div[data-role="content"]').width(windowWidth-30);
        $('div[data-role="footer"]').width(windowWidth);

    },500);
}

Ответ 7

Вот решение:

var isMobile = {
    Android: function() {
        return /Android/i.test(navigator.userAgent);
    },
    iOS: function() {
        return /iPhone|iPad|iPod/i.test(navigator.userAgent);
    }
};
if(isMobile.Android())
    {
        var previousWidth=$(window).width();
        $(window).on({
        resize: function(e) {
        var YourFunction=(function(){

            var screenWidth=$(window).width();
            if(previousWidth!=screenWidth)
            {
                previousWidth=screenWidth;
                alert("oreientation changed");
            }

        })();

        }
    });

    }
    else//mainly for ios
    {
        $(window).on({
            orientationchange: function(e) {
               alert("orientation changed");
            }   
        });
    }

Ответ 8

Стоит отметить, что на моем Epic 4G Touch мне пришлось настроить веб-просмотр, чтобы использовать WebChromeClient, прежде чем работал какой-либо из javascript-вызовов Android.

webView.setWebChromeClient(new WebChromeClient());

Ответ 9

Еще одна полезная информация - некоторые Android-планшеты (Motorola Xoom, я считаю, и low-end Elonex, которые я тестирую, возможно, другие), установлены их акселерометры, так что window.orientation == 0 в режиме LANDSCAPE, а не портрет!

Ответ 10

Способ перекрестного браузера

$(window).on('resize orientationchange webkitfullscreenchange mozfullscreenchange fullscreenchange',  function(){
//code here
});

Ответ 11

вы можете попробовать решение, совместимое со всеми браузерами.

Ниже приведено orientationchange совместимость pic: Совместимость поэтому я автор orientaionchange polyfill, он основан на атрибуте @media для исправления библиотеки утилиты orientchange-- orientationchange-fix

window.addEventListener('orientationchange', function(){
 if(window.neworientation.current === 'portrait|landscape'){
    // do something……
 } else {
    // do something……
 }
}, false);

Ответ 12

Небольшой вклад в ответ двухбитового дурака:

Как описано в таблице на телефонах с дроидами, событие "changechange" запускается раньше, чем событие "изменить размер", таким образом блокируя следующий вызов изменения размера (из-за оператора if). Свойство Width еще не установлено.

Обходной путь, возможно, не идеальный, может заключаться в том, чтобы не запускать событие "changechange". Это можно заархивировать путем обвязки привязки привязки "orientationchange" в выражении "if":

if (!navigator.userAgent.match(/android/i))
{
    window.addEventListener("orientationchange", checkOrientation, false);
}

Надеюсь, что это поможет

(тесты проводились на Nexus S)