Виявлення мобільного браузера


888

Я шукаю функцію, яка повертає булеве значення, якщо користувач має мобільний браузер чи ні.

Я знаю, що я можу використовувати navigator.userAgentта записувати цю функцію за допомогою regex, але користувацькі агенти занадто різні для різних платформ. Я сумніваюся, що зіставити всі можливі пристрої було б просто, і я думаю, що ця проблема була вирішена раніше, тому що для такого завдання має бути якесь повне рішення.

Я дивився на цей сайт , але, на жаль, сценарій настільки виразний, що я не маю уявлення, як його використовувати для своїх цілей, а саме створити функцію, яка повертає true / false.



2
Спробуйте прочитати це. stackoverflow.com/questions/743129 / ...
KyelJmD

5
@Thrustmaster: Дійсно, не було б. Обслуговування різних JS у різних браузерах означає, що вам потрібно додати Vary: User-Agentсвою відповідь, інакше кешування проксі-серверів зберігатиме одну версію та надсилатиме її до іншого типу браузера. Але Vary: User-Agentробить реакцію незмінною в IE.
bobince

16
@ave: Що ви намагаєтесь зробити, виявивши "мобільний" браузер? Відмінність досить суперечлива в сучасному світі планшетів та гібридних обчислювальних пристроїв. Ви хочете виявити маленькі екрани та представити інший інтерфейс користувача у такому випадку? Ви хочете виявити підключення з низькою пропускною здатністю? Ви хочете виявити сенсорні інтерфейси?
bobince

2
Тому я оновив свою відповідь, щоб використовувати метод JavaScript JavaScript detectmobilebrowsers.com, але повернути булеве значення, якщо комусь це все ще потрібно. (про всяк випадок). Щасливе виявлення :)
Михайло Запорожець

Відповіді:


1316

Використання Regex (від detectmobilebrowsers.com ):

Ось функція, яка використовує шалено довгий і всебічний регулярний вираз, який повертає значення trueабо falseзначення залежно від того, переглядає користувач мобільний телефон чи ні.

window.mobileCheck = function() {
  let check = false;
  (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);
  return check;
};

Для тих, хто бажає включити планшети в цей тест (хоча це, мабуть, не слід), ви можете скористатись такою функцією:

window.mobileAndTabletCheck = function() {
  let check = false;
  (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);
  return check;
};

Оригінальний відповідь

Це можна зробити, просто переглянувши список пристроїв і перевіривши, чи useragentвідповідає щось подібне:

  function detectMob() {
    const toMatch = [
        /Android/i,
        /webOS/i,
        /iPhone/i,
        /iPad/i,
        /iPod/i,
        /BlackBerry/i,
        /Windows Phone/i
    ];

    return toMatch.some((toMatchItem) => {
        return navigator.userAgent.match(toMatchItem);
    });
}

Однак, оскільки ви вважаєте, що цей метод ненадійний, ви можете припустити, що будь-який пристрій, який має роздільну здатність 800x600 або менше, був і мобільним пристроєм, що ще більше звузило вашу ціль (хоча в наші дні багато мобільних пристроїв мають набагато більшу роздільну здатність, ніж ця)

тобто

  function detectMob() {
    return ( ( window.innerWidth <= 800 ) && ( window.innerHeight <= 600 ) );
  }

Довідка:


25
Привіт, я щойно відвідав посилання detectmobilebrowsers.com на своєму iPad 3, iOS 6.1.2, і там написано: "Не знайдено мобільного браузера".
Річард Лавджой

49
@RichardLovejoy При створенні сайтів ipad, як правило, не вважається мобільним.
Михайло Запорожець

42
З про сторінку: Android таблетки, и, Kindle Пожежі і PlayBooks не визначаються конструкцією. Щоб додати підтримку планшетів, додайте |android|ipad|playbook|silkдо першого регексу.
Гра "Двомісний"

13
Google TV теж Android. Що визначає мобільний телефон? Розмір екрану ? Дотик? пристрійОрієнтація? Коли я проектую, це більше питання про перехід миші чи ні, великий бутон чи невеликі посилання. Тож наразі я біжу з "якщо (Modernizr.touch)" :)
molokoloco

30
Гауд, вся ця ідея про користувацьких агентів жахлива, і справді її справді потрібно зупинити. Нам дійсно потрібно припинити дозволяти клієнтам боротися проти припливу та просто дотримуватися запитів у ЗМІ. Якщо вони хочуть робити переадресації на основі масштабу для певних сторінок, то просто перевірте діапазон конкретного медіа-запиту за допомогою JS, тобто tylergaw.com/articles/reacting-to-media-queries-in-javascript
marksyzm

324

Як щодо:

if (typeof window.orientation !== 'undefined') { ... }

... оскільки смартфони зазвичай підтримують цю властивість, а веб-переглядачі цього не роблять.

