Как лучше всего обнаружить мобильное устройство?

Есть ли способ определить, использует ли пользователь мобильное устройство в jQuery? Что-то похожее на атрибут CSS @media? Я хотел бы запустить другой сценарий, если браузер находится на портативном устройстве.

Я не ищу функцию jQuery $.browser.


person Community    schedule 18.08.2010    source источник
comment
Укажите мобильный URL-адрес специально для мобильных устройств. Именно так большинство крупных сайтов работают с мобильными устройствами. См. m.google.com.   -  person meagar    schedule 18.08.2010
comment
jQuery не делает и не может делать все. Он обеспечивает кроссбраузерный обход и манипулирование DOM, простую анимацию и AJAX между браузерами, а также создает каркасную структуру для надстроек надстройки. Пожалуйста, помните об ограничениях jQuery, прежде чем спрашивать конкретно о решении jQuery.   -  person Yi Jiang    schedule 22.08.2010
comment
Я только что заметил, что Modernizr поддерживает CSS3, например Media Queries: modernizr.com/docs/#mq   -  person Bart    schedule 11.08.2011
comment
Пользовательские агенты постоянно перемещаются цели, всем, кто читает этот пост, следует очень осторожно относиться к сниффингу пользовательских агентов.   -  person Rob    schedule 09.01.2012
comment
Что такое «мобильное» устройство? Это устройство с поддержкой сенсорного ввода (включая Chrome Pixels и ноутбуки с Windows 8 с мышами)? Это устройство с маленьким экраном (а как насчет iPad с сетчаткой)? Это устройство с медленным процессором? Или устройство с медленным интернет-соединением? В зависимости от того, что вы хотите сделать, ответ на этот вопрос будет разным. Настроить целевое разрешение экрана или сенсорное управление несложно. Если вы хотите обслуживать меньший контент или менее интенсивный JS для некоторых устройств, то серебряной пули нет. Проверьте соединение window.navigator.connection и вернитесь к (неприятному, плохому, опрометчивому) сниффингу userAgent. Мои 2 цента.   -  person David Gilbertson    schedule 09.07.2013
comment
@DavidGilbertson Почему медленное интернет-соединение делает его мобильным устройством? Насколько вам известно, я мог бы использовать спутниковое подключение к Интернету (например, Google Loon) для своей домашней сети.   -  person Cole Johnson    schedule 19.08.2013
comment
@ ColeCole9Johnson Моя точка зрения в точности. «Мобильный», кажется, используется как общий термин для сенсорного экрана, медленного процессора, медленной сети и маленького экрана. Но ни одно из этих предположений не является идеальным. Я считаю, что рассмотрение каждого из них по отдельности приведет к лучшему продукту, чем разработка с использованием некоего расплывчатого понятия «мобильный». Поэтому я задаю этот вопрос ОП.   -  person David Gilbertson    schedule 20.08.2013
comment
@DavidGilbertson: для меня мобильные устройства - это телефоны, плееры iPod и все, что действительно помещается в вашем кармане. Нетбук (если вы помните, что это такое) не является мобильным, потому что вы не можете поместить его в карман. Он портативный, но не мобильный.   -  person Cole Johnson    schedule 20.08.2013
comment
@DavidGilbertson Я бы классифицировал мобильное устройство как нечто, не предназначенное для работы в качестве полнофункционального ПК (например, Windows, OSX или бесчисленные дистрибутивы Linux). Я знаю, что граница становится довольно размытой из-за двойной загрузки Ubuntu Mobile и Linux на устройствах Android, но различие обычно легче всего сделать с помощью ОС, работающей на устройстве (Android не является полнофункциональной ОС для настольных ПК, а Windows 8 - вообще не мобильный).   -  person Isiah Meadows    schedule 19.01.2014
comment
Я думаю, что интерактивные мультимедийные функции здесь являются решением. (См. мой ответ на этот аналогичный вопрос)   -  person Danield    schedule 16.03.2017
comment
используйте cdn https://cdnjs.cloudflare.com/ajax/libs/jquery-browser/0.1.0/jquery.browser.js, тогда в вашем коде, где вы хотите проверить мобильность, просто используйте $.browser.mobile, он вернет true, если текущее устройство является мобильным. Для проверки на настольном компьютере используйте $.browser.desktop   -  person Laksh Goel    schedule 19.01.2018
comment
Вместо того, чтобы пытаться обнаружить мобильное устройство, я бы попытался обнаружить небольшой размер экрана. В конце концов, вы хотите оптимизировать размер экрана, верно?   -  person Elijah Mock    schedule 05.12.2019
comment
Дайте угадаю, проблема на самом деле не в том, чтобы определить, находится ли пользователь на мобильном устройстве, а в том, чтобы определить элементы макета на странице? Думаю, ширина / высота дадут самые надежные решения.   -  person Bitterblue    schedule 06.01.2020
comment
Я прокрутил все ответы, и ни один из них не кажется правильным. Как это возможно? все еще нет решения?   -  person Dimitri Kopriwa    schedule 28.04.2020
comment
@DimitriKopriwa TL; DR: let isMobile = /mobi/i.test(navigator.userAgent);   -  person Andrew    schedule 23.02.2021


Ответы (59)


Примечание редактора: метод обнаружения пользовательских агентов не рекомендуется для современных веб-приложений. См. Комментарии под этим ответом для подтверждения этого факта. Предлагается использовать один из других ответов, используя обнаружение функций и / или медиа-запросы.


Вместо использования jQuery вы можете использовать простой JavaScript для его обнаружения:

