Я ищу функцию, которая возвращает логическое значение, если у пользователя есть мобильный браузер или нет.
Я знаю, что могу использовать navigator.userAgent
и написать эту функцию с помощью регулярных выражений, но пользовательские агенты слишком различны для разных платформ. Я сомневаюсь, что сопоставить все возможные устройства было бы легко, и я думаю, что эта проблема была решена много раз, поэтому должно быть какое-то полное решение для такой задачи.
Я просматривал этот сайт , но, к сожалению, сценарий настолько загадочный, что я понятия не имею, как использовать его для своих целей, а именно для создания функции, возвращающей true / false.
Vary: User-Agent
к своему ответу, в противном случае кэширующие прокси сохранят одну версию и отправят ее в другой тип браузера. НоVary: User-Agent
делает ответ не кэшируемым в IE.Ответы:
Используя Regex (от detectmobilebrowsers.com ):
Вот функция, которая использует безумно длинный и всеобъемлющий регулярное выражение, которое возвращает значение
true
или вfalse
зависимости от того, просматривает ли пользователь мобильный телефон или нет.Для тех, кто хочет включить таблетки в этот тест (хотя, возможно, не стоит), вы можете использовать следующую функцию:
Оригинальный ответ
Вы можете сделать это, просто пропустив список устройств и проверив,
useragent
совпадает ли что- нибудь вроде этого:Однако, поскольку вы считаете, что этот метод ненадежен, можно предположить, что любое устройство с разрешением 800x600 или менее было также мобильным устройством, что еще больше сужает вашу цель (хотя в наши дни многие мобильные устройства имеют гораздо большие разрешения, чем эта)
т.е.
Ссылка:
источник
|android|ipad|playbook|silk
первое регулярное выражение.Как насчет:
... так как смартфоны обычно поддерживают это свойство, а настольные браузеры - нет.
РЕДАКТИРОВАТЬ: Как указал @Gajus, это решение устарело и не должно использоваться ( https://developer.mozilla.org/en-US/docs/Web/API/Window/orientation )
источник
window.orientation
является устаревшим свойством ( developer.mozilla.org/en-US/docs/Web/API/Window/orientation , compat.spec.whatwg.org/#dom-window-orientation ), которое некоторые мобильные браузеры предпочитают поддерживать по неизвестным причинам , Те же браузеры реализуютwindow.screen.orientation
(что определено и в настольных браузерах). Я могу только предположить, чтоwindow.orientation
он оставлен там по старым причинам и поэтому не должен использоваться в новых приложениях.Как пользоваться
Чтобы проверить, находится ли пользователь на определенном мобильном устройстве:
Ссылка: http://www.abeautifulsite.net/blog/2011/11/detecting-mobile-devices-with-javascript
Расширенная версия на github: https://github.com/smali-kazmi/detect-mobile-browser
источник
any()
for ... в циклеisMobile
членов ORed ?Вот простое решение из источника рогатки Facebook
источник
Пришел сюда в поисках простого и понятного способа обнаружения «устройств с сенсорными экранами», которые я классифицирую как мобильные и планшеты. Не нашел правильного выбора в текущих ответах, но выработал следующее, что также может кому-то помочь.
Изменить . Для одновременной поддержки настольных компьютеров с сенсорным экраном и мобильных телефонов вы можете использовать следующее:
источник
touchstart|end|etc
.navigator.maxTouchPoints
(безms
префикса). Есть также статья MDN, чтобы проверить.Как уже отмечалось, полагаться на движущуюся цель данных пользовательского агента проблематично. То же самое можно сказать и о размере экрана.
Мой подход заимствован из техники CSS, чтобы определить, является ли интерфейс сенсорным:
Использование только JavaScript (поддержка со всеми современными браузерами), медиа запросов матч можно легко сделать вывод , является ли устройство мобильным .
источник
Согласно статье MDN об обнаружении браузера с использованием пользовательского агента , рекомендуется избегать такого подхода, если это возможно, и предлагать другие способы, такие как обнаружение функций.
Тем не менее, если нужно использовать пользовательский агент в качестве средства обнаружения мобильного устройства, они предлагают:
Следовательно, этого однострочного будет достаточно:
const isMobileDevice = window.navigator.userAgent.toLowerCase().includes("mobi");
[ОБНОВИТЬ]:
Как подсказывает @ zenw0lf в комментариях, лучше использовать регулярное выражение:
const isMobileDevice = /Mobi/i.test(window.navigator.userAgent)
источник
.includes
не поддерживается IE-11Mobile
в строке агента пользователяIf 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).
const isMobile = /Mobi/.test(window.navigator.userAgent)
Не существует идеального решения для определения того, выполняется ли код JS в мобильном браузере, но в большинстве случаев должны работать следующие две опции.
Вариант 1: браузер нюхает
Этот конкретный код анализа браузера - это библиотека isMobile .
Вариант 2: оконная ориентация
Проверить, если
window.orientation
определено:Запись
Не все устройства с сенсорным экраном являются мобильными и наоборот. Итак, если вы хотите реализовать что-то специально для сенсорного экрана, вам следует не проверять, работает ли ваш браузер на мобильном устройстве, а проверять, есть ли на устройствах поддержка сенсорного экрана:
источник
window.orientation
решение, но в документах говорится, что оно устарело! developer.mozilla.org/en-US/docs/Web/API/Window/orientationВот решение userAgent, которое более эффективно, чем соответствие ...
источник
/iphone|etc/i.test(navigator.userAgent)
Чтобы добавить дополнительный уровень контроля, я использую хранилище HTML5, чтобы определить, использует ли оно мобильное хранилище или хранилище на рабочем столе. Если браузер не поддерживает хранилище, у меня есть массив имен мобильных браузеров, и я сравниваю пользовательский агент с браузерами в массиве.
Это довольно просто. Вот функция:
источник
sessionStorage.desktop
не существует ни в Safari, ни в Chrome, ни в Firefox (все новейшие версии на момент публикации). Тем не менее, вы получаете право голоса, поскольку ваше решение идет в лучшем направлении, чем другие. Но не забудьте использоватьvar mobile =
вместоmobile =
.Обнаружение функций намного лучше, чем попытка выяснить, на каком устройстве вы находитесь, и очень сложно постоянно следить за появлением новых устройств, библиотека вроде Modernizr позволяет узнать, доступна ли конкретная функция или нет.
источник
Как насчет этого?
источник
screen.width
вместо этого? Мне кажется, это надежнее, чемwindow.matchMedia
.Как только элемент получает фокус, вы сразу же стираете его. Bootstrap-datepicker, который является очень популярным и хорошо поддерживаемым компонентом с почти 10000 звезд в GitHub, использует этот подход:
https://github.com/uxsolutions/bootstrap-datepicker
Спасибо Тигру за помощь.
источник
Действительно хороший способ обнаружения мобильных или планшетных устройств - посмотреть, может ли браузер создать сенсорное событие.
Простой код JavaScript:
Это сработало для меня очень хорошо, но могут быть проблемы с ноутбуками, оснащенными сенсорным дисплеем.
Я не уверен, что ноутбук с сенсорным экраном будет обнаружен как мобильное устройство, потому что я еще не тестировал его.
источник
Вот мое переосмысленное решение проблемы. Все еще не идеально. Единственное верное решение было бы, если бы производители устройств начали серьезно относиться к строкам пользовательских агентов «Mobile» и «Tablet».
Что происходит, когда на планшете Nexus 7 есть только строка Android UA? Сначала Mobile становится истинным, затем позже Tablet также становится истинным, но Tablet удалит строку Mobile UA из тега body.
CSS:
alert
добавлены линии для развития. Консоль Chrome может эмулировать многие портативные устройства. Проверьте там.РЕДАКТИРОВАТЬ:
Просто не используйте это, используйте функцию обнаружения вместо этого. Существует так много устройств и брендов, что нацеленность на бренд НИКОГДА не будет правильным решением.
источник
Я советую вам проверить http://wurfl.io/
В двух словах, если вы импортируете крошечный файл JS:
у вас останется объект JSON, который выглядит следующим образом:
(это предполагает, что вы используете Nexus 7, конечно), и вы сможете делать такие вещи, как:
Это то, что вы ищете.
Отказ от ответственности: я работаю в компании, которая предлагает этот бесплатный сервис. Спасибо.
источник
вот один вкладыш
источник
Зависит от варианта использования. Все мобильные устройства требуют батареи. Если вы ищете вычислительную мощность без разряда батареи, используйте API состояния батареи :
Если вы ищете презентационное использование
matchMedia
, которое возвращает логическое значение:Или объедините их для еще большего удобства пользователей на планшетных устройствах.
источник
Вот решение ECMAScript 6 (готов к написанию TypeScript)
источник
if
условие вместо всей этойcheck
переменной?Существует простая хитрость, чтобы определить, является ли это мобильным устройством или нет. Просто проверьте, существует ли событие ontouchstart :
источник
Я сталкивался с некоторыми сценариями, где вышеупомянутые ответы не работают для меня. Итак, я придумал это. Может быть полезным для кого-то.
Это зависит от вашего варианта использования. Если вы сосредоточены на использовании экрана
screen.availWidth
, или вы можете использовать,document.body.clientWidth
если вы хотите сделать рендеринг на основе документа.источник
Лучшее должно быть:
Но, как говорит Йоав Барни ...
После этих 3 тестов, я надеюсь, что вар isMobile ... хорошо
источник
Вот он полная функция
источник
Также вы можете следовать этому руководству, чтобы обнаружить определенный мобильный телефон. Нажмите здесь .
источник
Mobile
в свой RXкак насчет использования "window.screen.width"?
или
Я думаю, это лучший способ, потому что каждый день появляется новое мобильное устройство!
(хотя я думаю, что это не поддерживается старыми браузерами, но попробуйте :))
источник
Обратите внимание, что большинство мобильных устройств нового поколения теперь имеют разрешение более 600x400. то есть айфон 6 ....
Доказательство теста: запускал самые последние и самые последние посты здесь, с необязательной проверкой после запуска, например так:
Каким-то образом следующие результаты были возвращены в следующих приложениях браузера. Технические характеристики: iPhone 6S, iOS 10.3.1.
Safari (последняя версия): обнаружен как мобильный.
Chrome (последний): не обнаружил его как мобильный.
Итак, я тогда протестировал предложение от Lanti ( https://stackoverflow.com/a/31864119/7183483 ), и оно вернуло правильные результаты (мобильные для всех устройств iOS и настольные для моего Mac). Поэтому я немного отредактировал его, поскольку он будет срабатывать дважды (как для мобильных устройств, так и для планшетов). Затем я заметил при тестировании на iPad, что он также вернулся как мобильный, что имеет смысл, так как параметры, которые Lantiпроверяет ОС больше всего на свете. Поэтому я просто переместил в планшетный чек инструкцию IF для мобильного чека, которая вернула бы мобильный, если проверка планшета была отрицательной, а для планшета - в противном случае. Затем я добавил условие else для мобильной проверки, чтобы он возвращался как настольный компьютер / ноутбук, так как оба соответствуют требованиям, но затем заметил, что браузер определяет марку процессора и ОС. Поэтому я добавил то, что возвращается туда как часть оператора if if. В довершение я добавил предостерегающее заявление else, если ничего не было обнаружено. См. Ниже, скоро будет обновление с тестом на ПК с Windows 10.
О, и я также добавил переменную 'debugMode', чтобы легко переключаться между отладкой и обычной компиляцией.
Отказ от ответственности: Полный кредит Lanti , а также то, что это не было проверено на планшетах Windows ..., которые могут вернуть настольный компьютер / ноутбук, так как ОС является чистой Windows. Проверю, как только найду друга, который его использует.
источник
Это всего лишь порт es6 принятого ответа, который я использую в своем проекте. Обратите внимание, что это также включает в себя таблетки.
источник
Как насчет этого, он расширяет ответ выше, но также проверяет размер экрана
источник
Используя Regex (от detectmobilebrowsers.com ):
источник
Это также может быть решением.
Если вы используете оба метода, вы получите отличный способ для обнаружения различных устройств.
источник