EDIT: Як зазначав @Gajus, це рішення зараз застаріле і його не слід використовувати ( https://developer.mozilla.org/en-US/docs/Web/API/Window/orientation )


14
це насправді супер унікальне та дивовижне, чи не заперечуєте, якщо я додам це до своєї відповіді?
Михайло Запорожець

77
Напевно, це довго не буде працювати. 1) Планшети можуть мати пристойні розміри екрана, ви хочете, щоб вони відображали повний веб-сайт на робочому столі, але вони матимуть це властивість. 2) Windows 8 тут, а з ним купу ноутбуків із сенсорним екраном та екранами, які обертаються.
Дейв Хілдич

10
що стосується вашого першого пункту щодо планшетів із пристойними розмірами екрана - я думаю, ви можете зробити ті ж аргументи і для всіх інших рішень (планшет з великим екраном, який відслідковується як малий екран). у будь-якому випадку ідея полягає в тому, щоб знайти властивість, якою поділяються невеликі пристрої, а не тримати довгий код підтримки та додати регулярний вираз з кожним новим пристроєм / вісією / моделлю. Я думаю, що виявлення пристроїв належить до минулого, і сьогодні нам потрібно зосередитися на виявленні функцій. знову я буду радий тут про більш підходящу власність для цього питання ...
yoav barnea

2
Любіть це і працює чудово, дякую. За своїм рішенням я був просто після простого.
Bojangles

40
window.orientationє застарілим властивістю ( developer.mozilla.org/en-US/docs/Web/API/Window/orientation , compat.spec.whatwg.org/#dom-window-orientation ), яке деякі мобільні браузери вирішують підтримувати з невідомих причин. . Ті ж браузери реалізують window.screen.orientation(що визначено і в настільних браузерах). Я можу лише припустити, що window.orientationвін залишився там із застарілих причин і тому не повинен використовуватися в нових програмах.
Gajus

115
var isMobile = {
    Android: function() {
        return navigator.userAgent.match(/Android/i);
    },
    BlackBerry: function() {
        return navigator.userAgent.match(/BlackBerry/i);
    },
    iOS: function() {
        return navigator.userAgent.match(/iPhone|iPad|iPod/i);
    },
    Opera: function() {
        return navigator.userAgent.match(/Opera Mini/i);
    },
    Windows: function() {
        return navigator.userAgent.match(/IEMobile/i) || navigator.userAgent.match(/WPDesktop/i);
    },
    any: function() {
        return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows());
    }
};

Як користуватись

if( isMobile.any() ) alert('Mobile');

Щоб перевірити, чи користувач перебуває на певному мобільному пристрої:

if( isMobile.iOS() ) alert('iOS');

Посилання: http://www.abeautifulsite.net/blog/2011/11/detecting-mobile-devices-with-javascript

Розширена версія на Github: https://github.com/smali-kazmi/detect-mobile-browser


Чому б не зробити any()для ... у циклі isMobileчленів ORed ?
SomeShinyObject

@ChristopherW Я створив свій плагін і модифікований код, як ви порадили
Mudaser Ali

2
Можливо, перемістіть iOS попереду BlackBerry (), щоб спочатку поставити більш поширені випадки та дозволити ранній порятунку заощадити додаткову обробку?
Rob_vH

2
@Rob_vH я поставив цей код у github ( github.com/smali-kazmi/detect-mobile-browser ) з деякими попередніми можливостями; ви також можете надіслати пропозиції
Mudaser Ali

1
@AkarshSatija Чи знижується ефективність цих 5 перевірок регулярних виразів на будь-яке ваше додаток? Я був би дуже здивований, якби це було. Передчасна оптимізація може бути марною тратою часу ...
trusktr

68

Ось просте рішення з джерела рогатки у Facebook

var isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
if (isMobile) {
  /* your code here */
}

Приємно. Дуже корисний у певних ситуаціях
Чак Ле Батт

Корисно в разі виявлення пристрою, на якому можна було б встановити мобільний додаток. Ви не переймаєтесь веб-переглядачем. Просто пристрій / ОС.
Charlie

30

Сюди ми шукали простий, чистий спосіб виявити "пристрої з сенсорними екранами", які я класифікую як мобільні та планшети. Не знайшов чистого вибору в нинішніх відповідях, але розробив наступне, що також може комусь допомогти.

var touchDevice = ('ontouchstart' in document.documentElement);

Редагувати : Для підтримки настільних комп’ютерів із сенсорним екраном та мобільних телефонів одночасно можна скористатись такими:

var touchDevice = (navigator.maxTouchPoints || 'ontouchstart' in document.documentElement);

9
Що робити, якщо монітор робочого столу підтримує дотик?
Антон Кузьмін

@HappyCoder Я вважаю, що ОС залежить від того, щоб повідомити браузеру, коли сенсорний екран на робочому столі активний. Так, так, ця перевірка все-таки повинна бути дійсною.
Тигр

(+1), проте на моєму робочому столі, який я зараз використовую, є сенсорний екран, і це не завжди відповідає touchstart|end|etc.
Коді