if( /Android|webOS|iPhone|iPad|Mac|Macintosh|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {
 // some code..
}

Или вы можете объединить их оба, чтобы сделать его более доступным через jQuery ...

$.browser.device = (/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(navigator.userAgent.toLowerCase()));

Теперь $.browser вернет "device" для всех вышеперечисленных устройств.

Примечание. $.browser удален в jQuery v1.9.1 . Но вы можете использовать это, используя плагин миграции jQuery Код


Более подробная версия:

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;
}
person Community    schedule 22.08.2010
comment
Спасибо Вам за Ваш вклад! Обратите внимание: | Mac | Macintosh следует удалить из первой функции, если вы пытаетесь обнаружить мобильный телефон. RE: if (/ Android | webOS | iPhone | iPad | Mac | Macintosh | iPod | BlackBerry | IEMobile | Opera Mini / i.test (navigator.userAgent)) {// некоторый код ..} - person ViviDVasT; 07.07.2021

Для меня маленькое - это прекрасно, поэтому я использую эту технику:

В файле CSS:

/* Smartphones ----------- */
@media only screen and (max-width: 760px) {
  #some-element { display: none; }
}

В файле jQuery / JavaScript:

$( document ).ready(function() {      
    var is_mobile = false;

    if( $('#some-element').css('display')=='none') {
        is_mobile = true;       
    }

    // now I can use is_mobile to run javascript conditionally

    if (is_mobile == true) {
        //Conditional script here
    }
 });

Моя цель заключалась в том, чтобы мой сайт был удобен для мобильных устройств. Поэтому я использую CSS Media Queries, чтобы отображать / скрывать элементы в зависимости от размера экрана.

Например, в моей мобильной версии я не хочу активировать Facebook Like Box, потому что он загружает все эти изображения профиля и прочее. А это плохо для мобильных посетителей. Итак, помимо скрытия элемента контейнера, я также делаю это внутри блока кода jQuery (см. Выше):

if(!is_mobile) {
    (function(d, s, id) {
        var js, fjs = d.getElementsByTagName(s)[0];
        if (d.getElementById(id)) return;
        js = d.createElement(s); js.id = id;
        js.src = "//connect.facebook.net/pt_PT/all.js#xfbml=1&appId=210731252294735";
        fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));
}

Вы можете увидеть это в действии на http://lisboaautentica.com.

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

Обновление от dekin88

Для обнаружения медиа есть встроенный JavaScript API. Вместо того, чтобы использовать вышеуказанное решение, просто используйте следующее:

$(function() {      
    let isMobile = window.matchMedia("only screen and (max-width: 760px)").matches;

    if (isMobile) {
        //Conditional script here
    }
 });

Поддерживает браузер: http://caniuse.com/#feat=matchmedia

Преимущество этого метода заключается в том, что он не только проще и короче, но и в том, что при необходимости вы можете условно настроить таргетинг на разные устройства, такие как смартфоны и планшеты, по отдельности, без добавления каких-либо фиктивных элементов в DOM.

person Community    schedule 28.04.2012
comment
-1 Свойство screen.width является глобальным. Нет необходимости произвольно добавлять элемент в DOM и без необходимости вводить медиа-запросы CSS. Кроме того, если браузер находится на рабочем столе и пользователь изменяет размер окна, $is_mobile не будет обновляться. - person merv; 09.11.2012
comment
Почему бы и нет: if( screen.width <= 480 ) { // is mobile } - person andrewrjones; 20.01.2013
comment
Вы только что заново изобрели window.matchMedia: developer.mozilla.org/en -US / docs / Web / API / Window.matchMedia - person Paul Irish; 26.02.2014

Согласно Mozilla - обнаружение браузера с помощью пользовательского агента:

Таким образом, мы рекомендуем искать строку «Mobi» в любом месте пользовательского агента, чтобы обнаружить мобильное устройство.

Нравится:

if (/Mobi/.test(navigator.userAgent)) {
    // mobile!
}

Это будет соответствовать всем распространенным пользовательским агентам мобильных браузеров, включая мобильные Mozilla, Safari, IE, Opera, Chrome и т. Д.

Обновление для Android

EricL рекомендует также тестировать Android в качестве пользовательского агента в виде строки пользовательского агента Chrome для планшетов не включает "Mobi" (однако версии для телефонов включают):

if (/Mobi|Android/i.test(navigator.userAgent)) {
    // mobile!
}
person Community    schedule 06.07.2014
comment
В связанной статье упоминается: Если устройство достаточно велико, чтобы на нем не было пометки «Mobi», вам следует обслуживать свой сайт для настольных компьютеров (который, как рекомендуется, в любом случае должен поддерживать сенсорный ввод, так как все больше настольных компьютеров появляются с сенсорные экраны). - person Daniel Hanrahan; 09.06.2016

Простой и эффективный однострочник:

function isMobile() { return ('ontouchstart' in document.documentElement); }

Однако приведенный выше код не учитывает случай для ноутбуков с сенсорным экраном. Таким образом, я предоставляю вторую версию, основанную на решении @Julian:

function isMobile() {
  try{ document.createEvent("TouchEvent"); return true; }
  catch(e){ return false; }
}
person Community    schedule 29.11.2013
comment
А как насчет ноутбуков на Windows с сенсорным экраном? - person Chris Cinelli; 27.12.2013
comment
Вторая предоставленная вами isMobile функция возвращает true на моем устройстве destop !! (Google Chrome версии 44.0) - person Luke; 22.08.2015
comment
Это больше похоже на метод isTouchSupported, а не на обнаружение мобильных устройств. - person Barkermn01; 01.05.2016
comment
Не все мобильные телефоны имеют сенсорные экраны. - person Andrew; 04.05.2017

То, что вы делаете, желая обнаружить мобильное устройство, слишком близко подходит к концепции «обнюхивания браузера». ИМО. Вероятно, было бы намного лучше сделать обнаружение некоторых функций. В этом могут помочь такие библиотеки, как http://www.modernizr.com/.

Например, где проходит грань между мобильным и немобильным? С каждым днем ​​он становится все более и более размытым.

person Community    schedule 18.08.2010
comment
тем не менее, пользователь может захотеть использовать jquery mobile для этих устройств, независимо от поддерживаемых функций. - person Sirber; 28.10.2011
comment
Например, моя проблема с мобильным немобильным устройством - это мои функции одновременного нажатия клавиш, у меня настроен JS, чтобы отключить эти функции, просто нужно определить - person Sam Sussman; 22.12.2011
comment
+1 за последний балл! Клиенты на портативных и настольных устройствах с каждым днем ​​становятся все более похожими. - person Filip Dupanović; 27.02.2012
comment
Тем не менее, если вы хотите предложить загружаемое приложение для конкретного устройства, это может быть полезно. - person Bastes; 25.05.2012
comment
Это зависит от ситуации, я ищу что-то, что скажет мне, использует ли пользователь мобильное устройство, чтобы я мог отключить некоторые тяжелые анимации на основе JavaScript. Обнюхивание UA было бы гораздо более подходящим, чем попытка «обнаружить» возможности производительности JavaScript в браузере пользователя. - person Rick Suggs; 01.06.2012
comment
Вот пример использования: вы можете обнаруживать устройства Android, поэтому при ссылке на APK вы показываете QR-код на устройствах, отличных от Android, но загружаемое изображение на Android (поскольку нет смысла показывать QR-код на устройстве Android. ). - person Timmmm; 04.11.2012
comment
Мобильные и немобильные - это очень большое различие, просто использовать обнаружение функций глупо, когда вы пытаетесь обслуживать взаимодействия / пользовательский интерфейс для мобильных / настольных компьютеров. Лично мне хотелось бы, чтобы был простой (и надежный) способ получить ОС, в которой работает текущий браузер. - person nbsp; 25.01.2013
comment
Modernizr идеально подходит для таких вещей, как отключение css: hovers на устройствах, поддерживающих сенсорный ввод. Обнюхивание UA - это взлом. Но мы все, вероятно, сделали это в какой-то момент. - person Chris Beck; 02.05.2014
comment
Мобильные устройства всегда отображают все в полноэкранном режиме, по крайней мере, в подавляющем большинстве случаев (я уверен, что есть исключения). - person JVE999; 17.06.2014
comment
Мы использовали Modernizr.touch для обнаружения мобильных устройств. В Windows 10 включен сенсорный ввод. Это больше не работает (в 2017 году)! - person wrtsprt; 20.01.2017

Это не jQuery, но я нашел это: http://detectmobilebrowser.com/

Он предоставляет сценарии для обнаружения мобильных браузеров на нескольких языках, одним из которых является JavaScript. Это может помочь вам с тем, что вы ищете.

Однако, поскольку вы используете jQuery, вы можете знать о коллекции jQuery.support. Это набор свойств для определения возможностей текущего браузера. Документация находится здесь: http://api.jquery.com/jQuery.support/

Поскольку я не знаю, чего именно вы пытаетесь достичь, я не знаю, какие из них будут наиболее полезными.

Все, что было сказано, я думаю, что лучше всего либо перенаправить, либо написать другой сценарий для вывода, используя язык на стороне сервера (если это вариант). Поскольку вы на самом деле не знаете возможностей мобильного браузера x, выполнение логики обнаружения и изменения на стороне сервера было бы наиболее надежным методом. Конечно, все это спорный вопрос, если вы не можете использовать язык на стороне сервера :)

person Community    schedule 18.08.2010
comment
который не поддерживает iPad. Для поддержки iPad ищите ip (hone | od) и | ad - например, ip (hone | od | ad) - person Jayson Ragasa; 15.07.2012
comment
Я только что попробовал javascript с detectmobilebrowser.com/, и он НЕ работает для iPad. - person Milche Patern; 07.06.2013
comment
@MilchePatern это потому, что скрипт неисправен, используйте iPad вместо ipad, тогда он работает, у меня была проблема на моей вкладке Samsung, пришлось использовать Android iso android :) - person Coen Damen; 18.06.2013
comment
Там ЕСТЬ версия jQuery, и она отлично работает, но для обнаружения планшета вы должны добавить |android|ipad|playbook|silk, как описано в разделе о (это задумано) - person cprcrack; 03.08.2013
comment
Ну да, планшет - это не мобильный. Сайт называется dectect мобильных браузеров. - person Felix Eve; 22.01.2015
comment
@FelixEve планшет ЯВЛЯЕТСЯ мобильным устройством, это просто не смартфон, поэтому его нужно обнаружить. Если вы выполняете анимацию с интенсивным использованием процессора в JS, как это делаю я, вам необходимо отфильтровать все мобильные устройства, смартфоны и планшеты. - person Ricardo Nunes; 20.03.2015
comment
@RicardoNunes: в моем случае мне нужно было обнаружить устройства, которые могут звонить по телефону, поэтому планшеты меня не интересовали. В идеале я бы использовал обнаружение функций, однако это не реально возможно на всех устройствах в настоящий момент. - person Felix Eve; 23.03.2015
comment
Это не работает, если вы используете Chrome на своем смартфоне, будет определять его как рабочий стол. - person monteirobrena; 15.09.2015
comment
это работает очень хорошо и точно, если вы используете мобильные дополнения с их страницы О НАС. - person Snickbrack; 29.03.2016
comment
он проверяет размер экрана !! не работает правильно! - person Moshtaba Darzi; 18.01.2021

