Як виявити мобільний пристрій за допомогою JavaScript?


78

Мене попросили створити фактичну HTML-сторінку / JavaScript для імітації виявлення мобільних пристроїв (iPhone / iPad / Android) за допомогою коду JavaScript. Потім користувач перейде на інший екран, який запитає їх про адресу електронної пошти.


якщо ви можете знати розміри екрану таким чином, ви можете розрізнити iphone та ipad
loveh

1
Використання можна використовувати код: stackoverflow.com/questions/11381673 / ...
Mudaser Алі

Відповіді:


82

Я знаю, що ця відповідь прийде із запізненням на 3 роки, але жодна з інших відповідей справді не є на 100% правильною. Якщо ви хочете виявити, чи має користувач БУДЬ-ЯКУ форму мобільного пристрою (Android, iOS, BlackBerry, Windows Phone, Kindle тощо), тоді ви можете використовувати такий код:

if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|BB|PlayBook|IEMobile|Windows Phone|Kindle|Silk|Opera Mini/i.test(navigator.userAgent)) {
    // Take the user to a different screen here.
}

1
Я б також додав ключове слово "Мобільний телефон".
Кіралій Іштван,

3
вам потрібна якась бібліотека? Сумніваюся, це так просто.

28

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

Цей сайт допоможе вам створити код: http://www.hand-interactive.com/resources/detect-mobile-javascript.htm

Приклад :

Ви можете отримати агент користувача в javascript, виконавши це:

var uagent = navigator.userAgent.toLowerCase();

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

function DetectIphone()
{
   if (uagent.search("iphone") > -1)
      alert('true');
   else
      alert('false');
}

Редагувати

Ви створили б просту HTML-сторінку приблизно так:

<html>
    <head>
        <title>Mobile Detection</title>
    </head>
    <body>
        <input type="button" OnClick="DetectIphone()" value="Am I an Iphone?" />
    </body>
</html>
<script>
    function DetectIphone()
    {
       var uagent = navigator.userAgent.toLowerCase();
       if (uagent.search("iphone") > -1)
          alert('true');
       else
          alert('false');
    }
</script>

Але мені цікаво, що було б почати? Створіть фіктивну веб-сторінку та вставте туди це кодування. Чи будемо ми використовувати HTML, оскільки, як я вже згадував у своєму коді вище, у мене немає з чого починати.
Jeevs

Чудово !!!! Дякую за це. Як щодо перенаправлення його на іншу сторінку. Думаєте, щось подібне допомогло б? if ((navigator.userAgent.match (/ iPhone / i)) || (navigator.userAgent.match (/ iPod / i)) || (navigator.userAgent.match (/ Android / i))) {if (документ .cookie.indexOf ("iphone_redirect = false") == -1) window.location = " m.espn.go.com/wireless/?iphone&i=COMR ";
Jeevs

1
Не забувайте, що користувацькі агенти можуть бути змінені, підроблені та можуть не відображати поточний браузер. Якщо говорити про те, що якщо клієнт підробляє / змінює свій UserAgent, а ви відображаєте неправильний вигляд, це їх власна вина. Існують інші способи, крім чистого користувацького агента, хоча користувальницький агент, як правило, є коренем усього виявлення. Тут є справді хороший (хоча застарілий) приклад github.com/ahand/mobileesp?files=1
Ніко

Розумний - ніколи про це не думав: D
Зоряний пил

22

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

if( screen.width <= 480 ) {
    location.href = '/mobile.html';
}

Рядок агента користувача - це також місце для пошуку. Однак попереднє рішення все-таки краще, оскільки навіть якщо якийсь химер пристрій не реагує належним чином на користувача-агента, ширина екрану не відповідає.

Єдиним винятком тут є планшетні ПК, такі як ipad. Ці пристрої мають вищу ширину екрану, ніж смартфони, і я б, мабуть, вибрав для них рядок користувача-агента.


Правильно !! Мені потрібно лише виявити iPhone або Android. Отже, це не повинно бути проблемою, але лише для того, щоб повідомити, що у мене немає абсолютно нічого для початку. Створити фіктивну веб-сторінку та вставити її! Також як перевірити виявлення? Чи потрібно мені переносити сценарій на телефон?
Jeevs

13
Боже, як змінилася ширина екрану;)
Джош Ное

15
if(navigator.userAgent.match(/iPad/i)){
 //code for iPad here 
}

if(navigator.userAgent.match(/iPhone/i)){
 //code for iPhone here 
}


if(navigator.userAgent.match(/Android/i)){
 //code for Android here 
}



if(navigator.userAgent.match(/BlackBerry/i)){
 //code for BlackBerry here 
}


if(navigator.userAgent.match(/webOS/i)){
 //code for webOS here 
}