1
Вибір дат завантажувача використовує наступне: якщо (window.navigator.msMaxTouchPoints || 'ontouchstart' у документі) {this.input.blur (); }
JT Taylor

1
@JTTaylor Схоже, Microsoft рекомендує navigator.maxTouchPoints (без msпрефіксу). Також є стаття MDN для перевірки.
Тигр

20

Як багато хто заявляв, покладатися на рухому ціль даних агента користувача проблематично. Те саме можна сказати і для підрахунку розміру екрана.

Мій підхід запозичений у техніці CSS, щоб визначити, чи інтерфейс дотик:

Використовуючи лише JavaScript (підтримка всіх сучасних браузерів), відповідність медіа-запиту може легко зробити висновок про те, чи пристрій мобільний .

function isMobile() {
    var match = window.matchMedia || window.msMatchMedia;
    if(match) {
        var mq = match("(pointer:coarse)");
        return mq.matches;
    }
    return false;
}

6
Що з ноутбуками із сенсорними дисплеями?
Максим

6
Я хотів би перевірити! MatchMedia ("(будь-який вказівник: добре)"). ("Жодна миша не підключена", а не "має сенсорний екран".
Sora2455

Це працює, тоді як мій останній сценарій натрапляв на людей, які використовують функцію масштабування браузера (наприклад, хлопець, з яким я спілкувався на 13-дюймовому екрані з 4K, який знизився до 1080p і все ще довелося використовувати зум). Працював на моєму iPhone (Safari / Firefox) та пристрої Android (Waterfox / Chrome / "Browser"). Безумовно, набагато надійніші за всі відповіді на більш високі результати.
Джон,

не виявляє FireFox fennec на Android, для якого я доповнив navigator.userAgent.toLowerCase (). indexOf ('fennec')> -1 (можливо, не найкраща добавка ..)
StayCool

2
Крім того, ви можете перевірити властивість наближення: для смартфонів та сенсорних екранів @media (hover: none) та (pointer: coarse)
Batailley

16

Відповідно до статті MDN про виявлення браузера за допомогою агента користувача , рекомендується уникати такого підходу, якщо це можливо, та пропонувати інші шляхи, такі як виявлення функцій.

Однак якщо потрібно використовувати агент користувача як засіб для виявлення, чи пристрій мобільний, вони пропонують:

Підсумовуючи, ми рекомендуємо шукати рядок "Mobi" в будь-якій точці Користувального агента для виявлення мобільного пристрою.

Тому цього одного вкладиша буде достатньо:

const isMobileDevice = window.navigator.userAgent.toLowerCase().includes("mobi");

[ОНОВЛЕННЯ]:

Як пропонує @ zenw0lf в коментарях, краще використовувати регулярний вираз:

const isMobileDevice = /Mobi/i.test(window.navigator.userAgent)


.includesне сопорт IE-11
Паша Олейник

1
@PashaOleynik поліфіл може це виправити
Максим

Планшет Nexus 7 з Android не має Mobileв рядку агента користувача
Олексій Сороколетов

@AlexSorokoletov Також для статті MDNIf the device is large enough that it's not marked with “Mobi”, you should serve your desktop site (which, as a best practice, should support touch input anyway, as more desktop machines are appearing with touchscreens).
TheDarkIn1978

1
Я думаю, що це спрацює будь-де без поліфілів: const isMobile = /Mobi/.test(window.navigator.userAgent)
zenw0lf

14

Немає ідеального рішення для визначення того, чи виконується JS-код у мобільному браузері, але наступні два варіанти мають працювати в більшості випадків.

Варіант 1: нюхання браузера

!function(a){var b=/iPhone/i,c=/iPod/i,d=/iPad/i,e=/(?=.*\bAndroid\b)(?=.*\bMobile\b)/i,f=/Android/i,g=/(?=.*\bAndroid\b)(?=.*\bSD4930UR\b)/i,h=/(?=.*\bAndroid\b)(?=.*\b(?:KFOT|KFTT|KFJWI|KFJWA|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|KFARWI|KFASWI|KFSAWI|KFSAWA)\b)/i,i=/IEMobile/i,j=/(?=.*\bWindows\b)(?=.*\bARM\b)/i,k=/BlackBerry/i,l=/BB10/i,m=/Opera Mini/i,n=/(CriOS|Chrome)(?=.*\bMobile\b)/i,o=/(?=.*\bFirefox\b)(?=.*\bMobile\b)/i,p=new RegExp("(?:Nexus 7|BNTV250|Kindle Fire|Silk|GT-P1000)","i"),q=function(a,b){return a.test(b)},r=function(a){var r=a||navigator.userAgent,s=r.split("[FBAN");return"undefined"!=typeof s[1]&&(r=s[0]),s=r.split("Twitter"),"undefined"!=typeof s[1]&&(r=s[0]),this.apple={phone:q(b,r),ipod:q(c,r),tablet:!q(b,r)&&q(d,r),device:q(b,r)||q(c,r)||q(d,r)},this.amazon={phone:q(g,r),tablet:!q(g,r)&&q(h,r),device:q(g,r)||q(h,r)},this.android={phone:q(g,r)||q(e,r),tablet:!q(g,r)&&!q(e,r)&&(q(h,r)||q(f,r)),device:q(g,r)||q(h,r)||q(e,r)||q(f,r)},this.windows={phone:q(i,r),tablet:q(j,r),device:q(i,r)||q(j,r)},this.other={blackberry:q(k,r),blackberry10:q(l,r),opera:q(m,r),firefox:q(o,r),chrome:q(n,r),device:q(k,r)||q(l,r)||q(m,r)||q(o,r)||q(n,r)},this.seven_inch=q(p,r),this.any=this.apple.device||this.android.device||this.windows.device||this.other.device||this.seven_inch,this.phone=this.apple.phone||this.android.phone||this.windows.phone,this.tablet=this.apple.tablet||this.android.tablet||this.windows.tablet,"undefined"==typeof window?this:void 0},s=function(){var a=new r;return a.Class=r,a};"undefined"!=typeof module&&module.exports&&"undefined"==typeof window?module.exports=r:"undefined"!=typeof module&&module.exports&&"undefined"!=typeof window?module.exports=s():"function"==typeof define&&define.amd?define("isMobile",[],a.isMobile=s()):a.isMobile=s()}(this);

alert(isMobile.any ? 'Mobile' : 'Not mobile');

Цей конкретний нюхаючий код браузера - це код це бібліотека під назвою isMobile .


Варіант 2: вікно.орієнтація

Тест, якщо window.orientationвизначено:

var isMobile = window.orientation > -1;
alert(isMobile ? 'Mobile' : 'Not mobile');


Примітка

Не всі пристрої з сенсорним екраном є мобільними та навпаки. Отже, якщо ви хочете реалізувати щось спеціально для сенсорного екрану, ви не повинні перевіряти, чи працює ваш браузер на мобільному пристрої, а чи підтримує пристрої сенсорний екран:

var hasTouchscreen = 'ontouchstart' in window;
alert(hasTouchscreen ? 'has touchscreen' : 'doesn\'t have touchscreen');


Орієнтаційний підхід дійсно приємний! ))
Максим