Иногда желательно знать устройство какой марки использует клиент, чтобы показывать контент, относящийся к этому устройству, например ссылку на магазин iPhone или рынок Android. Modernizer великолепен, но показывает вам только возможности браузера, такие как HTML5 или Flash.

Вот мое решение UserAgent в jQuery для отображения разных классов для каждого типа устройства:

/*** sniff the UA of the client and show hidden div's for that device ***/
var customizeForDevice = function(){
    var ua = navigator.userAgent;
    var checker = {
      iphone: ua.match(/(iPhone|iPod|iPad)/),
      blackberry: ua.match(/BlackBerry/),
      android: ua.match(/Android/)
    };
    if (checker.android){
        $('.android-only').show();
    }
    else if (checker.iphone){
        $('.idevice-only').show();
    }
    else if (checker.blackberry){
        $('.berry-only').show();
    }
    else {
        $('.unknown-device').show();
    }
}

Это решение от Graphics Maniacs http://graphicmaniacs.com/note/detecting-iphone-ipod-ipad-android-and-blackberry-browser-with-javascript-and-php/

person Community    schedule 09.06.2011
comment
Это прекрасно работает. Мне нужно было отключить функцию jQuery, которая запускается при прокрутке при использовании телефона iPad или Android, и, поскольку разные устройства имеют разную ширину экрана, это было простое решение. Благодаря тонну. - person Eric Allen; 15.09.2011
comment
Единственная проблема с использованием теста Android - это то, что насчет укромного уголка, который использует пользовательский агент Android. - person MayorMonty; 25.05.2014
comment
Хороший ответ, который показывает, что нам не обязательно быть фундаменталистами в области обнаружения функций. - person Fernando; 09.01.2015

Нашел решение в: http://www.abeautifulsite.net/blog/2011/11/detecting-mobile-devices-with-javascript/.

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);
    },
    any: function() {
        return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows());
    }
};

А затем, чтобы убедиться, что это мобильный телефон, вы можете протестировать, используя:

if(isMobile.any()) {
   //some code...
}
person Community    schedule 21.11.2012
comment
Решение, основанное на пользовательском агенте, работает хорошо, когда вы можете быть уверены, что подстрока напрямую связана с типом устройства. то есть iPad = iPad. Однако сейчас существует так много различных типов устройств (более 25 000), что этот подход недостаточно точен для большинства бизнес-целей. Я основал проект с открытым исходным кодом 51Degrees.com, чтобы предоставить надежную и надежную альтернативу. Он будет работать в JavaScript, а также на стороне сервера. Вся документация здесь ... 51degrees.com/support/documentation - person James Rosewell; 04.06.2015
comment
Я использовал и выше, и он работал у меня хорошо, но теперь он не работает для Android 5.1 и выше, изменилось ли что-нибудь в Android 5.1 и выше? - person Imran Qamer; 21.10.2016
comment
if (isMobile.Android ()) {document.getElementById (myAnchor) .setAttribute (href, google.com); } - person Amranur Rahman; 23.01.2019

Если под «мобильным телефоном» вы подразумеваете «маленький экран», я использую это:

var windowWidth = window.screen.width < window.outerWidth ?
                  window.screen.width : window.outerWidth;
var mobile = windowWidth < 500;

На iPhone у вас будет window.screen.width равное 320. На Android вы получите window.outerWidth равное 480 (хотя это может зависеть от Android). iPad и планшеты Android будут возвращать числа, например 768, поэтому они будут видеть все, как вы хотите.

person Community    schedule 11.05.2012
comment
почему недостаточно window.screen.width? Похоже, вы берете меньшее из «window.screen.width» или «window.outerWidth». Почему вас волнует "outerWidth"? Заранее спасибо за ответ! - person user1330974; 12.11.2014

Вы не можете полагаться на navigator.userAgent, не каждое устройство показывает свою настоящую ОС. В моем HTC, например, это зависит от настроек (включение / выключение "с помощью мобильной версии"). На http://my.clockodo.com мы просто использовали screen.width для обнаружения небольших устройств. К сожалению, в некоторых версиях Android есть ошибка с screen.width. Вы можете комбинировать этот способ с userAgent:

if(screen.width < 500 ||
 navigator.userAgent.match(/Android/i) ||
 navigator.userAgent.match(/webOS/i) ||
 navigator.userAgent.match(/iPhone/i) ||
 navigator.userAgent.match(/iPod/i)) {
alert("This is a mobile device");
}
person Community    schedule 08.07.2011
comment
Многие мобильные телефоны имеют ширину ›1000, особенно в альбомном режиме. - person oriadam; 02.12.2015

В одной строке javascript:

