Разрешение экрана Android в веб-приложении не постоянно - PullRequest
0 голосов
/ 21 сентября 2011

Это странно. Я использую JavaScript для определения разрешения на веб-странице. Для этого у меня есть следующая функция (несколько упрощенная для этой цели):

function check() {
    var win = document.defaultView || document.parentWindow,
        ratio = win.devicePixelRatio ? win.devicePixelRatio : 1,
        h = win.innerHeight,
        w = win.innerWidth,
        root = document.documentElement;

    if (!h) {
        h = root.clientHeight;
        w = root.clientWidth;
    }
    alert("height/width/ratio; " + h + "/" + w + "/" + ratio);

}

на устройствах Android, похоже, действительно своеобразное поведение:

Я приведу Nexus S в качестве примера, но, очевидно, я проверял это на многих других устройствах Android с разными версиями.

Если вы попали на страницу, содержащую скрипт выше, нажав на ссылку в приложении электронной почты (gmail или outlook), предупреждение выдаст 1130/800 / 1.5 (высота и ширина слишком велики). Это соответствует. Теперь, если вы зайдете в адресную строку и отредактируете URL (добавите / удалите параметр или значение параметра) и нажмете «Go», точно такой же код даст 452/320 / 1,5 (это больше похоже на это, и это также соответствует ).

Как и почему это происходит?

РЕДАКТИРОВАТЬ: стоит отметить, что до сих пор это, кажется, относится только к устройствам с devicePatielRatio> 1, то есть не более старые телефоны Android на v 1.5 / 1.6

1 Ответ

0 голосов
/ 22 сентября 2011

После долгих поисков и отладок это почти похоже на ошибку.

Воспроизведение очень простое: если вышеуказанный скрипт выполняется синхронно в событии onload, и вы щелкаете по чему-то, что открывает новое окно, приложение электронной почты или веб-страницу с target = _blank, шириной и высотой экрана и окнасвойства будут неправильными.Не имеет значения, если вы используете jQuery, YUI или обычный javascript.

Решение / обходной путь заключается в том, чтобы обернуть метод, вызываемый в onload, в setTimeout () с тайм-аутом, установленным в 0. Это будет запускать метод асинхронно и даватьправильный результат.

<body onload="setTimeout(check, 0);">

Это, друзья мои, закрывает это дело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...