1
Мені подобається ваше window.orientationрішення, але документи говорять про застаріле! developer.mozilla.org/en-US/docs/Web/API/Window/orientation
skwidbreth

3
Підхід до орієнтації НЕ приємний, оскільки Windows 8 та новіші версії можуть змінити орієнтацію.
Гейтор

Windows 8 та новіші версії орієнтовані на додавання підтримки для мобільних телефонів, а також гібридів (ноутбуків, які можуть конвертувати у великі колодки), тому орієнтація не вдається як метод виявлення, навіть якщо моз не посилався на це як на застаріле.
Джефф Клейтон

Це з Win 7 із встановленим графічним програмним забезпеченням, що може змінити орієнтацію, але задайте собі питання, хто може на Desktop / Laptop використовувати іншу орієнтацію екрана, як "Портрет" замість "Пейзаж", і використовувати i ще більше 1 хвилини. Ніхто !!! Зміна орієнтації на робочому столі означає, що ви почнете читати символи на екрані знизу вгору.
GirlCode

11

Ось рішення userAgent, яке є більш ефективним, ніж відповідність ...

function _isMobile(){
    // if we want a more complete list use this: http://detectmobilebrowsers.com/
    // str.test() is more efficent than str.match()
    // remember str.test is case sensitive
    var isMobile = (/iphone|ipod|android|ie|blackberry|fennec/).test
         (navigator.userAgent.toLowerCase());
    return isMobile;
}

7
метод випробування не враховує регістри, але ваш регулярний вираз є. ви можете просто позначити випадок нечутливого регексу з "я" в кінці і робити/iphone|etc/i.test(navigator.userAgent)
xec

11

Щоб додати додатковий рівень контролю, я використовую сховище HTML5, щоб виявити, чи використовується він у мобільному або настільному сховищі. Якщо браузер не підтримує сховище, у мене є масив імен мобільного браузера, і я порівнюю користувальницький агент із браузерами в масиві.

Це досить просто. Ось функція:

// Used to detect whether the users browser is an mobile browser
function isMobile() {
    ///<summary>Detecting whether the browser is a mobile browser or desktop browser</summary>
    ///<returns>A boolean value indicating whether the browser is a mobile browser or not</returns>

    if (sessionStorage.desktop) // desktop storage 
        return false;
    else if (localStorage.mobile) // mobile storage
        return true;

    // alternative
    var mobile = ['iphone','ipad','android','blackberry','nokia','opera mini','windows mobile','windows phone','iemobile']; 
    for (var i in mobile) if (navigator.userAgent.toLowerCase().indexOf(mobile[i].toLowerCase()) > 0) return true;

    // nothing found.. assume desktop
    return false;
}