var isMobile = ('ontouchstart' in document.documentElement && /mobi/i.test(navigator.userAgent);

Если пользовательский агент содержит «Mobi» (согласно MDN) и доступен ontouchstart, то, скорее всего, это мобильное устройство.

РЕДАКТИРОВАТЬ: обновляет код регулярного выражения в ответ на отзывы в комментариях. Использование regex/mobi/i i делает его нечувствительным к регистру, а mobi соответствует всем мобильным браузерам. См. https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox

person Community    schedule 28.09.2015
comment
пришлось /Mobi/.test(navigator.userAgent) ... match не сделал этого для меня - person BananaAcid; 11.04.2020
comment
Вот регулярное выражение JavaScript, которое обнаружит все мобильные устройства, включая устройства с идентификатором устройства в строке UA [(User-Agent)]: /mobi/i i делает его нечувствительным к регистру, а mobi соответствует всем мобильным браузерам. developer.mozilla.org/en-US/ docs / Web / HTTP / Headers / User-Agent / - person Andrew; 23.02.2021
comment
На мой взгляд, это лучший ответ: let isMobile = /mobi/i.test(navigator.userAgent); - person Andrew; 23.02.2021

Если вы используете Modernizr, использовать Modernizr.touch, как упоминалось ранее, очень просто.

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

var deviceAgent = navigator.userAgent.toLowerCase();

var isTouchDevice = Modernizr.touch || 
(deviceAgent.match(/(iphone|ipod|ipad)/) ||
deviceAgent.match(/(android)/)  || 
deviceAgent.match(/(iemobile)/) || 
deviceAgent.match(/iphone/i) || 
deviceAgent.match(/ipad/i) || 
deviceAgent.match(/ipod/i) || 
deviceAgent.match(/blackberry/i) || 
deviceAgent.match(/bada/i));

if (isTouchDevice) {
        //Do something touchy
    } else {
        //Can't touch this
    }

Если вы не используете Modernizr, вы можете просто заменить указанную выше функцию Modernizr.touch на ('ontouchstart' in document.documentElement)

Также обратите внимание, что тестирование пользовательского агента iemobile предоставит вам более широкий диапазон обнаруженных мобильных устройств Microsoft, чем Windows Phone.

См. также этот вопрос SO

person Community    schedule 26.06.2013
comment
И то же самое в Dart: TouchEvent.supported. - person Kai Sellgren; 02.08.2013
comment
('ontouchstart' in window) также является альтернативой Modernizr.touch, hacks.mozilla.org/2013/04/ - person JVE999; 17.06.2014
comment
Думаю, modernizr - отличное решение! - person Bobby Russell; 12.11.2015
comment
Вам действительно следует использовать RegEx | вместо множества совпадений. Вам также не нужен toLowerCase(), потому что у вас есть модификатор i. Здесь: var isTouchDevice = Modernizr.touch || /iphone|ipod|ipad|android|iemobile|iphone|ipad|ipod|blackberry|bada/i.test(navigator.userAgent); - person oriadam; 02.12.2015

Я знаю, что на этот вопрос есть много ответов, но из того, что я видел, никто не подходит к ответу так, как я бы это решил.

CSS использует ширину (запросы мультимедиа), чтобы определить, какие стили применяются к веб-документу на основе ширины. Почему бы не использовать ширину в JavaScript?

Например, в медиа-запросах Bootstrap (Mobile First) существует 4 точки привязки / останова:

  • Очень маленькие устройства имеют размер 768 пикселей и ниже.
  • Малые устройства имеют диапазон от 768 до 991 пикселей.
  • Средние устройства имеют диапазон от 992 до 1199 пикселей.
  • Большие устройства имеют разрешение 1200 пикселей и выше.

Мы также можем использовать это, чтобы решить нашу проблему с JavaScript.

Сначала мы создадим функцию, которая получает размер окна и возвращает значение, которое позволяет нам видеть устройство какого размера просматривает наше приложение:

var getBrowserWidth = function(){
    if(window.innerWidth < 768){
        // Extra Small Device
        return "xs";
    } else if(window.innerWidth < 991){
        // Small Device
        return "sm"
    } else if(window.innerWidth < 1199){
        // Medium Device
        return "md"
    } else {
        // Large Device
        return "lg"
    }
};

Теперь, когда у нас настроена функция, мы можем вызвать ее и сохранить значение:

var device = getBrowserWidth();

Ваш вопрос был

Я хотел бы запустить другой сценарий, если браузер находится на портативном устройстве.

Теперь, когда у нас есть информация об устройстве, все, что осталось, - это оператор if:

if(device === "xs"){
  // Enter your script for handheld devices here 
}

Вот пример на CodePen: http://codepen.io/jacob-king/pen/jWEeWG < / а>

person Community    schedule 08.12.2015
comment
Это сработало лучше всего для меня. Поскольку я использовал начальную загрузку для некоторых мобильных страниц пересылки, этот метод хорошо работал для автоматического перенаправления с немобильной пересылки (без начальной загрузки) на страницу начальной загрузки. Совет: я обнаружил одну небольшую проблему в инструментах IE11 F12: у меня была включена эмуляция в F12 Dev Tools для мобильного устройства, и у меня возникли проблемы с определением размера окна. Я изменил его размер ниже точки останова xs, но он определил его как md. Как только я отключил эмуляцию телефона и обновил страницу, он правильно определил размер, и в моем коде я перенаправлялся на страницу начальной загрузки. - person Jeff Mergler; 29.02.2016
comment
То есть искал какое-то время. Спасибо! - person DmitryBoyko; 23.02.2017
comment
@JacobKing, вы сказали Small Devices range from 768 to 991 pixels., это означает, что он должен быть window.innerWidth < 992 (включая 991) то же самое для 1199, вместо этого должно быть ‹1200 - person medBouzid; 02.10.2017

Я удивлен, что никто не указал на хороший сайт: http://detectmobilebrowsers.com/ На нем есть готовый код. на разных языках для мобильного обнаружения (включая, помимо прочего):

  • Apache
  • ASP
  • C#
  • IIS
  • JavaScript
  • NGINX
  • PHP
  • Perl
  • Python
  • Рельсы

А если вам нужно также обнаружить планшеты, просто проверьте раздел «О программе», чтобы найти дополнительный параметр RegEx.

Планшеты Android, iPad, Kindle Fires и PlayBook не распознаются конструкцией. Чтобы добавить поддержку планшетов, добавьте |android|ipad|playbook|silk в первое регулярное выражение.

person Community    schedule 08.10.2013
comment
Для меня это сработало, не могли бы вы уточнить, какой код вы используете и в чем проблема? - person Maksim Luzik; 29.04.2014
comment
эта страница является ответом, из всех остальных ответов скопируйте и вставьте эту страницу - person Rubén Ruíz; 17.03.2018
comment
Вероятно, они не обновлены (хотя я не проверял это), поскольку, когда я его посетил, на сайте написано: Regex обновлено: 1 августа 2014 года. - person Greg; 16.07.2020

Если вас не особенно беспокоят маленькие дисплеи, вы можете использовать определение ширины / высоты. Таким образом, если ширина меньше определенного размера, мобильный сайт будет отображаться. Возможно, это не идеальный способ, но его, вероятно, будет проще всего обнаружить для нескольких устройств. Возможно, вам потребуется установить специальный для iPhone 4 (большое разрешение).

person Community    schedule 18.08.2010

Если обнаружено, что простая проверка navigator.userAgent не всегда надежна. Большей надежности можно добиться, также проверив navigator.platform. Кажется, что простая модификация предыдущего ответа работает лучше:

if (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) ||
   (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.platform))) {
    // some code...
}
person Community    schedule 24.01.2013
comment
Не допускается произвольное отклонение ответа без оставления комментария. В лучшем случае это грубо. - person Mark; 01.04.2018

Чтобы добавить дополнительный уровень контроля, я использую хранилище 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
    mobile = ['iphone','ipad','android','blackberry','nokia','opera mini','windows mobile','windows phone','iemobile','tablet','mobi']; 
    var ua=navigator.userAgent.toLowerCase();
    for (var i in mobile) if (ua.indexOf(mobile[i]) > -1) return true;

    // nothing found.. assume desktop
    return false;
}
person Community    schedule 18.04.2013
comment
ваше предположение, основанное на localStorage, довольно интересно, можете ли вы предоставить ряд поддерживаемых устройств или браузеров, которые правильно соответствуют вашему сценарию? Меня интересует решение на этот вопрос я задал, и попытка обнаружить браузеры мобильных планшетов действительно может быть интересным обходным путем. - person Gruber; 01.06.2013

Советую вам проверить http://wurfl.io/

Вкратце, если вы импортируете крошечный файл JavaScript:

<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.is_mobile) {
    //dostuff();
}

Это то, что вы ищете.

Отказ от ответственности: я работаю в компании, которая предлагает эту бесплатную услугу.

person Community    schedule 11.03.2014
comment
Wurfl не смог обнаружить nexus7 и iPad mini! - person Jacob; 03.04.2014
comment
Что-то не так с Nexus 7. Вы уверены, что Nexus не подставил строку UA в настройках? Что касается iPad mini, да, его очень сложно отличить от других iPad, но он все равно был признан iPad, не так ли? Это вы проголосовали против моего сообщения? - person Luca Passani; 03.04.2014
comment
Нет, ipad mini был определен как настольное устройство - person Jacob; 03.04.2014

