Как определить модель 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

Eyeless № 4
Упростили и навели порядок, заменив проверку условия на сложение boolean с int? Ну-ну.
Евгений Степанищев (bolknote.ru) автор № 7
Упростили и навели порядок, заменив проверку условия на сложение boolean с int? Ну-ну.

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

maxim-zotov № 11

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

Это как?

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

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

Евгений Степанищев (bolknote.ru) автор № 12
А, не я так не делаю, я делаю другое — слежу, чтобы первое условие было без отрицания. Мне так эстетичнее кажется.
Евгений Степанищев (bolknote.ru) автор № 18

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

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

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

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

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

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

var a = condition ? 2 : 3; куда проще. И вопросов типа первого не вызывает. И даже уже присутствует в той же строчке.
Eyeless № 21
Комментарий для Евгения Степанищева:

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

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

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

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

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

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

Евгений Степанищев (bolknote.ru) автор № 24
Комментарий для Eyeless:

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

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

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