3
Я ще не тестував на мобільних пристроях, але sessionStorage.desktopне існує ні в Safari, ні в Chrome, ні в Firefox (усі новіші версії на момент публікації). Однак ви отримуєте підсумкове голосування, оскільки ваше рішення іде в кращому напрямку, ніж інші. Але не забудьте використовувати var mobile =замість цього mobile =.
shuckster

3
Також хороша ідея не використовувати indexOf зі старими браузерами, які все ще знаходяться навколо, які не підтримують цей метод, або не використовувати polyfill. Не потрібно використовувати toLowerCase у списку малих значень, а також не потрібно це робити, якщо ви використовуєте /ipad|iphone|etc/i.test(navigator.userAgent) замість повільного циклу, який у вас є.
Джефрі Гілберт

10

Виявлення функцій набагато краще, ніж намагатися з’ясувати, на якому пристрої ви ввімкнено, і дуже важко йти в ногу з новими пристроями, які постійно виходять, бібліотека на зразок Modernizr дає вам змогу дізнатися, доступна чи ні певна функція.


18
Ви відповіли на інше питання, ніж те, що було задано. Замість того, як "як я можу виявити мобільний?", Ви відповіли "як я можу виявити певні функції?". Не всі пристрої виявлення призначені для виявлення функцій. Що робити, якщо ми шукали, щоб отримати статистику щодо пристроїв? Тоді ні, "виявлення функції" не є "набагато кращим, ніж [з'ясування пристрою]".
Джонатан Аллард

1
Це не відповідь, але вона заслуговує більше, ніж просто коментар. Питання: чому ви хочете виявити браузер і тоді ви, ймовірно, захочете це знати через (відсутність) дотику. Чуйного веб-дизайну вистачає в більшості, якщо не у всіх випадках.
doublejr

8

Як щодо чогось подібного?

if(
    (screen.width <= 640) || 
    (window.matchMedia && 
     window.matchMedia('only screen and (max-width: 640px)').matches
    )
  ){
   // Do the mobile thing
}

Чому б просто не використовувати screen.widthзамість цього? Мені здається, це надійніше, ніж window.matchMedia.
John Slegers

Добре, Джон, я не можу точно згадати, про що я думав у той час, здається, що (дивлячись на це зараз) мало ймовірно, що другий пункт повернеться справжнім, якщо перший неправдивий. Мабуть, була якась причина, але я додав це.
stujo

Більшість порядних програмістів соромляться, коли бачать код, який вони написали роком раніше. Ті, хто не просто не виросли програмістами ;-)
Джон Slegers

4
Дозвіл вікна не має нічого спільного з тим, чи переглядає браузер на мобільному пристрої чи ні. Наприклад, багато браузерів настільних пристроїв працюють у вікнах, що не є повноекранними. Якщо ви представите користувальницький інтерфейс, призначений для керованих екранів, для цих браузерів, їх користувачі матимуть розчарування.
ʇsәɹoɈ

1
@JohnSlegers - Мені найбільше соромно питання Googling та пошук власної відповіді на stackoverflow. знову і знову. Я сам перебуваю в постійному переповнення стека
vsync

7

Як тільки елемент набуває фокус, ви негайно розмиваєте його. Bootstrap-datepicker, який є дуже популярною та доглянутою складовою з майже 10000 зірок у GitHub, використовує такий підхід:

if (window.navigator.maxTouchPoints || 'ontouchstart' in document) {
    this.input.blur();
}

https://github.com/uxsolutions/bootstrap-datepicker

Дякуємо Tigger за допомогу.


7

Дійсно хороший спосіб виявити мобільні або планшетні пристрої - перевірити, чи може браузер створити сенсорну подію.

Простий код JavaScript:

function isMobile() {
   try{ document.createEvent("TouchEvent"); return true; }
   catch(e){ return false; }
}

if (isMobile()) {
   # do whatever you wanna do!
}

Це працювало для мене дуже добре, але може виникнути проблема з ноутбуками, які містять сенсорний екран.

Я не впевнений, чи буде ноутбук із сенсорним екраном виявлений як мобільний пристрій, оскільки я його ще не перевіряв.


5
Ноутбуки з сенсорним екраном будуть виявлені як мобільний пристрій. А також монітори з сенсорним екраном для настільних ПК. Вірте чи ні, ви також зіткнетеся з проблемою, якщо ви використовуєте сенсорний екран пристрою для RDP на інший пристрій, на якому немає сенсорного екрана.
блаженство

@blissfool я думаю, це не буде правильним способом виявлення мобільних пристроїв.
Нео Морина

На жаль, немає. Але це все ж може бути життєздатним варіантом для дуже обмеженого випадку використання.
блаженство

ніколи не пишіть код, який ґрунтується на винятку, який буде викинуто точно в будь-якому випадку ...
Пабло

@Sivic він викидається лише тоді, коли TouchEvent не існує, і код вище вловить його і поверне помилкове. Це не стосується мобільних пристроїв, планшетів та інших пристроїв із сенсорним екраном.
Нео Морина