це найкраще і найчистіше рішення
eluleci

2
Незважаючи на те, що цей код не буде виконувати більше одного блоку, оскільки він перевіряє одне і те знову і знову, цей код повинен використовувати блоки else-if з цієї причини. Крім того, що робити, якщо змінна агента користувача якось змінюється між блоками? Тут буде виконано більше 1 блоку.
Джейк Міллінгтон,

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

8
var isMobileDevice = navigator.userAgent.match(/iPad|iPhone|iPod/i) != null 
    || screen.width <= 480;

2
+1 для відповідності регулярних виразів, що дозволяє користувачам легко перевіряти наявність декількох пристроїв за один постріл. Однак я хотів би додати для наочності, що, оскільки ви позначаєте / i в кінці регулярного виразу для нечутливого збігу, насправді немає потреби в верблюді відмінювати параметри пошуку. Наступне було б еквівалентним (а також пошук пристроїв Android): .match (/ ipad | iphone | ipod | android / i)
Russ

6

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

@media handheld, only screen and (max-width: 560px), only screen and (max-device-width: 480px)  {
    #hoofdcollumn {margin: 10px 5%; width:90%}
}

Сподіваюся, це допомагає!


5

я використовую mobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent)


5

Тож я зробив це. Дякую вам всім!

<head>
<script type="text/javascript">
    function DetectTheThing()
    {
       var uagent = navigator.userAgent.toLowerCase();
       if (uagent.search("iphone") > -1 || uagent.search("ipad") > -1 
       || uagent.search("android") > -1 || uagent.search("blackberry") > -1
       || uagent.search("webos") > -1)
          window.location.href ="otherindex.html";
    }
</script>

</head>

<body onload="DetectTheThing()">
VIEW NORMAL SITE
</body>

</html>

5

Оскільки зараз 2015 рік, якщо ви натрапили на це питання, то, мабуть, ви повинні використовувати window.matchMedia (і, якщо це все ще 2015 рік, полізаповнення для старих браузерів):

if (matchMedia('handheld').matches) {
    //...
} else {
    //...
}

Це не спрацювало для мене на Nexus 5 під управлінням Firefox.
Рафаель

2
Примітка з MDN Примітка: CSS2.1 та Media Queries 3 визначили кілька додаткових типів носіїв (tty, tv, проекція, кишеньковий, брайлівський, рельєфний, звуковий), але вони застаріли в Media Queries 4 і не повинні використовуватися.
PaulCo

Дивіться мою відповідь нижче, чомусь кишеньковий пристрій для мене теж не працює.
PeterS

3

Ви можете використовувати рядок агента користувача, щоб виявити це.

var useragent = navigator.userAgent.toLowerCase();

if( useragent.search("iphone") )
    ; // iphone
else if( useragent.search("ipod") )
    ; // ipod
else if( useragent.search("android") )
    ; // android
etc

Ви можете знайти список рядків useragent тут http://www.useragentstring.com/pages/useragentstring.php


3

Раджу перевірити 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), і ви зможете робити такі речі:

WURFL.complete_device_name

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

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


"Ви можете користуватися цими послугами безкоштовно, доки ваш веб-сайт є загальнодоступним і не вимагає плати або платної підписки для доступу". - web.wurfl.io/#wurfl-js
Exel Gamboa

2

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

JS буде виконуватися під час завантаження сторінки, і ви можете робити на робочому столі певні речі при завантаженні сторінки, наприклад, приховувати сканер штрих-коду.

   <!DOCTYPE html>
    <html>
    <head>
     <script type="text/javascript">

            /*
            * Hide Scan button if Page is loaded in Desktop Browser
            */
            function hideScanButtonForDesktop() {

                if (!(/Android|webOS|iPhone|iPad|iPod|BlackBerry|BB|PlayBook|IEMobile|Windows Phone|Kindle|Silk|Opera Mini/i.test(navigator.userAgent))) {

                    // Hide scan button for Desktop
                    document.getElementById('btnLinkModelScan').style.display = "none";
                }         
            }

            //toggle scanButton for Desktop on page load
            window.onload = hideScanButtonForDesktop;
        </script>
    </head>

1

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

наприклад:

// var userAgent = navigator.userAgent.toLowerCase(); // this would actually get the user agent

var userAgent = "iphone"; /* Simulates User Agent for iPhone */
if (userAgent.indexOf('iphone') != -1) {
   // some code here
}

!!~userAgent.indexOf('iphone') // >> true|false
Коді,

1

Виявлення пристрою на основі користувацького агента - не дуже хороше рішення, краще виявити такі функції, як сенсорний пристрій (у новому jQuery вони видаляють $.browserі використовують $.supportзамість цього).

