Estoy buscando una función que devuelva un valor booleano si el usuario tiene un navegador móvil o no.
Sé que puedo usar navigator.userAgent
y escribir esa función usando regex, pero los agentes de usuario son demasiado diferentes para diferentes plataformas. Dudo que coincida con todos los dispositivos posibles sería fácil, y creo que este problema se ha resuelto antes muchas veces, por lo que debería haber algún tipo de solución completa para dicha tarea.
Estaba mirando este sitio , pero lamentablemente el script es tan críptico que no tengo idea de cómo usarlo para mi propósito, que es crear una función que devuelva verdadero / falso.
Vary: User-Agent
a su respuesta, de lo contrario, los servidores proxy de almacenamiento en caché almacenarán una versión y la enviarán al otro tipo de navegador. PeroVary: User-Agent
hace que la respuesta no se pueda localizar en IE.Respuestas:
Usando Regex (de detectmobilebrowsers.com ):
Aquí hay una función que utiliza una expresión regular increíblemente larga y completa que devuelve un valor
true
ofalse
dependiendo de si el usuario está navegando o no con un dispositivo móvil.Para aquellos que deseen incluir tabletas en esta prueba (aunque podría decirse que no deberían), pueden usar la siguiente función:
La respuesta original
Puede hacer esto simplemente ejecutando una lista de dispositivos y comprobando si
useragent
coincide con algo así:Sin embargo, dado que cree que este método no es confiable, podría suponer que cualquier dispositivo que tuviera una resolución de 800x600 o menos también era un dispositivo móvil, lo que limita aún más su objetivo (aunque en la actualidad muchos dispositivos móviles tienen resoluciones mucho mayores que esta)
es decir
Referencia:
fuente
|android|ipad|playbook|silk
a la primera expresión regular.Qué tal si:
... ya que los teléfonos inteligentes generalmente admiten esta propiedad y los navegadores de escritorio no.
EDITAR: Como señaló @Gajus, esta solución ahora está en desuso y no debe usarse ( https://developer.mozilla.org/en-US/docs/Web/API/Window/orientation )
fuente
window.orientation
es una propiedad en desuso ( developer.mozilla.org/en-US/docs/Web/API/Window/orientation , compat.spec.whatwg.org/#dom-window-orientation ) que algunos navegadores móviles eligen admitir por razones desconocidas . Implementación de los mismos navegadoreswindow.screen.orientation
(que también se define en los navegadores de escritorio). Solo puedo suponer quewindow.orientation
se deja allí por razones heredadas y, por lo tanto, no se debe usar en nuevas aplicaciones.Cómo utilizar
Para verificar si el usuario está en un dispositivo móvil específico:
Ref: http://www.abeautifulsite.net/blog/2011/11/detecting-mobile-devices-with-javascript
Versión mejorada en github: https://github.com/smali-kazmi/detect-mobile-browser
fuente
any()
un for ... en bucle deisMobile
miembros ORed ?Aquí hay una solución simple de la fuente del tirachinas de Facebook
fuente
Vine aquí buscando una manera simple y limpia de detectar "dispositivos de pantallas táctiles", que clasifico como móviles y tabletas. No encontré una opción limpia en las respuestas actuales, pero resolvió lo siguiente que también puede ayudar a alguien.
Editar : para admitir escritorios con pantalla táctil y móviles al mismo tiempo, puede usar lo siguiente:
fuente
touchstart|end|etc
.navigator.maxTouchPoints
(sinms
prefijo). También hay un artículo de MDN para verificar.Como muchos han dicho, confiar en el objetivo móvil de los datos del agente de usuario es problemático. Lo mismo se puede decir para contar con el tamaño de la pantalla.
Mi enfoque está tomado de una técnica CSS para determinar si la interfaz es táctil:
Usando solo javascript (compatible con todos los navegadores modernos), una coincidencia de consulta de medios puede inferir fácilmente si el dispositivo es móvil .
fuente
Según el artículo de MDN sobre la detección del navegador utilizando el agente de usuario , se recomienda evitar este enfoque si es posible y sugerir otras vías, como la detección de funciones.
Sin embargo, si uno debe usar el agente de usuario como un medio para detectar si el dispositivo es móvil, sugieren:
Por lo tanto, este one-liner será suficiente:
const isMobileDevice = window.navigator.userAgent.toLowerCase().includes("mobi");
[ACTUALIZAR]:
Como @ zenw0lf sugiere en los comentarios, usar una expresión regular sería mejor:
const isMobileDevice = /Mobi/i.test(window.navigator.userAgent)
fuente
.includes
no soportado por IE-11Mobile
una cadena de agente de usuarioIf 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)
No existe una solución perfecta para detectar si el código JS se ejecuta en un navegador móvil, pero las siguientes dos opciones deberían funcionar en la mayoría de los casos.
Opción 1: rastreo del navegador
Este código de rastreo particular del navegador es el de una biblioteca llamada isMobile .
Opción 2: ventana.orientación
Prueba si
window.orientation
está definido:Nota
No todos los dispositivos con pantalla táctil son móviles y viceversa. Entonces, si desea implementar algo específicamente para la pantalla táctil, no debe probar si su navegador se ejecuta en un dispositivo móvil, sino más bien si los dispositivos son compatibles con la pantalla táctil:
fuente
window.orientation
solución, pero los documentos dicen que está en desuso. developer.mozilla.org/en-US/docs/Web/API/Window/orientationAquí hay una solución de UserAgent que es más eficiente que la coincidencia ...
fuente
/iphone|etc/i.test(navigator.userAgent)
Para agregar una capa adicional de control, uso el almacenamiento HTML5 para detectar si está usando almacenamiento móvil o almacenamiento de escritorio. Si el navegador no admite almacenamiento, tengo una matriz de nombres de navegador móvil y comparo el agente de usuario con los navegadores de la matriz.
Es bastante simple Aquí está la función:
fuente
sessionStorage.desktop
no existe en Safari, Chrome o Firefox (todas las versiones más recientes en el momento de la publicación). Sin embargo, obtiene un voto positivo, ya que su solución va en una mejor dirección que otras. Pero no olvides usar envar mobile =
lugar demobile =
.La detección de funciones es mucho mejor que tratar de averiguar en qué dispositivo se encuentra y es muy difícil mantenerse al día con los nuevos dispositivos que salen todo el tiempo, una biblioteca como Modernizr le permite saber si una función en particular está disponible o no.
fuente
¿Qué tal algo como esto?
fuente
screen.width
en su lugar? Me parece que es más confiable quewindow.matchMedia
.Una vez que el elemento gana el foco, lo desenfocas inmediatamente. Bootstrap-datepicker, que es un componente muy popular y bien mantenido con casi 10,000 estrellas en GitHub, utiliza este enfoque:
https://github.com/uxsolutions/bootstrap-datepicker
Gracias a Tigger por su ayuda.
fuente
Una forma realmente buena de detectar dispositivos móviles o tabletas es mirar si el navegador puede crear un evento táctil.
Código JavaScript simple:
Esto me funcionó muy bien, pero puede haber un problema con los dispositivos portátiles que incluyen una pantalla táctil.
No estoy seguro de si un portátil con pantalla táctil se detectará como dispositivo móvil porque aún no lo he probado.
fuente
Aquí está mi solución rediseñada para el problema. Aún no es perfecto. La única solución verdadera sería si los fabricantes de dispositivos comienzan a tomar en serio las cadenas de agente de usuario "Móvil" y "Tableta".
¿Qué sucede cuando la tableta Nexus 7 solo tiene la cadena UA de Android? Primero, el dispositivo móvil se vuelve verdadero, que más tarde la tableta también se hace realidad, pero la tableta eliminará la cadena UA móvil de la etiqueta del cuerpo.
CSS:
alert
Líneas agregadas para el desarrollo. La consola de Chrome puede emular muchos dispositivos de mano. Prueba allí.EDITAR:
Simplemente no use esto, use la detección de características en su lugar. Hay tantos dispositivos y marcas por ahí que apuntar a una marca NUNCA será la solución correcta.
fuente
Te aconsejo que revises http://wurfl.io/
En pocas palabras, si importa un pequeño archivo JS:
te quedará un objeto JSON que se parece a:
(eso supone que está utilizando un Nexus 7, por supuesto) y podrá hacer cosas como:
Esto es lo que estás buscando.
Descargo de responsabilidad: trabajo para la empresa que ofrece este servicio gratuito. Gracias.
fuente
aquí hay un trazador de líneas
fuente
Depende del caso de uso. Todos los dispositivos móviles requieren una batería. Si lo que buscas es calcular la potencia sin agotar la batería, utiliza la API de estado de la batería :
Si lo que está buscando es un uso de presentación
matchMedia
, que devuelve un valor booleano:O combínelos para una experiencia de usuario aún mejor en tabletas.
fuente
Aquí hay una solución ECMAScript 6 (compatible con TypeScript)
fuente
if
condición en lugar de tener toda estacheck
variable?Hay un simple truco para detectar si es un dispositivo móvil o no. Simplemente verifique si existe el evento ontouchstart :
fuente
Me he enfrentado a algunos escenarios donde las respuestas anteriores no funcionan para mí. Entonces se me ocurrió esto. Puede ser útil para alguien.
Depende de su caso de uso. Si se enfoca en el uso de la pantalla
screen.availWidth
, o puede usarlodocument.body.clientWidth
si desea renderizar en función del documento.fuente
Lo mejor debe ser:
Pero como dice Yoav Barnea ...
Después de estas 3 pruebas, espero que var isMobile sea ... ok
fuente
Aquí está la función completa
fuente
También puedes seguir este tutorial para detectar un móvil específico. Haga clic aquí .
fuente
Mobile
a su RX¿Qué pasa con el uso de "window.screen.width"?
o
¡Supongo que esta es la mejor manera porque hay un nuevo dispositivo móvil todos los días!
(aunque creo que no es tan compatible con los navegadores antiguos, pero pruébelo :))
fuente
Tenga en cuenta que la mayoría de los dispositivos móviles de nueva generación ahora tienen resoluciones superiores a 600x400. es decir, un iPhone 6 ...
Prueba de prueba: ejecutó las publicaciones más votadas y más recientes aquí, con una verificación opcional una vez que se ejecutó así:
De alguna manera, los siguientes resultados fueron devueltos en las siguientes aplicaciones de navegador. Especificaciones: iPhone 6S, iOS 10.3.1.
Safari (último): lo detectó como un móvil.
Chrome (último): no lo detectó como un dispositivo móvil.
Entonces, probé la sugerencia de Lanti ( https://stackoverflow.com/a/31864119/7183483 ), y arrojó los resultados adecuados (móvil para todos los dispositivos iOS y escritorio para mi Mac). Por lo tanto, procedí a editarlo un poco ya que se dispararía dos veces (tanto para móviles como para tabletas). Luego me di cuenta al probar en un iPad, que también regresó como un móvil, lo que tiene sentido, desde los parámetros que Lantiutiliza comprobar el sistema operativo más que nada. Por lo tanto, simplemente moví la declaración IF de la tableta dentro del cheque móvil, lo que devolvería el móvil es que el cheque de la tableta fue negativo y la tableta de lo contrario. Luego agregué la cláusula else para que el cheque móvil regrese como computadora de escritorio / portátil, ya que ambos califican, pero luego noté que el navegador detecta la marca de CPU y sistema operativo. Así que agregué lo que se devuelve allí como parte de la instrucción if if en su lugar. Para colmo, agregué una declaración de advertencia en caso de que no se detectara nada. Vea a continuación, se actualizará con una prueba en una PC con Windows 10 pronto.
Ah, y también agregué una variable 'debugMode', para cambiar fácilmente entre depuración y compilación normal.
Descargo de responsabilidad: crédito total a Lanti , también que esto no se probó en tabletas de Windows ... que podría devolver una computadora de escritorio / portátil, ya que el sistema operativo es puro Windows. Verificará una vez que encuentre un amigo que use uno.
fuente
Este es solo un puerto es6 de la respuesta aceptada que estoy usando en mi proyecto. Tenga en cuenta que esto también incluye tabletas.
fuente
Qué tal esto, se expande en la respuesta anterior pero también verifica el tamaño de la pantalla
fuente
Usando Regex (de detectmobilebrowsers.com ):
fuente
Esto también podría ser una solución.
Si usa ambos métodos, obtendrá una manera perfecta de detectar diferentes dispositivos.
fuente