5

Ось моє переосмислене рішення проблеми. Все ще не ідеально. Єдиним вірним рішенням було б, якщо виробники пристроїв почнуть серйозно сприймати рядки "Мобільний" та "Планшетний" користувацькі агенти.

window.onload = userAgentDetect;
function userAgentDetect() {
  if(window.navigator.userAgent.match(/Mobile/i)
  || window.navigator.userAgent.match(/iPhone/i)
  || window.navigator.userAgent.match(/iPod/i)
  || window.navigator.userAgent.match(/IEMobile/i)
  || window.navigator.userAgent.match(/Windows Phone/i)
  || window.navigator.userAgent.match(/Android/i)
  || window.navigator.userAgent.match(/BlackBerry/i)
  || window.navigator.userAgent.match(/webOS/i)) {
    document.body.className += ' mobile';
    alert('True - Mobile - ' + navigator.userAgent);
  } else {
    alert('False - Mobile - ' + navigator.userAgent);
  }
  if(window.navigator.userAgent.match(/Tablet/i)
  || window.navigator.userAgent.match(/iPad/i)
  || window.navigator.userAgent.match(/Nexus 7/i)
  || window.navigator.userAgent.match(/Nexus 10/i)
  || window.navigator.userAgent.match(/KFAPWI/i)) {
    document.body.className -= ' mobile';
    document.body.className += ' tablet';
    alert('True - Tablet - ' + navigator.userAgent);
  } else {
    alert('False - Tablet - ' + navigator.userAgent);
  }
}

Що станеться, коли планшет Nexus 7 має лише рядок Android UA? По-перше, мобільний стає справжнім, чим пізніше планшетний ПК також стане істинним, але планшет видалить рядок Mobile UA з тегу body.

CSS:

body.tablet { background-color: green; }
body.mobile { background-color: red; }

alertдодані лінії для розвитку. Консоль Chrome може імітувати багато портативних пристроїв. Тест там.

Редагувати:

Просто не використовуйте це, замість цього використовуйте функцію виявлення. Існує так багато пристроїв та брендів, що націлення на бренд НІКОЛИ не буде правильним рішенням.


4

Раджу перевірити http://wurfl.io/

Коротше кажучи, якщо ви імпортуєте крихітний файл JS:

<script type='text/javascript' src="//wurfl.io/wurfl.js"></script>

вам залишиться об’єкт JSON, який виглядає так:

{
 "complete_device_name":"Google Nexus 7",
 "is_mobile":true,
 "form_factor":"Tablet"
}

(це, звичайно, якщо ви використовуєте Nexus 7), і ви зможете робити такі речі, як:

if(WURFL.form_factor == "Tablet"){
    //dostuff();
}

Це те, що ви шукаєте.

Відмова: Я працюю в компанії, яка пропонує цю безкоштовну послугу. Дякую.


1
І як це не визнає сафарі на iphone?
Еміт

Чи можете ви розширити, який браузер ви використовуєте (точний рядок UA був би ідеальним), які дані ви отримуєте і що ви очікуєте?
Лука Пассані

Я теж спробував wurfl, я на iPhone 5C, на якому працює IOS 11.2. Не визнаючи Safari мобільним браузером. Я очікую використовувати "is_mobile": true, а потім "form_factor": Смартфон і його також не повертається.
Майк Уеллс

Мені довелося звернутися до гуру мобільних даних у компанії, і вони мені кажуть, що ОС 11.2 не працює на 5С. Найнижчий пристрій - це 5S. Отже, щось не вірно в тому, що ви написали. Не соромтеся зв’язатися з ScientiaMobile офлайн, щоб перевірити, де може бути відключення. Спасибі
Лука Пассані

4

ось один лайнер

function isMobile() {
  return (typeof window.orientation !== "undefined") || (navigator.userAgent.indexOf('IEMobile') !== -1);
};

3

Залежить від випадку використання. Усі мобільні пристрої потребують акумулятора. Якщо ви шукаєте, це обчислити енергію без розрядки акумулятора, використовуйте API стану батареї :

navigator.getBattery().then(battery => {
  battery.charging ? 'charging' : 'not charging';
});

Якщо ви шукаєте це презентаційне використання matchMedia, яке повертає булеве значення:

if (window.matchMedia("(min-width: 400px)").matches) {
  /* the viewport is at least 400 pixels wide */
} else {
  /* the viewport is less than 400 pixels wide */
}

Або комбінувати їх для ще кращого користувацького досвіду на планшетних пристроях.


Зауважте, що API статусу акумулятора видаляється з браузерів.
Sora2455

API статусу акумулятора видалено з Firefox, але залишається рекомендацією щодо кандидата W3C з липня 2016 року , і надалі функціонує у популярних браузерах і є корисним для формування досвіду.
Джош Хабдас

2

Ось рішення ECMAScript 6 (готовий TypeScript)

public isMobile(): boolean {
  let check = false;
  ((a => {
      if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check = true;
      }))(navigator.userAgent || navigator.vendor);
  return check;
 }