Отличный ответ, спасибо. Небольшое улучшение для поддержки Windows Phone и Zune:

if (navigator.userAgent.match(/Android/i) ||
  navigator.userAgent.match(/webOS/i) ||
  navigator.userAgent.match(/iPhone/i) ||
  navigator.userAgent.match(/iPad/i) ||
  navigator.userAgent.match(/iPod/i) ||
  navigator.userAgent.match(/BlackBerry/) ||
  navigator.userAgent.match(/Windows Phone/i) ||
  navigator.userAgent.match(/ZuneWP7/i)
) {
  // some code
  self.location = "top.htm";
}
person Community    schedule 26.02.2012
comment
Я бы сказал, что это самое простое (возможно, не лучшее) исправление, если вы пытаетесь обрабатывать события наведения / перетаскивания для мобильных устройств. Я использую что-то подобное, чтобы создать логическое значение isMobile, которое затем проверяется для каждого события наведения / наведения курсора мыши. Во всяком случае, это мои два цента. Добавление дополнительных js-библиотек или кода, требующего взаимодействия с пользователем, не имеет для меня особого смысла; поправьте меня, если я ошибаюсь. - person MeanMatt; 01.03.2012
comment
Поскольку вы используете регулярные выражения, на самом деле используйте их: if (navigator.userAgent.match(/Android|webOS|iPhone|iPad|etc/)){self.location = "top.htm"} - person foobarbecue; 11.08.2019

Вы можете использовать медиа-запрос, чтобы с ним легко справиться.

isMobile = function(){
    var isMobile = window.matchMedia("only screen and (max-width: 760px)");
    return isMobile.matches ? true : false
}
person Community    schedule 26.06.2018
comment
Мне нравится такой подход, я поднял window.matchMedia("(pointer:coarse)").matches; из другого ответа. - person Jason Lydon; 13.02.2020
comment
Это мой предпочтительный подход, поскольку меня волнует размер экрана / области просмотра, а не то, является ли устройство мобильным, поскольку мы знаем, что размеры мобильных устройств сильно различаются, а окна браузера можно сделать очень маленькими даже на больших мониторах. Имея это в виду, лучшим именем могло бы быть isSmallScreen, но это только мое предпочтение. - person Christopher King; 04.12.2020

Посмотрите этот пост, он дает действительно хороший фрагмент кода что делать при обнаружении сенсорных устройств или что делать при вызове события touchstart:

$(function(){
  if(window.Touch) {
    touch_detect.auto_detected();
  } else {
    document.ontouchstart = touch_detect.surface;
  }
}); // End loaded jQuery
var touch_detect = {
  auto_detected: function(event){
    /* add everything you want to do onLoad here (eg. activating hover controls) */
    alert('this was auto detected');
    activateTouchArea();
  },
  surface: function(event){
    /* add everything you want to do ontouchstart here (eg. drag & drop) - you can fire this in both places */
    alert('this was detected by touching');
    activateTouchArea();
  }
}; // touch_detect
function activateTouchArea(){
  /* make sure our screen doesn't scroll when we move the "touchable area" */
  var element = document.getElementById('element_id');
  element.addEventListener("touchstart", touchStart, false);
}
function touchStart(event) {
  /* modularize preventing the default behavior so we can use it again */
  event.preventDefault();
}
person Community    schedule 22.12.2011
comment
'ontouchstart' in document.documentElement, вероятно, лучший тест на поддержку сенсорного экрана, чем window.Touch. Еще лучше использовать Modernizr.js (modernizr.com), потому что мы много думали, пытаясь правильно определить касание. Вы можете увидеть их код обнаружения касания в modernizr.com/downloads/modernizr.js, если вы просмотрите код разработки и поиск на ощупь. - person robocat; 13.09.2012
comment
Обнаружение касания доставило мне неприятности, потому что некоторые новые ноутбуки с Windows 8 обнаруживают сенсорные экраны в Chrome, что приводит к странным результатам. - person JWarner; 02.05.2014

Вот функция, которую вы можете использовать, чтобы получить истинный / ложный ответ о том, используете ли вы мобильный браузер. Да, это анализ браузера, но иногда это именно то, что вам нужно.

function is_mobile() {
    var agents = ['android', 'webos', 'iphone', 'ipad', 'blackberry'];
    for(i in agents) {
        if(navigator.userAgent.match('/'+agents[i]+'/i')) {
            return true;
        }
    }
    return false;
}
person Community    schedule 06.10.2011
comment
Это не сможет обнаружить многие мобильные браузеры, особенно мобильный Chrome. Он также, вероятно, потерпит неудачу в некоторых из: Opera Mobile, Firefox для мобильных устройств, Opera Mini, различных популярных китайских мобильных браузерах и т. Д. - person robocat; 13.09.2012
comment
Для этого не нужно for! + Вы забыли создать RegExp. Вот вариант попроще: return !!navigator.userAgent.match(new RegExp(agents.join('|'),'i')) - person oriadam; 02.12.2015

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

Чтобы обнаружить мобильный телефон, вы можете проверить события касания:

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

Взято из Что такое лучший способ обнаружить устройство с сенсорным экраном с помощью JavaScript?

person Community    schedule 06.05.2014
comment
К сожалению, это ненадежно и в любом случае возвращает true на настольных ПК с сенсорными экранами. stucox.com/blog/you-cant-detect-a-touchscreen - person JustAMartin; 20.05.2014
comment
Не забудьте про ноутбуки с сенсорными экранами и полнофункциональным браузером. :-) - person Mike Kormendy; 13.07.2015
comment
Возможно, это не способ проверить, мобильное ли это устройство или нет, но, как указано в названии вашей функции, он идеально подходит для проверки устройств с сенсорным экраном. +1 от меня ;-) - person Kathara; 25.06.2019

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

Согласно документации Mozilla рекомендуется строка Mobi. Но некоторые из старых планшетов не возвращают истину, если используется только Mobi, поэтому мы также должны использовать строку Tablet.

Точно так же, на всякий случай, строки iPad и iPhone также могут использоваться для проверки типа устройства.

Большинство новых устройств возвращают true только для Mobi строки.

if (/Mobi|Tablet|iPad|iPhone/.test(navigator.userAgent)) {
    // do something
}
person Community    schedule 30.03.2017
comment
Мне пришлось добавить туда Android, чтобы работать с планшетами. Придется немного подправить, но мне нравится такой подход. - person Andy; 04.05.2017

Использовать этот:

/**  * jQuery.browser.mobile (http://detectmobilebrowser.com/)  * jQuery.browser.mobile will be true if the browser is a mobile device  **/ (function(a){jQuery.browser.mobile=/android.+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|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|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|e\-|e\/|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|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|xda(\-|2|g)|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))})(navigator.userAgent||navigator.vendor||window.opera);

Тогда используйте это:

if(jQuery.browser.mobile)
{
   console.log('You are using a mobile device!');
}
else
{
   console.log('You are not using a mobile device!');
}
person Community    schedule 06.06.2013

Простая функция на основе http://detectmobilebrowser.com/

function isMobile() {
    var a = 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|phone)|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));
}
person Community    schedule 11.03.2014

Я знаю этот старый вопрос, и на него много ответов, но я думаю, что эта функция проста и поможет обнаружить все мобильные, планшетные и компьютерные браузеры, она работает как шарм.

