Как создать функцию, которая определяет, использует ли пользователь мобильное устройство для просмотра?
Мне нужна функция, которая возвращает булево значение, указывающее, использует ли пользователь мобильный браузер. Хотя я понимаю, что для этого можно использовать navigator.userAgent с регулярными выражениями, меня беспокоит большое разнообразие строк user-agent на разных платформах и устройствах.
Существует ли комплексное решение или библиотека, которая надежно определяет мобильные браузеры? Я изучил некоторые существующие ресурсы, но реализации недостаточно понятны, чтобы я мог адаптировать их в простую функцию, возвращающую true/false.
Какой лучший подход для создания надежной функции определения мобильного браузера в JavaScript?
Для создания надежной функции определения мобильного браузера в JavaScript можно использовать либо регулярные выражения с navigator.userAgent, либо специализированные библиотеки, такие как mobile-detect.js или isMobile.js, которые обеспечивают более комплексное и надежное определение. Лучший подход зависит от ваших конкретных потребностей - простые шаблоны регулярных выражений подходят для базового определения, в то время как специализированные библиотеки предлагают большую точность и лучше обрабатывают крайние случаи, включая планшеты и различные мобильные браузеры на разных платформах.
Содержание
- Простая функция определения мобильных устройств
- Использование регулярных выражений
- Популярные библиотеки для определения мобильных устройств
- Примеры реализации
- Лучшие практики и рекомендации
- Продвинутые методы определения
Простая функция определения мобильных устройств
Создание базовой функции определения мобильных устройств может быть простым с использованием регулярных выражений. Вот простая реализация, которая возвращает true для мобильных устройств:
function isMobile() {
const regex = /Mobi|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i;
return regex.test(navigator.userAgent);
}
// Использование
if (isMobile()) {
console.log("Обнаружено мобильное устройство");
// Перенаправление на мобильную версию сайта или применение мобильных стилей
}
Эта функция использует комплексное регулярное выражение, которое соответствует большинству распространенных строк пользовательского агента мобильных устройств. Шаблон включает:
- Mobi - Общий идентификатор мобильных устройств
- Android - Устройства Android
- webOS - Устройства WebOS
- iPhone - Смартфоны Apple iPhone
- iPad - Планшеты Apple iPad
- iPod - Плееры Apple iPod
- BlackBerry - Устройства BlackBerry
- IEMobile - Internet Explorer Mobile
- Opera Mini - Браузер Opera Mini
Использование регулярных выражений
Регулярные выражения обеспечивают гибкий подход к определению мобильных устройств. Вот некоторые усовершенствованные шаблоны:
// Более комплексный шаблон регулярного выражения
function isMobileAdvanced() {
const regex = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|Tablet/i;
return regex.test(navigator.userAgent);
}
// Альтернативный подход - проверка ключевых слов мобильных устройств
function isMobileUserAgent() {
const userAgent = navigator.userAgent || navigator.vendor || window.opera;
return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent);
}
Как упоминается в обсуждении на Stack Overflow, эти шаблоны регулярных выражений были протестированы на различных мобильных браузерах и платформах для обеспечения надежности.
Популярные библиотеки для определения мобильных устройств
Для более надежного определения мобильных устройств рассмотрите использование специализированных библиотек:
mobile-detect.js
Библиотека mobile-detect.js является одним из самых комплексных решений:
<script src="https://cdn.jsdelivr.net/npm/mobile-detect@2.1.0/mobile-detect.min.js"></script>
const md = new MobileDetect(window.navigator.userAgent);
const isMobile = md.mobile() !== null;
// Проверка конкретных типов устройств
const isPhone = md.phone();
const isTablet = md.tablet();
const isDesktop = !md.mobile();
// Проверка конкретных операционных систем
const isIOS = md.os() === 'iOS';
const isAndroid = md.os() === 'AndroidOS';
Согласно документации библиотеки, mobile-detect.js использует комбинацию разбора пользовательского агента, определения возможностей и специфичных для устройства проверок для обеспечения точного определения.
isMobile.js
Библиотека isMobile.js предлагает более простой подход:
<script src="https://unpkg.com/is-mobile@1.0.0/isMobile.min.js"></script>
// Простое возвращение булевого значения
if (isMobile()) {
// Обнаружено мобильное устройство
}
// Более детальное определение
const deviceInfo = isMobile;
console.log(deviceInfo); // Возвращает подробную информацию об устройстве
UAParser.js
Для комплексного определения браузера и устройства, UAParser.js предоставляет обширную информацию:
const parser = new UAParser();
const result = parser.getResult();
const isMobileDevice = result.device.type === 'mobile' || result.device.type === 'tablet';
Примеры реализации
Базовая реализация
/**
* Определяет, использует ли пользователь мобильное устройство
* @returns {boolean} True, если обнаружено мобильное устройство, иначе false
*/
function isMobileDevice() {
// Проверка распространенных строк пользовательского агента мобильных устройств
const mobileRegex = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i;
return mobileRegex.test(navigator.userAgent);
}
// Пример использования
document.addEventListener('DOMContentLoaded', function() {
if (isMobileDevice()) {
document.body.classList.add('mobile-device');
// Применение мобильных стилей или функциональности
}
});
Продвинутая реализация с медиа-запросами
/**
* Определяет мобильные устройства с использованием нескольких методов для большей точности
* @returns {boolean} True, если обнаружено мобильное устройство
*/
function isMobileDeviceAdvanced() {
// Метод 1: Проверка пользовательского агента
const mobileRegex = /Mobi|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i;
const isMobileUA = mobileRegex.test(navigator.userAgent);
// Метод 2: Определение сенсорного экрана
const hasTouchScreen = 'ontouchstart' in window || navigator.maxTouchPoints > 0;
// Метод 3: Проверка размера экрана (опционально)
const isSmallScreen = window.innerWidth <= 768;
// Метод 4: CSS медиа-запросы (наиболее надежный)
const isMobileMQ = window.matchMedia('(max-width: 768px)').matches;
// Возвращает true, если любой метод указывает на мобильное устройство
return isMobileUA || (hasTouchScreen && isSmallScreen) || isMobileMQ;
}
// Использование
const deviceType = isMobileDeviceAdvanced() ? 'mobile' : 'desktop';
console.log('Тип устройства:', deviceType);
Использование mobile-detect.js в React-компоненте
import React, { useEffect, useState } from 'react';
import MobileDetect from 'mobile-detect';
const MobileDetector = ({ children }) => {
const [isMobile, setIsMobile] = useState(false);
useEffect(() => {
const md = new MobileDetect(window.navigator.userAgent);
setIsMobile(md.mobile() !== null);
}, []);
return children({ isMobile });
};
// Использование
<MobileDetector>
{({ isMobile }) => (
<div className={isMobile ? 'mobile-view' : 'desktop-view'}>
{/* Ваш контент здесь */}
</div>
)}
</MobileDetector>
Лучшие практики и рекомендации
Точность определения
При реализации определения мобильных устройств учитывайте следующие факторы:
-
Ограничения пользовательского агента: Как отмечено в обсуждении на Stack Overflow, строки пользовательского агента могут быть подделаны или неполными, поэтому полагаться исключительно на них не всегда надежно.
-
Определение планшетов: Решите, следует ли рассматривать планшеты как мобильные устройства. Большинство библиотек определения мобильных устройств включают планшеты в свое определение.
-
Постепенное улучшение: По возможности используйте определение возможностей вместо определения устройства.
Вопросы производительности
// Кэширование результата для избежания повторных вычислений
let mobileCache = null;
function isMobileCached() {
if (mobileCache === null) {
const regex = /Mobi|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i;
mobileCache = regex.test(navigator.userAgent);
}
return mobileCache;
}
Обработка ошибок
function isMobileSafe() {
try {
if (typeof navigator === 'undefined' || typeof navigator.userAgent === 'undefined') {
return false; // По умолчанию десктоп в серверных средах
}
const regex = /Mobi|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i;
return regex.test(navigator.userAgent);
} catch (error) {
console.error('Ошибка определения мобильного устройства:', error);
return false; // Безопасный сбой
}
}
Продвинутые методы определения
Использование CSS медиа-запросов
Наиболее надежный метод - использование CSS медиа-запросов:
function isMobileMediaQuery() {
return window.matchMedia('(max-width: 768px)').matches;
}
// Или более комплексное определение мобильных устройств
function isMobileDeviceMQ() {
return window.matchMedia('(max-width: 768px) and (pointer: coarse)').matches;
}
Определение сенсорного экрана
function isTouchDevice() {
return 'ontouchstart' in window ||
navigator.maxTouchPoints > 0 ||
navigator.msMaxTouchPoints > 0;
}
Определение ориентации устройства
function isMobileOrientation() {
return 'orientation' in window || 'orientation' in screen;
}
Комбинированная стратегия определения
/**
* Комплексное определение мобильных устройств с использованием нескольких методов
* @returns {object} Результаты определения устройства
*/
function detectDevice() {
const results = {
isMobile: false,
isTablet: false,
isPhone: false,
isDesktop: false,
isIOS: false,
isAndroid: false,
userAgent: navigator.userAgent || ''
};
// Определение по пользовательскому агенту
const mobileRegex = /Mobi|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i;
const iosRegex = /iPhone|iPad|iPod/i;
const androidRegex = /Android/i;
results.isMobile = mobileRegex.test(results.userAgent);
results.isIOS = iosRegex.test(results.userAgent);
results.isAndroid = androidRegex.test(results.userAgent);
// Определение по размеру экрана
const isSmallScreen = window.innerWidth <= 768;
const isMediumScreen = window.innerWidth > 768 && window.innerWidth <= 1024;
results.isTablet = results.isMobile && isMediumScreen;
results.isPhone = results.isMobile && isSmallScreen;
results.isDesktop = !results.isMobile;
return results;
}
// Использование
const device = detectDevice();
console.log('Информация об устройстве:', device);
Источники
- Официальная документация mobile-detect.js - Определение устройства (телефон, планшет, десктоп, мобильный рейтинг, ОС, версии)
- GitHub - kaimallea/isMobile: Простая JS библиотека для определения мобильных устройств
- Определение мобильных браузеров в JavaScript - Stack Overflow
- UAParser.js - Определение браузера, движка, ОС, CPU и типа/модели устройства
- Определение мобильных vs десктопных браузеров в JavaScript - Medium
- Браузерный детектор и парсер UserAgent - CSS Script
- GitHub - hgoebl/mobile-detect.js
- Как определить мобильное устройство с помощью JavaScript - DEV Community
- Определение мобильного устройства с помощью JavaScript (простые примеры) - Code Boxx
- Топ-10 примеров кода mobile-detect в Javascript - CloudDefense
Заключение
Создание надежной функции определения мобильного браузера требует баланса между точностью, производительностью и поддерживаемостью. Вот основные выводы:
-
Для простых задач: Используйте хорошо продуманный шаблон регулярного выражения, который соответствует распространенным строкам пользовательского агента мобильных устройств, как показано в примерах базовой реализации.
-
Для надежного определения: Используйте проверенные библиотеки, такие как mobile-detect.js или isMobile.js, которые обрабатывают крайние случаи и предоставляют более комплексную информацию об устройстве.
-
Для современных веб-приложений: Рассмотрите использование CSS медиа-запросов с JavaScript для наиболее точного определения устройства, поскольку этот подход менее подвержен подделке пользовательского агента.
-
Для наилучших результатов: Комбинируйте несколько методов определения (пользовательский агент, размер экрана, сенсорные возможности) для создания более надежного решения, которое работает в разных сценариях.
-
Помните: Определение мобильных устройств должно дополнять, а не заменять техники постепенного улучшения. Сосредоточьтесь на предоставлении функциональности, а не специфичных для устройства возможностей, когда это возможно.
Начните с простой реализации и постепенно улучшайте ее по мере возникновения конкретных проблем определения в вашем приложении. Библиотечные подходы предоставляют наиболее комплексное решение “из коробки”, давая вам гибкость для настройки логики определения по мере необходимости.