чому б просто не повернути ifумову, а не мати всю цю checkзмінну?
Вік

2

Існує простий трюк, щоб виявити, це мобільний пристрій чи ні. Просто перевірте, чи існує подія ontouchstart :

function isMobile()
{
    return "ontouchstart" in window;
}

3
Не працюватимуть із ноутбуками та декстопами з моніторами сенсорного екрану. Також буде проблема з гібридним ПК на зразок Surface. Менше проблем з настільними комп'ютерами, але в даний час продається більше ноутбуків із сенсорним екраном.
блаженство

2

Я зіткнувся з деякими сценаріями, коли відповіді на мене діють відповіді. Тому я придумав це. Можливо, комусь буде корисно.

if(/iPhone|iPad|iPod|Android|webOS|BlackBerry|Windows Phone/i.test(navigator.userAgent)
 || screen.availWidth < 480){
//code for mobile
}

Це залежить від вашого випадку використання. Якщо ви зосереджені на використанні екрана screen.availWidth, або ви можете використовувати, document.body.clientWidthякщо ви хочете відображати на основі документа.


1

Найкращими повинні бути:

var isMobile = (/Mobile/i.test(navigator.userAgent));

Але так, як каже Йоав Барнеа ...

// Seem legit
var isMobile = ('DeviceOrientationEvent' in window || 'orientation' in window);
// But with my Chrome on windows, DeviceOrientationEvent == fct()
if (/Windows NT|Macintosh|Mac OS X|Linux/i.test(navigator.userAgent)) isMobile = false;
// My android have "linux" too
if (/Mobile/i.test(navigator.userAgent)) isMobile = true;

Після цього 3 тестів, я сподіваюся, що Var isMobile - це ... добре


> Мобільний Firefox на android, схоже, не має "орієнтації" у вікні "
molokoloco

1
Вибачте .. добре для мене це працює добре, як зараз. "якщо (Modernizr.touch) / * ... * /" і продовжувати ...
molokoloco

Цікаво, як Modernizr.touch працюватиме на настільному пристрої з сенсорним екраном.
B2K

Щоб зробити його більш елегантним, вам слід зробити весь код лише в одному блоці if-else if-else if.
Гейтор

1

Ось він повноцінний

function isMobile(){
    return (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino|android|ipad|playbook|silk/i.test(navigator.userAgent||navigator.vendor||window.opera)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test((navigator.userAgent||navigator.vendor||window.opera).substr(0,4)))
}

jQuery.noConflict();
jQuery(document).ready(function(){
    if(isMobile()) alert("Mobile"); else alert("Not Mobile");
});

.substr (0,4) повертає перші 4 літери. Як він визначає "android. + Mobile"?
гонщик

1
@raacer у відповіді насправді є два регулярні вирази (обидва в одному рядку) - перший перевіряє всю нитку UA і шукає android, mobile тощо, тоді як другий перевіряє лише перші 4 символи UA .
JackW

1
//true / false
function isMobile()
{
   return (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) ); 
}

також ви можете слідувати цим посібником, щоб виявити конкретний мобільний телефон. Натисніть тут .


Будь ласка, додайте Mobileу свій RX
oriadam

1

як щодо використання "window.screen.width"?

if (window.screen.width < 800) {
// do something
}

або

if($(window).width() < 800) {
//do something
}

Я думаю, що це найкращий спосіб, тому що кожен день з’являється новий мобільний пристрій!

(хоча я думаю, що це не так підтримується в старих браузерах, але спробуйте :))


1
Що стосується ландшафту?
Ерік Вуду

1
Це не дуже корисно для певних сценаріїв. Якщо змінити розмір браузера на робочому столі, він може бути виявлений неправильно як мобільний браузер
toing_toing

ПК істотно відрізняється від мобільних пристроїв юзабіліті, жахливою відповіддю !!
Гейтор

1

Зауважте, що тепер більшість мобільних пристроїв нового покоління мають роздільну здатність більше 600x400. тобто iPhone 6 ....

Доказ тесту: запускав найактуативніші та найсвіжіші публікації тут, з необов'язковою перевіркою, як тільки виконується так:

(function(a){
    window.isMobile = (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))
})(navigator.userAgent||navigator.vendor||window.opera);

alert("This browser was found to be a % browser.", window.isMobile ? 'mobile' : 'desktop');

Якимось чином наступні результати були повернуті в наступних браузерних додатках. Технічні характеристики: iPhone 6S, iOS 10.3.1.

Сафарі (останнє): Виявив його як мобільний.

Chrome (остання версія): не виявив його як мобільний.