function Device_Type() 
{
    var Return_Device; 
    if(/(up.browser|up.link|mmp|symbian|smartphone|midp|wap|phone|android|iemobile|w3c|acs\-|alav|alca|amoi|audi|avan|benq|bird|blac|blaz|brew|cell|cldc|cmd\-|dang|doco|eric|hipt|inno|ipaq|java|jigs|kddi|keji|leno|lg\-c|lg\-d|lg\-g|lge\-|maui|maxo|midp|mits|mmef|mobi|mot\-|moto|mwbp|nec\-|newt|noki|palm|pana|pant|phil|play|port|prox|qwap|sage|sams|sany|sch\-|sec\-|send|seri|sgh\-|shar|sie\-|siem|smal|smar|sony|sph\-|symb|t\-mo|teli|tim\-|tosh|tsm\-|upg1|upsi|vk\-v|voda|wap\-|wapa|wapi|wapp|wapr|webc|winw|winw|xda|xda\-) /i.test(navigator.userAgent))
    {
        if(/(tablet|ipad|playbook)|(android(?!.*(mobi|opera mini)))/i.test(navigator.userAgent)) 
        {
            Return_Device = 'Tablet';
        }
        else
        {
            Return_Device = 'Mobile';
        }
    }
    else if(/(tablet|ipad|playbook)|(android(?!.*(mobi|opera mini)))/i.test(navigator.userAgent)) 
    {
        Return_Device = 'Tablet';
    }
    else
    {
        Return_Device = 'Desktop';
    }

    return Return_Device;
}
person Community    schedule 18.04.2017

<script>
  function checkIsMobile(){
      if(navigator.userAgent.indexOf("Mobile") > 0){
        return true;
      }else{
        return false;
      }
   }
</script>

Если вы перейдете в любой браузер и попытаетесь получить navigator.userAgent, мы получим информацию о браузере примерно так:

Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit / 537.36 (KHTML, например, Gecko) Chrome / 64.0.3282.186 Safari / 537.36

То же самое, если вы сделаете это на мобильном телефоне, вы получите подписчиков

Mozilla / 5.0 (Linux; Android 8.1.0; Pixel Build / OPP6.171019.012) AppleWebKit / 537.36 (KHTML, например Gecko) Chrome / 61.0.3163.98 Mobile Safari / 537.36

В каждом мобильном браузере будет агент пользователя со строкой, содержащей "Mobile". Поэтому я использую приведенный выше фрагмент в своем коде, чтобы проверить, является ли текущий пользовательский агент веб-или мобильным. По результату внесу необходимые изменения.

person Community    schedule 01.03.2018

Я использую это

if(navigator.userAgent.search("mobile")>0 ){
         do something here
}
person Community    schedule 01.05.2012

Как насчет mobiledetect.net?

Другие решения кажутся слишком простыми. Это легкий PHP-класс. Он использует строку User-Agent в сочетании с определенными заголовками HTTP для обнаружения мобильной среды. Вы также можете воспользоваться Mobile Detect, используя любой из сторонних плагинов, доступных для: WordPress, Drupal, Joomla, Magento и т. Д.

person Community    schedule 21.04.2015
comment
Потому что вопрос задан по jQuery? - person Craicerjack; 10.04.2018
comment
насколько точен скрипт PHP? это что-то более точное, чем обнаружение на стороне клиента? - person oldboy; 13.11.2020

Это мой код, который я использую в своих проектах:

function isMobile() {
 try {
    if(/Android|webOS|iPhone|iPad|iPod|pocket|psp|kindle|avantgo|blazer|midori|Tablet|Palm|maemo|plucker|phone|BlackBerry|symbian|IEMobile|mobile|ZuneWP7|Windows Phone|Opera Mini/i.test(navigator.userAgent)) {
     return true;
    };
    return false;
 } catch(e){ console.log("Error in isMobile"); return false; }
}
person Community    schedule 26.08.2013

Кажется, это комплексное современное решение:

https://github.com/matthewhudson/device.js

Он определяет несколько платформ, смартфоны и планшеты, а также ориентацию. Он также добавляет классы к тегу BODY, поэтому обнаружение происходит только один раз, и вы можете узнать, на каком устройстве вы находитесь, с помощью простой серии функций jQuery hasClass.

Проверить это ...

[ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я не имею ничего общего с человеком, который это написал.]

person Community    schedule 05.05.2014
comment
+1 за маленький и аккуратный device.js. Но я бы не стал называть это современным решением, в его основе лежит пользовательский агент сниффинг. Я бы также не назвал это исчерпывающим, с другой стороны, ua-parser. - person Anthony Hatzopoulos; 13.09.2014

Я знаю, что это очень старый вопрос об этом виде обнаружения.

Мое решение основано на ширине скроллера (существует или нет).

// this function will check the width of scroller
// if scroller width is less than 10px it's mobile device

//function ismob() {
    var dv = document.getElementById('divscr');
    var sp=document.getElementById('res');
    if (dv.offsetWidth - dv.clientWidth < 10) {sp.innerHTML='Is mobile'; //return true; 
    } else {
    sp.innerHTML='It is not mobile'; //return false;
    }
//}
<!-- put hidden div on very begining of page -->
<div id="divscr" style="position:fixed;top:0;left:0;width:50px;height:50px;overflow:hidden;overflow-y:scroll;z-index:-1;visibility:hidden;"></div>
<span id="res"></span>

person Community    schedule 12.10.2019
comment
Мне нравится это решение, есть ли причина, по которой мы не должны его использовать? - person James; 27.01.2020
comment
Абсолютно блестящий! И это полностью кроссбраузерно. Спасибо! Изменить: лучше проверить (dv.offsetWidth - dv.clientWidth) == 0, потому что полоса прокрутки становится меньше 10 пикселей, если окно увеличивается, что имеет место в большинстве современных ноутбуков с высоким разрешением, но маленьким экраном (например, с разрешением 4k на 15,6-дюймовом экране) - person Ivan; 03.05.2020
comment
какое уникальное решение. я еще нигде такого не видел. Я вижу, что это вызывает проблемы, при которых полоса прокрутки скрыта (например, ::-webkit-scrollbar { display: none }), кто-нибудь еще это тестировал? - person oldboy; 13.11.2020
comment
@oldboy попробуй установить видимый scrollbar для div (id="divscr"). Я не использую хром и не хочу устанавливать его только для целей тестирования. Кто-нибудь? - person nelek; 05.01.2021

Экран может быть на рабочем столе с маленьким разрешением или на мобильном телефоне с широким разрешением, таким образом, объединяя два ответа, найденные здесь, в этом вопросе.

const isMobile = window.matchMedia("only screen and (max-width: 760px)");
if (/Mobi|Tablet|iPad|iPhone/i.test(navigator.userAgent) || isMobile.matches) {
    console.log('is_mobile')
}
person Community    schedule 18.08.2020

Вы также можете использовать скрипт на стороне сервера и установить из него переменные javascript.

Пример на php

загрузите http://code.google.com/p/php-mobile-detect/, а затем установите переменные javascript.

<script>
//set defaults
var device_type = 'desktop';
</script>

<?php
require_once( 'Mobile_Detect.php');
$detect = new Mobile_Detect();
?>

<script>
device_type="<?php echo ($detect->isMobile() ? ($detect->isTablet() ? 'tablet' : 'mobile') : 'desktop'); ?>";
alert( device_type);
</script>
person Community    schedule 18.07.2012

Я попробовал несколько способов, а затем решил заполнить список вручную и выполните простую проверку JS. И, в конце концов, пользователь должен подтвердить. Потому что некоторые проверки дали ложноположительный или отрицательный результат.

