Как определить модель 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);
в version будет или 1 или 3, но не 2, правильно?
Ах, прошу прощения, 2 тоже будет
Красивое решение. Его можно использовать в своих проектах?
Упростили и навели порядок, заменив проверку условия на сложение boolean с int? Ну-ну.
Комментарий для Eyeless:
Изящно же
Комментарий для orcinus.ru:
Можно, конечно!
Комментарий для Eyeless:
А что вас смущает-то?
(«всем») А ни у кого нет привычки переставлять очень короткие if/else части первыми?
Комментарий для Евгения Степанищева:
спасибо...
Комментарий для ku:
Это как?
Комментарий для Евгения Степанищева:
Инвертировать условие, чтобы первым шел короткий блок,
if (!(’ondevicemotion’ in window)) {
callback(undefined);
} else {
//длинный блок
}
Смысл в том, что когда сначала идет простое действие, проще уследить за логикой алгоритма, вся конструкция «if then else» легко обозрима, находится на двух-трех строках, быстренько разделался с формальным ответвлением и занимаешься реальным делом. Когда сначала идет длинный блок, то когда настанет else, уже успеешь потерять нить, к чему именно был этот else. Это расположение физически рядом тех блоков, которые рядом логически. Цена — ухудшение читаемости условия if, лишнее отрицание не украшает программу.
Комментарий для maxim-zotov:
А, не я так не делаю, я делаю другое — слежу, чтобы первое условие было без отрицания. Мне так эстетичнее кажется.
Комментарий для Неуч:
Ага, изящества через край. И первый же камент, где переспрашивается, что оно должно делать.
Комментарий для Eyeless:
Это показатель чего?
Комментарий для Eyeless:
Мне ещё интересно, откуда у вас столько желчи.
Комментарий для Евгения Степанищева:
Исключительно того, что это не просто и не порядок.
Комментарий для Евгения Степанищева:
Желчи? У меня? Вы хотите поговорить об этом?
Комментарий для Eyeless:
Это не наведение порядка, это упрощение. Это очень просто, правда. Я, конечно, понимаю, что программисты вырождаются, но не настолько же.
Желчи. У вас. Нет.
Комментарий для Евгения Степанищева:
var a = condition ? 2 : 3; куда проще. И вопросов типа первого не вызывает. И даже уже присутствует в той же строчке.
Комментарий для Eyeless:
var a = condition + 2 куда проще и вопросов никаких не вызывает.
Комментарий для Евгения Степанищева:
Вызывает, прочитайте первый же(!) комментарий к заметке.
Что ж до конца-то тогда не пошли?
var version = 1 + (event.acceleration !== undefined) + (window.devicePixelRatio === 2);
Комментарий для Eyeless:
Я не знаю квалификации Неуча, но возможно его ник говорящий.
До какого конца-то? То, что вы написали, мне не нравится, мне нравится мой вариант. Кстати, с чем вы спорите, я не понял? Вот с этой единственной строчкой? Ну так скопируйте код себе, исправьте на то что нравится и перестаньте мне морочить голову.
Ну да. Начинали с «просто и понятно», скатились в «нравится». Собсно, об чем речь и была.
Комментарий для Eyeless:
Как вы умудряетесь прочитывать не то, что написано?
Он не может одновременно быть понятным и нравится что ли? Ваш вариант тоже простой, но он мне не нравится. Почему я должен написать так как вы предлагаете — мне не ясно. Скопируйте себе и пишите как нравится вам. Делов-то.
Комментарий для Евгения Степанищева:
tsya.ru
Просто не нужно называть приведение к нравящемуся варианту «упрощением и наведением порядка». Делов-то.
Комментарий для Eyeless:
Всё что я хотел сказать, я уже сказал.