Отже, я тестував пропозицію від Lanti ( https://stackoverflow.com/a/31864119/7183483 ), і він повернув належні результати (мобільний для всіх пристроїв iOS та настільний комп’ютер для мого Mac). Тому я продовжив його редагувати, оскільки він запустився б двічі (як для мобільних пристроїв, так і для планшетів). Потім я помітив при тестуванні на iPad, що він також повертається як мобільний, що має сенс, оскільки параметри це Лантівикористовує перевірку ОС більше ніж усе. Тому я просто перемістив оператор IF IF на планшет всередину мобільної перевірки, яка повертається мобільним - це перевірка планшетного ПК була негативною, а планшетна - інакше. Потім я додав інше положення про те, щоб мобільний чек повернувся як робочий стіл / ноутбук, оскільки обидва відповідають вимогам, але потім помітив, що браузер виявляє процесор та бренд ОС. Тож я додав те, що повертається туди, як частину else if натомість. Щоб обмежити це, я додав попереджувальне твердження про інше, якщо нічого не було виявлено. Дивіться нижче, незабаром оновиться тест на ПК з Windows 10.

О, і я також додав змінну "debugMode", щоб легко переходити між налагодженням і звичайним компілюванням.

Відмова: Повна заслуга Ланті , також, що це не перевірено на планшетах Windows ..., що може повернути робочий стіл / ноутбук, оскільки ОС - це чиста Windows. Перевіряю, як тільки знайду друга, який його використовує.

function userAgentDetect() {
    let debugMode = true;
    if(window.navigator.userAgent.match(/Mobile/i)
        || window.navigator.userAgent.match(/iPhone/i)
        || window.navigator.userAgent.match(/iPod/i)
        || window.navigator.userAgent.match(/IEMobile/i)
        || window.navigator.userAgent.match(/Windows Phone/i)
        || window.navigator.userAgent.match(/Android/i)
        || window.navigator.userAgent.match(/BlackBerry/i)
        || window.navigator.userAgent.match(/webOS/i)) {
        if (window.navigator.userAgent.match(/Tablet/i)
            || window.navigator.userAgent.match(/iPad/i)
            || window.navigator.userAgent.match(/Nexus 7/i)
            || window.navigator.userAgent.match(/Nexus 10/i)
            || window.navigator.userAgent.match(/KFAPWI/i)) {
            window.deviceTypeVar = 'tablet';
            if (debugMode === true) {
                alert('Device is a tablet - ' + navigator.userAgent);
            }
        } else {
            if (debugMode === true) {
                alert('Device is a smartphone - ' + navigator.userAgent);
            };
            window.deviceTypeVar = 'smartphone';
        }
    } else if (window.navigator.userAgent.match(/Intel Mac/i)) {
        if (debugMode === true) {
            alert('Device is a desktop or laptop- ' + navigator.userAgent);
        }
        window.deviceTypeVar = 'desktop_or_laptop';
    } else if (window.navigator.userAgent.match(/Nexus 7/i)
        || window.navigator.userAgent.match(/Nexus 10/i)
        || window.navigator.userAgent.match(/KFAPWI/i)) {
        window.deviceTypeVar = 'tablet';
        if (debugMode === true) {
            alert('Device is a tablet - ' + navigator.userAgent);
        }
    } else {
        if (debugMode === true) {
            alert('Device is unknown- ' + navigator.userAgent);
        }
        window.deviceTypeVar = 'Unknown';
    }
}

1

Це лише порт es6 прийнятої відповіді, який я використовую у своєму проекті. Зауважте, що сюди також входять таблетки.

export const isMobile = () => {
  const vendor = navigator.userAgent || navigator.vendor || window.opera;

  return !!(
    /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(
      vendor
    ) ||
    /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(
      vendor.substr(0, 4)
    )
  );
};

1

return 'ontouchstart' in window && window.screen.availWidth < 768

Як щодо цього, він розширюється на відповідь вище, але також перевіряє розмір екрана


1

Використання Regex (від detectmobilebrowsers.com ):

/* eslint-disable */
export const IS_MOBILE = (function (a) {
  return (
    /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i
      .test(
        a.substr(0,4)
      )
  )
  // @ts-ignore
})(navigator.userAgent || navigator.vendor || window.opera)
/* eslint-enable */

0

Це також може бути рішенням.

var isMobile = false; //initiate as false

  // device detection
  if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent) 
  || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0,4))) isMobile = true;

  console.log('Mobile device:'+isMobile);

  var doc_h = $(document).height(); // returns height of HTML document
  var doc_w = $(document).width(); // returns width of HTML document
  console.log('Height: '+doc_h);
  console.log('width: '+doc_w);

  var iPadVertical = window.matchMedia("(width: 768px) and (height: 1024px) and (orientation: portrait)");
  var iPadHoricontal = window.matchMedia("(width: 1024px) and (height: 767px) and (orientation: landscape)");

  console.log('Height: '+doc_h);
  console.log('width: '+doc_w);

  if (iPadVertical.matches) {
      console.log('Ipad vertical detected');
  }else if (iPadHoricontal.matches){
      console.log('Ipad horicontal detected');
  }else {
      console.log('No Ipad');
  }

Якщо ви використовуєте обидва способи, ви отримаєте ідеальний спосіб виявити різні пристрої.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.