var isMobile = false;
if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Opera Mobile|Kindle|Windows Phone|PSP|AvantGo|Atomic Web Browser|Blazer|Chrome Mobile|Dolphin|Dolfin|Doris|GO Browser|Jasmine|MicroB|Mobile Firefox|Mobile Safari|Mobile Silk|Motorola Internet Browser|NetFront|NineSky|Nokia Web Browser|Obigo|Openwave Mobile Browser|Palm Pre web browser|Polaris|PS Vita browser|Puffin|QQbrowser|SEMC Browser|Skyfire|Tear|TeaShark|UC Browser|uZard Web|wOSBrowser|Yandex.Browser mobile/i.test(navigator.userAgent) && confirm('Are you on a mobile device?')) isMobile = true;

Теперь, если вы хотите использовать jQuery для установки CSS, вы можете сделать следующее:

$(document).ready(function() {
  if (isMobile) $('link[type="text/css"]').attr('href', '/mobile.css');
});

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

Что касается мобильной подвижности, я предлагаю вам подумать над идеей Йоава Барни:

if(typeof window.orientation !== 'undefined'){...}
person Community    schedule 02.09.2013
comment
Любое требуемое подтверждение пользователя для чего-то, что должно быть внутренним и никоим образом не беспокоить его, является трагедией для пользователя. - person mystrdat; 28.05.2014

Не следует доверять только строкам пользовательского агента. Приведенное ниже решение будет работать во всех ситуациях.

function isMobile(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)));
}

и вызовите эту функцию:

isMobile(navigator.userAgent || navigator.vendor || window.opera)
person Community    schedule 26.10.2016
comment
window.opera необходимо? что именно он делает? - person oldboy; 13.11.2020

Вы также можете обнаружить это, как показано ниже

$.isIPhone = function(){
    return ((navigator.platform.indexOf("iPhone") != -1) || (navigator.platform.indexOf("iPod") != -1));

};
$.isIPad = function (){
    return (navigator.platform.indexOf("iPad") != -1);
};
$.isAndroidMobile  = function(){
    var ua = navigator.userAgent.toLowerCase();
    return ua.indexOf("android") > -1 && ua.indexOf("mobile");
};
$.isAndroidTablet  = function(){
    var ua = navigator.userAgent.toLowerCase();
    return ua.indexOf("android") > -1 && !(ua.indexOf("mobile"));
};
person Community    schedule 16.03.2013

Также я рекомендую использовать крошечную библиотеку JavaScript Bowser, да нет r. Он основан на navigator.userAgent и довольно хорошо протестирован для всех браузеров, включая iPhone, Android и т. Д.

https://github.com/ded/bowser

Вы можете просто сказать:

if (bowser.msie && bowser.version <= 6) {
  alert('Hello China');
} else if (bowser.firefox){
  alert('Hello Foxy');
} else if (bowser.chrome){
  alert('Hello Silicon Valley');
} else if (bowser.safari){
  alert('Hello Apple Fan');
} else if(bowser.iphone || bowser.android){
  alert('Hello mobile');
}
person Community    schedule 13.02.2013

Добавление:

В некоторых версиях iOS 9.x Safari не представляет «iPhone» в navigator.userAgent, но показывает его в navigator.platform.

var isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent);
    if(!isMobile){
        isMobile=/iPhone|iPad|iPod/i.test(navigator.platform);
    }
person Community    schedule 28.01.2016

В зависимости от того, что вы хотите обнаруживать мобильные устройства (это означает, что это предложение не подойдет всем), вы можете добиться различий, посмотрев на разницу в миллисекундах onmouseenter-to-onclick, как я описал в этот ответ.

person Community    schedule 23.09.2018

Я использую это решение, и оно отлично работает на всех устройствах:

if (typeof window.orientation !== "undefined" || navigator.userAgent.indexOf('IEMobile') !== -1) {
   //is_mobile
}
person Community    schedule 03.03.2020
comment
Я обдумывал это, но потом подумал, когда пользователь запрашивает сайт рабочего стола из меню Chrome, это делается через строку User-Agent и больше не будет работать. - person Gaby_64; 15.05.2020

Вы могли бы сделать простую вещь очень просто вот так

(window.screen.width < 700) {
    //The device is a Mobile
} else {
    //The device is a Desktop
}
person Community    schedule 17.05.2020
comment
То, что размер окна просмотра ‹700, не делает устройство мобильным. - person sea26.2; 11.09.2020
comment
Спасибо, работает отлично. - person Grant; 11.05.2021
comment
@ sea26.2 Это правда. Однако для наших целей он на самом деле работает лучше, потому что мы хотим, чтобы наш javascript правильно взаимодействовал с нашими медиа-запросами CSS. - person Eliezer Berlin; 03.06.2021
comment
Разве этот код не предназначен для проверки портретной или альбомной ориентации? Или как мало пикселей вообще? Почему не if (window.screen.width < window.screen.height)? - person Typewar; 02.07.2021

var device = {
  detect: function(key) {
    if(this['_'+key] === undefined) {
      this['_'+key] = navigator.userAgent.match(new RegExp(key, 'i'));
    }
    return this['_'+key];
  },
  iDevice: function() {
    return this.detect('iPhone') || this.detect('iPod');
  },
  android: function() {
    return this.detect('Android');
  },
  webOS: function() {
    return this.detect('webOS');
  },
  mobile: function() {
    return this.iDevice() || this.android() || this.webOS();
  }
};

Я использовал что-то подобное в прошлом. Это похоже на предыдущий ответ, но технически более производительно, так как кэширует результат совпадения, особенно если обнаружение используется в анимации, событии прокрутки и т.п.

person Community    schedule 04.11.2011
comment
Зачем вам нужно вызывать этот код в событии анимации / прокрутки и т. Д.? - person reformed; 21.09.2017

http://www.w3schools.com/jsref/prop_nav_useragent.asp

Фильтр по названию платформы.

Ex:

x = $( window ).width();

platform = navigator.platform;

alert(platform);

if ( (platform != Ipad) || (x < 768) )  {


} 

^^

person Community    schedule 02.03.2015

Если под мобильным устройством вы понимаете сенсорный, то вы можете определить его, проверив наличие обработчиков касаний:

let deviceType = (('ontouchstart' in window)
                 || (navigator.maxTouchPoints > 0)
                 || (navigator.msMaxTouchPoints > 0)
                 ) ? 'touchable' : 'desktop';

jQuery для этого не нужен.

person Community    schedule 15.02.2018

Оформить заказ http://detectmobilebrowsers.com/, который предоставляет скрипт для обнаружения мобильного устройства на различных языках, включая

JavaScript, jQuery, PHP, JSP, Perl, Python, ASP, C #, ColdFusion и многие другие

person Community    schedule 05.11.2015

Вот еще одно предложение, реализованное на чистом JavaScript (es6)

const detectDeviceType = () =>
    /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)
        ? 'Mobile'
        : 'Desktop';

detectDeviceType();
person Community    schedule 23.02.2018
comment
абсолютно не нужна функция arrow-syntax. - person mrReiha; 23.07.2019

Использовал ранее упомянутый sequielo решение и добавлена ​​функция проверки ширины / высоты (чтобы избежать ошибки поворота экрана). Для выбора минимальных / максимальных границ для мобильного окна просмотра я использую этот ресурс https://www.mydevice.io/#compare-devices

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

function deviceType() {
    var width = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
    var height = Math.max(document.documentElement.clientHeight, window.innerHeight || 0),screenType;
    if (isMobile()){
        if ((width <= 650 && height <= 900) || (width <= 900 && height <= 650))
            screenType = "Mobile Phone";
        else
            screenType = "Tablet";
    }
    else
        screenType = "Desktop";
  return screenType;
}
person Community    schedule 27.09.2019
comment
есть ли причина пытаться создать событие касания вместо проверки существования touchstart? - person oldboy; 13.11.2020

Решение ES6, использующее несколько методов обнаружения в try/catch блоке

