Как определить модель iPad через JavaScript?

На «Хабре» наткнулся на любопытный код на JS, который определяет с каким Айпадом мы имеем дело — первым, вторым или третьим. Третий ото всех остальных отличить просто — у него в свойстве «devicePixelRatio» значение „2“ записано. А первый от второго как?

Оказывается способ есть — надо в событии «devicemotion» проверить есть ли у устройства акселерометр. Не знаю для чего это всё может пригодиться (разве что отключать какие-то ресурсоёмкие спецэффекты), но знать о том, что такая возможность проверки есть, не помешает.

Я немного переписал код, сделал из него функцию, чуть упростил и навёл порядок. Получился вот такой код:

// функция для определения модели Айпада
function detectIPadVersion(callback, undefined) {
    if ('ondevicemotion' in window) {
        window.addEventListener('devicemotion', function self(event) {
            if (~navigator.platform.indexOf('iPad')) {
                var version = event.acceleration ? (window.devicePixelRatio === 2) + 2 : 1;
            }
            window.removeEventListener('devicemotion', self);

            callback(version);
        }, false);
    } else {
        callback(undefined);
    }
};

// пример вызова, в callback будет передан номер модели (1,2 или 3) или undefined, в случае, если это не iPad
detectIPadVersion(alert);
Поделиться
Отправить
26 комментариев
Неуч

в version будет или 1 или 3, но не 2, правильно?

Неуч

Ах, прошу прощения, 2 тоже будет

Orcinus Orca (orcinus.ru)

Красивое решение. Его можно использовать в своих проектах?

Eyeless

Упростили и навели порядок, заменив проверку условия на сложение boolean с int? Ну-ну.

Неуч

Комментарий для Eyeless:

Упростили и навели порядок, заменив проверку условия на сложение boolean с int? Ну-ну.

Изящно же

Евгений Степанищев (bolknote.ru)

Комментарий для orcinus.ru:

Красивое решение. Его можно использовать в своих проектах?

Можно, конечно!

Евгений Степанищев (bolknote.ru)

Комментарий для Eyeless:

Упростили и навели порядок, заменив проверку условия на сложение boolean с int? Ну-ну.

А что вас смущает-то?

ku

(«всем») А ни у кого нет привычки переставлять очень короткие if/else части первыми?

Orcinus Orca (orcinus.ru)

Комментарий для Евгения Степанищева:

спасибо...

Евгений Степанищев (bolknote.ru)

Комментарий для ku:

А ни у кого нет привычки переставлять очень короткие if/else части первыми?

Это как?

maxim-zotov

Комментарий для Евгения Степанищева:

Это как?

Инвертировать условие, чтобы первым шел короткий блок,
 if (!(’ondevicemotion’ in window)) {
    callback(undefined);
 } else {
   //длинный блок
 }

Смысл в том, что когда сначала идет простое действие, проще уследить за логикой алгоритма, вся конструкция «if then else» легко обозрима, находится на двух-трех строках, быстренько разделался с формальным ответвлением и занимаешься реальным делом. Когда сначала идет длинный блок, то когда настанет else, уже успеешь потерять нить, к чему именно был этот else. Это расположение физически рядом тех блоков, которые рядом логически. Цена — ухудшение читаемости условия if, лишнее отрицание не украшает программу.

Евгений Степанищев (bolknote.ru)

Комментарий для maxim-zotov:

А, не я так не делаю, я делаю другое — слежу, чтобы первое условие было без отрицания. Мне так эстетичнее кажется.

Eyeless

Комментарий для Неуч:

Ага, изящества через край. И первый же камент, где переспрашивается, что оно должно делать.

Евгений Степанищев (bolknote.ru)

Комментарий для Eyeless:

Это показатель чего?

Евгений Степанищев (bolknote.ru)

Комментарий для Eyeless:

Мне ещё интересно, откуда у вас столько желчи.

Eyeless

Комментарий для Евгения Степанищева:

Исключительно того, что это не просто и не порядок.

Eyeless

Комментарий для Евгения Степанищева:

Желчи? У меня? Вы хотите поговорить об этом?

Евгений Степанищев (bolknote.ru)

Комментарий для Eyeless:

Исключительно того, что это не просто и не порядок.

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

Желчи? У меня? Вы хотите поговорить об этом?

Желчи. У вас. Нет.

Eyeless

Комментарий для Евгения Степанищева:

var a = condition ? 2 : 3; куда проще. И вопросов типа первого не вызывает. И даже уже присутствует в той же строчке.

Евгений Степанищев (bolknote.ru)

Комментарий для Eyeless:

var a = condition + 2 куда проще и вопросов никаких не вызывает.

Eyeless

Комментарий для Евгения Степанищева:

Вызывает, прочитайте первый же(!) комментарий к заметке.
Что ж до конца-то тогда не пошли?
var version = 1 + (event.acceleration !== undefined) + (window.devicePixelRatio === 2);

Евгений Степанищев (bolknote.ru)

Комментарий для Eyeless:

Вызывает, прочитайте первый же(!) комментарий к заметке.

Я не знаю квалификации Неуча, но возможно его ник говорящий.

Что ж до конца-то тогда не пошли?

До какого конца-то? То, что вы написали, мне не нравится, мне нравится мой вариант. Кстати, с чем вы спорите, я не понял? Вот с этой единственной строчкой? Ну так скопируйте код себе, исправьте на то что нравится и перестаньте мне морочить голову.

Eyeless

Ну да. Начинали с «просто и понятно», скатились в «нравится». Собсно, об чем речь и была.

Евгений Степанищев (bolknote.ru)

Комментарий для Eyeless:

Как вы умудряетесь прочитывать не то, что написано?

Он не может одновременно быть понятным и нравится что ли? Ваш вариант тоже простой, но он мне не нравится. Почему я должен написать так как вы предлагаете — мне не ясно. Скопируйте себе и пишите как нравится вам. Делов-то.

Eyeless

Комментарий для Евгения Степанищева:

tsya.ru
Просто не нужно называть приведение к нравящемуся варианту «упрощением и наведением порядка». Делов-то.

Евгений Степанищев (bolknote.ru)

Комментарий для Eyeless:

Всё что я хотел сказать, я уже сказал.

Популярное