Щоб виявити мобільний телефон, ви можете перевірити наявність сенсорних подій:

function is_touch_device() {
  return 'ontouchstart' in window // works on most browsers 
      || 'onmsgesturechange' in window; // works on ie10
}

Взято з Який найкращий спосіб виявити пристрій із сенсорним екраном за допомогою JavaScript?


Голосуйте проти, оскільки ОП просить мобільний пристрій. На сьогоднішній день для ноутбуків із сенсорним екраном „Сенсорний пристрій“ - не дуже вдале рішення.
TheBrenny

Ноутбуки @thebrenny - це чуваки для мобільних пристроїв, їх легко перенести з місця на місце
bluejayke

О, хлопче, у мене було кілька ноутбуків, які є досить марними, якщо бути портативними! 🙃 Але в будь-якому випадку, OP надав iPhone, iPad та Android як приклади того, що вони хотіли виявити, а „mobile” - це скорочення від „mobile phone”. Ймовірно, кращий опис був би "без клавіатури"
TheBrenny

0

Це моя версія, дуже схожа на верхню, але, на мою думку, це добре для довідки.

if (mob_url == "") {
  lt_url = desk_url;
} else if ((useragent.indexOf("iPhone") != -1 || useragent.indexOf("Android") != -1 || useragent.indexOf("Blackberry") != -1 || useragent.indexOf("Mobile") != -1) && useragent.indexOf("iPad") == -1 && mob_url != "") {
  lt_url = mob_url;
} else {
  lt_url = desk_url;
}

0

Просто використовуйте DeviceDetection

deviceDetection.deviceType // phone | tablet according to device

Ви працюєте на них? Це буквально щойно використано користувальницький агент
bluejayke

0

Інша можливість - використовувати mobile-detect.js . Спробуйте демо .

Використання браузера:

<script src="mobile-detect.js"></script>
<script>
    var md = new MobileDetect(window.navigator.userAgent);
    // ... see below
</script>

Node.js / Express:

var MobileDetect = require('mobile-detect'),
    md = new MobileDetect(req.headers['user-agent']);
// ... see below

Приклад:

var md = new MobileDetect(
    'Mozilla/5.0 (Linux; U; Android 4.0.3; en-in; SonyEricssonMT11i' +
    ' Build/4.1.A.0.562) AppleWebKit/534.30 (KHTML, like Gecko)' +
    ' Version/4.0 Mobile Safari/534.30');

// more typically we would instantiate with 'window.navigator.userAgent'
// as user-agent; this string literal is only for better understanding

console.log( md.mobile() );          // 'Sony'
console.log( md.phone() );           // 'Sony'
console.log( md.tablet() );          // null
console.log( md.userAgent() );       // 'Safari'
console.log( md.os() );              // 'AndroidOS'
console.log( md.is('iPhone') );      // false
console.log( md.is('bot') );         // false
console.log( md.version('Webkit') );         // 534.3
console.log( md.versionStr('Build') );       // '4.1.A.0.562'
console.log( md.match('playstation|xbox') ); // false

Але як це працює саме
bluejayke

0

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

var is_handheld = 0; // просто глобальний if (window.DeviceOrientationEvent) {is_handheld = 1;}

З огляду на це, на сторінці також слід пропонувати ручний вибір між мобільним / настільним макетом. Я отримав 1920 * 1080, і я можу збільшувати масштаб - надто спрощений та зменшений функціональний шматок wordpressoid не завжди є гарною річчю. Особливо примусовуючи макет на основі виявлення неробочого пристрою - це відбувається постійно.


0

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

var result = window.matchMedia("(any-pointer:coarse)").matches;

Це покаже вам, потрібно вам показувати предмети наведення або ні, а також будь-що інше, що вимагає фізичного вказівника. Тоді розмір можна зробити для подальших запитів медіа на основі ширини.

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

https://patrickhlauke.github.io/touch/touchscreen-detection/

Збіги медіа підтримуються з 2015 року, і ви можете перевірити сумісність тут: https://caniuse.com/#search=matchMedia

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


Якщо ви намагаєтесь визначити, чи показувати елементи наведення, чи не слід використовувати (hover)замість цього медіа-запит ?
SpoonMeiser

@SpoonMeiser Я маю на увазі те, що навіть якщо пристрій підтримує наведення, мені потрібен пристрій, який може навести. Якщо у мене немає вказівника, я не можу навести курсор.
PeterS

Наведення вказівника IIUC означає, що основний вхідний пристрій підтримує наведення, яке вказівник не робить, а сенсорний екран ні,
SpoonMeiser

0

Подібно до декількох відповідей вище. Ця проста функція дуже добре працює для мене. Станом на 2019 рік

function IsMobileCard()
{
var 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;   
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.