Estou procurando uma função que retorne valor booleano se o usuário tiver um navegador móvel ou não.
Eu sei que posso usar navigator.userAgent
e escrever essa função usando regex, mas os user-agents são muito variados para plataformas diferentes. Duvido que corresponder a todos os dispositivos possíveis seria fácil, e acho que esse problema já foi resolvido muitas vezes, portanto deve haver algum tipo de solução completa para essa tarefa.
Eu estava olhando para este site , mas, infelizmente, o script é tão enigmático que não tenho idéia de como usá-lo para o meu propósito, que é criar uma função que retorne verdadeiro / falso.
Vary: User-Agent
à sua resposta; caso contrário, os proxies em cache armazenarão uma versão e a enviarão para o outro tipo de navegador. MasVary: User-Agent
torna a resposta inacessível no IE.Respostas:
Usando o Regex (de detectmobilebrowsers.com ):
Aqui está uma função que usa um regex incrivelmente longo e abrangente que retorna um valor
true
oufalse
dependendo de o usuário estar ou não navegando com um celular.Para aqueles que desejam incluir tablets neste teste (embora não seja possível), você pode usar a seguinte função:
A resposta original
Você pode fazer isso simplesmente percorrendo uma lista de dispositivos e verificando se o
useragent
resultado corresponde a algo assim:No entanto, como você acredita que esse método não é confiável, você pode presumir que qualquer dispositivo que tenha uma resolução de 800x600 ou menos também seja um dispositivo móvel, restringindo ainda mais o seu objetivo (embora atualmente muitos dispositivos móveis tenham resoluções muito maiores que essa)
ie
Referência:
fonte
|android|ipad|playbook|silk
ao primeiro regex.E se:
... como os smartphones geralmente suportam essa propriedade e os navegadores de desktop não.
EDIT: Como o @Gajus apontou, esta solução agora está obsoleta e não deve ser usada ( https://developer.mozilla.org/en-US/docs/Web/API/Window/orientation )
fonte
window.orientation
é uma propriedade preterida ( developer.mozilla.org/en-US/docs/Web/API/Window/orientation , compat.spec.whatwg.org/#dom-window-orientation ) que alguns navegadores móveis optam por oferecer suporte por razões desconhecidas . Os mesmos navegadores implementamwindow.screen.orientation
(que também é definido nos navegadores de desktop). Só posso presumir quewindow.orientation
resta por motivos herdados e, portanto, não deve ser usado em novos aplicativos.Como usar
Para verificar se o usuário está em um dispositivo móvel específico:
Ref: http://www.abeautifulsite.net/blog/2011/11/detecting-mobile-devices-with-javascript
Versão aprimorada no github: https://github.com/smali-kazmi/detect-mobile-browser
fonte
any()
um loop for ... in deisMobile
membros do ORed ?Aqui está uma solução simples da fonte do estilingue do facebook
fonte
Vim aqui procurando uma maneira simples e limpa de detectar "dispositivos com telas sensíveis ao toque", que eu classifico como móveis e tablets. Não encontrou uma opção limpa nas respostas atuais, mas elaborou o seguinte, que também pode ajudar alguém.
Editar : para oferecer suporte a áreas de trabalho com uma tela sensível ao toque e celulares ao mesmo tempo, você pode usar o seguinte:
fonte
touchstart|end|etc
.navigator.maxTouchPoints
(semms
prefixo). Há também um artigo MDN para verificar.Como muitos declararam, confiar no alvo móvel dos dados do agente do usuário é problemático. O mesmo pode ser dito para contar com o tamanho da tela.
Minha abordagem é emprestada de uma técnica CSS para determinar se a interface é sensível ao toque:
Usando apenas javascript (compatível com todos os navegadores modernos), uma correspondência de consulta de mídia pode inferir facilmente se o dispositivo é móvel .
fonte
De acordo com o artigo da MDN sobre a detecção do navegador usando o agente do usuário , é recomendável evitar essa abordagem, se possível, e sugerir outros caminhos, como a detecção de recursos.
No entanto, se for necessário usar o agente do usuário como um meio para detectar se o dispositivo é móvel, eles sugerem:
Portanto, este one-liner será suficiente:
const isMobileDevice = window.navigator.userAgent.toLowerCase().includes("mobi");
[ATUALIZAR]:
Como @ zenw0lf sugere nos comentários, seria melhor usar uma expressão regular:
const isMobileDevice = /Mobi/i.test(window.navigator.userAgent)
fonte
.includes
não sopport por IE-11Mobile
a sequência de agentes do usuárioIf 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)
Não existe uma solução perfeita para detectar se o código JS é executado em um navegador móvel, mas as duas opções a seguir devem funcionar na maioria dos casos.
Opção 1: cheirar o navegador
Esse código específico de detecção de navegador é o de uma biblioteca chamada isMobile .
Opção 2: window.orientation
Teste se
window.orientation
está definido:Nota
Nem todos os dispositivos touchscreen são móveis e vice-versa. Portanto, se você deseja implementar algo específico para a tela sensível ao toque, não deve testar se o navegador está sendo executado em um dispositivo móvel, mas se os dispositivos têm suporte para a tela sensível ao toque:
fonte
window.orientation
solução, mas os documentos dizem que está obsoleta! developer.mozilla.org/en-US/docs/Web/API/Window/orientationAqui está uma solução userAgent que é mais eficaz do que a correspondência ...
fonte
/iphone|etc/i.test(navigator.userAgent)
Para adicionar uma camada extra de controle, eu uso o armazenamento HTML5 para detectar se ele está usando armazenamento móvel ou de desktop. Se o navegador não suportar armazenamento, tenho uma variedade de nomes de navegadores móveis e comparo o agente do usuário com os navegadores da matriz.
É bem simples. Aqui está a função:
fonte
sessionStorage.desktop
não existe no Safari, Chrome ou Firefox (todas as versões mais recentes no momento da publicação). Você recebe uma votação positiva, já que sua solução vai em uma direção melhor do que outras. Mas não se esqueça de usar emvar mobile =
vez demobile =
.A detecção de recursos é muito melhor do que tentar descobrir em qual dispositivo você está e muito difícil acompanhar os novos dispositivos que saem o tempo todo. Uma biblioteca como o Modernizr permite que você saiba se um recurso específico está disponível ou não.
fonte
Que tal algo como isso?
fonte
screen.width
? Parece-me que é mais confiável do quewindow.matchMedia
.Quando o elemento ganha foco, você o desfoca imediatamente. O bootstrap-datepicker, que é um componente muito popular e bem mantido, com quase 10.000 estrelas no GitHub, usa esta abordagem:
https://github.com/uxsolutions/bootstrap-datepicker
Obrigado ao Tigger pela assistência.
fonte
Uma maneira realmente boa de detectar dispositivos móveis ou tablets é verificar se o navegador pode criar um evento de toque.
Código JavaScript simples:
Isso funcionou muito bem para mim, mas pode haver um problema com os laptops, que incluem uma tela sensível ao toque.
Não tenho certeza se um laptop com tela sensível ao toque será detectado como um dispositivo móvel porque ainda não o testei.
fonte
Aqui está a minha solução repensada para o problema. Ainda não é perfeito. A única solução verdadeira seria se os fabricantes de dispositivos começarem a levar a sério as seqüências de agente do usuário "Mobile" e "Tablet".
O que acontece quando o tablet Nexus 7 tem apenas a string do Android UA? Primeiro, o Mobile se tornará verdadeiro; mais tarde, o Tablet também se tornará verdadeiro, mas o Tablet excluirá a string do Mobile UA da etiqueta do corpo.
CSS:
alert
linhas adicionadas para desenvolvimento. O console do Chrome pode emular muitos dispositivos portáteis. Teste lá.EDITAR:
Só não use isso, use a detecção de recursos. Existem tantos dispositivos e marcas por aí que segmentar uma marca NUNCA será a solução certa.
fonte
Aconselho que você verifique http://wurfl.io/
Em poucas palavras, se você importar um pequeno arquivo JS:
você ficará com um objeto JSON que se parece com:
(supondo que você esteja usando um Nexus 7, é claro) e poderá fazer coisas como:
Isto é o que você está procurando.
Isenção de responsabilidade: trabalho para a empresa que oferece este serviço gratuito. Obrigado.
fonte
aqui está um forro
fonte
Depende do caso de uso. Todos os dispositivos móveis requerem uma bateria. Se você procura computação sem energia, use a API de status da bateria :
Se o que você está procurando é uso de apresentação
matchMedia
, que retorna um valor booleano:Ou combine-os para uma experiência de usuário ainda melhor em tablets.
fonte
Aqui está uma solução ECMAScript 6 (pronta para TypeScript)
fonte
if
condição em vez de ter toda essacheck
variável?Há um truque simples para detectar se é um dispositivo móvel ou não. Basta verificar se o evento ontouchstart existe:
fonte
Já enfrentei alguns cenários em que as respostas acima não funcionam para mim. Então eu vim com isso. Pode ser útil para alguém.
Depende do seu caso de uso. Se você se concentrar no uso da tela
screen.availWidth
oudocument.body.clientWidth
se desejar renderizar com base no documento.fonte
O melhor deve ser:
Mas como Yoav Barnea diz ...
Após esses 3 testes, espero que o var isMobile seja ... ok
fonte
Aqui está ele função completa
fonte
Além disso, você pode seguir este tutorial para detectar um celular específico. Clique aqui .
fonte
Mobile
ao seu RXque tal usar "window.screen.width"?
ou
Eu acho que essa é a melhor maneira, porque há um novo dispositivo móvel todos os dias!
(embora eu ache que não é compatível com navegadores antigos, mas tente :))
fonte
Observe que a maioria dos dispositivos móveis de nova geração agora possui resoluções maiores que 600x400. ou seja, um iPhone 6 ....
Prova de teste: executou as postagens mais votadas e mais recentes aqui, com uma verificação opcional uma vez executada da seguinte forma:
De alguma forma, os seguintes resultados foram retornados nos seguintes aplicativos do navegador. Especificações: iPhone 6S, iOS 10.3.1.
Safari (mais recente): detectado como móvel.
Chrome (mais recente): não o detectou como um celular.
Então, testei a sugestão do Lanti ( https://stackoverflow.com/a/31864119/7183483 ) e ele retornou os resultados adequados (móvel para todos os dispositivos iOS e desktop para meu Mac). Portanto, procedi a editá-lo um pouco, pois seria acionado duas vezes (para dispositivos móveis e tablets). Notei, ao testar em um iPad, que ele também retornava como um celular, o que faz sentido, pois os Parâmetros que Lantiusa verificar o sistema operacional mais do que qualquer coisa. Portanto, eu simplesmente movi a instrução IF do tablet para dentro da verificação móvel, que retornaria para celular, caso a verificação do Tablet fosse negativa e o tablet, caso contrário. Em seguida, adicionei a cláusula else para que a verificação móvel retorne como desktop / laptop, pois os dois se qualificam, mas notei que o navegador detecta as marcas de CPU e SO. Então, eu adicionei o que é retornado lá como parte da instrução if if. Para resumir, eu adicionei uma declaração preventiva no caso de nada ser detectado. Veja abaixo, será atualizado com um teste em um PC com Windows 10 em breve.
Ah, e eu também adicionei uma variável 'debugMode', para alternar facilmente entre a depuração e a compilação normal.
Dislaimer: Crédito total para Lanti , também porque isso não foi testado em Windows Tablets ... o que pode retornar um desktop / laptop, pois o sistema operacional é puro Windows. Verificarei quando encontrar um amigo que use um.
fonte
Esta é apenas uma porta es6 da resposta aceita que estou usando no meu projeto. Observe que isso também inclui tablets.
fonte
Que tal isso, ele se expande na resposta acima, mas também verifica o tamanho da tela
fonte
Usando o Regex (de detectmobilebrowsers.com ):
fonte
Isso também pode ser uma solução.
Se você usar os dois métodos, obterá uma maneira perfeita de detectar dispositivos diferentes.
fonte