Эта функция состоит из создания TouchEvent, поиска поддержки для события ontouchstart или даже выполнения запроса к объекту mediaQueryList.

Намеренно, некоторые запросы, которые завершились ошибкой, вызовут новую ошибку, потому что, поскольку мы находимся в блоке try/catch, мы можем использовать его как запасной вариант, чтобы проконсультироваться с пользовательским агентом.

У меня нет тестов использования, и во многих случаях он может не работать, а также указывать на ложные срабатывания.

Его не следует использовать для какой-либо реальной проверки, но в общем объеме для анализа и статистики, когда объем данных может «простить» неточность, он все же может быть полезен.

const isMobile = ((dc, wd) => {
    // get browser "User-Agent" or vendor ... see "opera" property in `window`
    let ua = wd.userAgent || wd.navigator.vendor || wd.opera;
    try {
        /**
         * Creating a touch event ... in modern browsers with touch screens or emulators (but not mobile) does not cause errors.
         * Otherwise, it will create a `DOMException` instance
         */
        dc.createEvent("TouchEvent");

        // check touchStart event
        (('ontouchstart' in wd) || ('ontouchstart' in dc.documentElement) || wd.DocumentTouch && wd.document instanceof DocumentTouch || wd.navigator.maxTouchPoints || wd.navigator.msMaxTouchPoints) ? void(0) : new Error('failed check "ontouchstart" event');

        // check `mediaQueryList` ... pass as modern browsers
        let mQ = wd.matchMedia && matchMedia("(pointer: coarse)");
        // if no have, throw error to use "User-Agent" sniffing test
        if ( !mQ || mQ.media !== "(pointer: coarse)" || !mQ.matches ) {
            throw new Error('failed test `mediaQueryList`');
        }

        // if there are no failures the possibility of the device being mobile is great (but not guaranteed)
        return true;
    } catch(ex) {
        // fall back to User-Agent sniffing
        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(ua) || /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(ua.substr(0,4));
    }
})(document, window);


// to show result
let container = document.getElementById('result');

container.textContent = isMobile ? 'Yes, your device appears to be mobile' : 'No, your device does not appear to be mobile';
<p id="result"></p>


Регулярное выражение, используемое для тестирования пользовательского агента, немного устарело и было доступно на веб-сайте http://mobiledetect.com, который больше не работает.

Может быть, есть образец получше, но я не знаю.


Шрифты:


PS:

Поскольку нет возможности идентифицировать с точностью 100% ни путем проверки функций, ни путем изучения строки пользовательского агента с помощью регулярных выражений. Приведенный выше фрагмент кода следует рассматривать только как «еще один пример решения этой проблемы», а также как «не рекомендуется для использования в производственной среде».

person Community    schedule 10.04.2020
comment
Итак, что вы предлагаете использовать для реальной проверки? - person oldboy; 13.11.2020

Это все известные мне vaules. Пожалуйста, помогите обновить массив, если вам известны другие значения.

function ismobile(){
   if(/android|webos|iphone|ipad|ipod|blackberry|opera mini|Windows Phone|iemobile|WPDesktop|XBLWP7/i.test(navigator.userAgent.toLowerCase())) {
       return true;
   }
   else
    return false;
}
person Community    schedule 05.06.2016

Ты слишком много работаешь.

if (window.screen.availWidth <= 425) {
   // do something
}

Вы можете сделать это при загрузке страницы через JS. Не нужно писать длинные списки строк, чтобы все уловить. Упс, вы пропустили один! Затем вам нужно вернуться и изменить / добавить. Наиболее популярные размеры телефонов составляют около 425 в ширину или меньше (в портретном режиме), планшеты - около 700, а все, что больше, - это ноутбук, настольный компьютер или другое более крупное устройство. Если вам нужен мобильный ландшафтный режим, возможно, вам стоит работать в Swift или Android studio, а не в традиционном веб-кодировании.

Боковое примечание: возможно, это не было доступным решением, когда оно было опубликовано, но оно работает сейчас.

person Community    schedule 03.06.2020

Вот что я делаю:

function checkMobile() {
  var os = GetOS();
  if (os == "Android OS" || os == "iOS") {
     // do what you wanna do
     return true
  }
}

и для перенаправления я добавляю location.href = mobile.website.com, а затем добавляю этот тег тела

<body onload="checkMobile()"></body>
person Community    schedule 21.07.2020

Решение IE10 + просто с использованием matchMedia:

const isMobile = () => window.matchMedia('(max-width: 700px)').matches

isMobile() возвращает логическое значение

person Community    schedule 21.07.2021

Я делаю это для своих .NET-приложений.

На моей общей _Layout.cshtml странице я добавляю это.

@{
    var isMobileDevice = HttpContext.Current.Request.Browser.IsMobileDevice;
}

<html lang="en" class="@((isMobileDevice)?"ismobiledevice":"")">

Затем, чтобы проверить любую страницу вашего сайта (jQuery):

<script>
var isMobile = $('html').hasClass('ismobiledevice');
</script>
person Community    schedule 10.12.2015
comment
Боюсь, это не относится к jQuery. - person Andrew Lazarus; 08.01.2016

Просто скопируйте следующую функцию, и она вернет логическое значение. его регулярное выражение похоже на отмеченный ответ, но с некоторыми отличиями:

const isMobile = () =>
  /(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([46])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([ev])w|bumb|bw-([nu])|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do([cp])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-([mpt])|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c([- _agpst])|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac([ \-/])|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja([tv])a|jbro|jemu|jigs|kddi|keji|kgt([ /])|klon|kpt |kwc-|kyo([ck])|le(no|xi)|lg( g|\/([klu])|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([- ov])|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30([02])|n50([025])|n7(0([01])|10)|ne(([cm])-|on|tf|wf|wg|wt)|nok([6i])|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan([adt])|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([-01])|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([im])|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)
  );
person Community    schedule 26.04.2020

Если вы хотите протестировать пользовательский агент, правильный способ - протестировать пользовательский агент, то есть test navigator.userAgent.

Если user подделывает это, они не должны беспокоиться. Если вы test.isUnix(), вам не придется впоследствии беспокоиться о том, является ли система Unix.

Если вы меняете userAgent, это тоже нормально, но вы не ожидаете, что сайты будут отображаться правильно, если вы это сделаете.

Если вы хотите обеспечить поддержку браузеров Microsoft, вам следует убедиться, что первые несколько символов содержимого включены, и тестировать каждую страницу, которую вы пишете.

Итог ... Всегда кодируйте в соответствии со стандартами. Затем взламывайте его, пока он не заработает в текущей версии IE, и не ожидайте, что он будет хорошо выглядеть. Это то, что делает GitHub, и им только что дали 100 миллионов долларов.

person Community    schedule 14.07.2012

Использовать этот

if( screen.width <= 480 ) { 
    // is mobile 
}
person Community    schedule 06.06.2017
comment
... а что будет, если размер моего браузера на настольном компьютере меньше 480? В любом случае, почему 480. Я бы предположил, что есть телефоны, когда в альбомной ориентации ширина превышает 480. - person Liam; 02.08.2017

Грубый, но достаточный для ограничения загрузки больших ресурсов, таких как видеофайлы, на телефонах по сравнению с планшетами / настольными компьютерами - просто ищите небольшую ширину или высоту, чтобы покрыть обе ориентации. Очевидно, что если размер браузера настольного компьютера был изменен, приведенный ниже пример может ошибочно обнаружить телефон, но этого достаточно для моего случая использования.

Почему 480, bcs - вот что выглядит правильно, судя по информации, которую я нашел по размерам телефона.

if(document.body.clientWidth < 480 || document.body.clientHeight < 480) {
  //this is a mobile device
}
person Community    schedule 27.06.2019