Existe uma maneira sólida de detectar se um usuário está ou não usando um dispositivo móvel no jQuery? Algo semelhante ao atributo CSS @media? Gostaria de executar um script diferente se o navegador estiver em um dispositivo portátil.
A $.browser
função jQuery não é o que estou procurando.
Respostas:
Nota do editor: a detecção de agente do usuário não é uma técnica recomendada para aplicativos da web modernos. Veja os comentários abaixo desta resposta para confirmação deste fato. É recomendável usar uma das outras respostas usando a detecção de recursos e / ou consultas de mídia.
Em vez de usar o jQuery, você pode usar JavaScript simples para detectá-lo:
Ou você pode combinar os dois para torná-lo mais acessível através do jQuery ...
Agora
$.browser
retornará"device"
para todos os dispositivos acimaNota:
$.browser
removido no jQuery v1.9.1 . Mas você pode usar isso usando o código de plug-in de migração jQueryUma versão mais completa:
fonte
.This.Is.A.Bad.Idea.
Para mim pequeno é lindo, então estou usando esta técnica:
No arquivo CSS:
No arquivo jQuery / JavaScript:
Meu objetivo era ter meu site "otimizado para celular". Então, eu uso CSS Media Queries para mostrar / ocultar elementos, dependendo do tamanho da tela.
Por exemplo, na minha versão móvel, não quero ativar o Facebook Like Box, porque ele carrega todas essas imagens de perfil e outras coisas. E isso não é bom para visitantes móveis. Portanto, além de ocultar o elemento container, também faço isso dentro do bloco de código jQuery (acima):
Você pode vê-lo em ação em http://lisboaautentica.com
Ainda estou trabalhando na versão móvel, por isso ainda não está parecendo como deveria, ao escrever isso.
Atualizar por dekin88
Há uma API JavaScript integrada para a detecção de mídia. Em vez de usar a solução acima, basta usar o seguinte:
Suporte ao navegador: http://caniuse.com/#feat=matchmedia
A vantagem desse método é que ele não é apenas mais simples e mais curto, mas você pode direcionar condicionalmente diferentes dispositivos, como smartphones e tablets separadamente, se necessário, sem precisar adicionar elementos fictícios no DOM.
fonte
screen.width
propriedade é global. Não há necessidade de adicionar arbitrariamente um elemento ao DOM e trazer desnecessariamente consultas de mídia CSS. Além disso, se o navegador estiver em uma área de trabalho e o usuário redimensionar a janela,$is_mobile
não será atualizado.if( screen.width <= 480 ) { // is mobile }
width
valor do atributo IIRC. Portanto, um iPhone retina terá umwidth
dos640
e uma altura de960
no retrato, e umawidth
de960
uma altura de640
na paisagem.window.matchMedia
: developer.mozilla.org/en-US/docs/Web/API/Window.matchMediaDe acordo com o Mozilla - Detecção de navegador usando o agente do usuário :
Como isso:
Isso corresponderá a todos os agentes comuns de usuários de navegadores móveis, incluindo Mozilla, Safari, IE, Opera, Chrome, etc.
Atualização para Android
EricL recomenda testar
Android
também como agente de usuário, pois a cadeia de agente de usuário do Chrome para tablets não inclui "Mobi" (as versões do telefone, no entanto):fonte
/Mobi/i.test(navigator.userAgent)
, porém, como test () ele retorna um booleano./Mobi/i.test(navigator.userAgent) || /Android/i.test(navigator.userAgent)
Uma linha simples e eficaz:
No entanto, o código acima não leva em consideração o caso de laptops com tela sensível ao toque. Portanto, forneço esta segunda versão, com base na solução @Julian :
fonte
isMobile
função que você forneceu retornatrue
no meu dispositivo de destop !! (Google Chrome v44.0)O que você está fazendo, querendo detectar um dispositivo móvel, está chegando muito perto de um IMO do conceito "browser sniffing". Provavelmente seria muito melhor fazer alguma detecção de recurso. Bibliotecas como http://www.modernizr.com/ podem ajudar com isso.
Por exemplo, onde está a linha entre móvel e não móvel? Fica cada vez mais embaçado todos os dias.
fonte
Não é jQuery, mas achei o seguinte: http://detectmobilebrowser.com/
Ele fornece scripts para detectar navegadores móveis em vários idiomas, um dos quais é JavaScript. Isso pode ajudá-lo com o que você está procurando.
No entanto, como você está usando o jQuery, convém estar ciente da coleção jQuery.support. É uma coleção de propriedades para detectar os recursos do navegador atual. A documentação está aqui: http://api.jquery.com/jQuery.support/
Como não sei exatamente o que você está tentando realizar, não sei qual será a mais útil.
Tudo isso dito, acho que sua melhor aposta é redirecionar ou escrever um script diferente para a saída usando uma linguagem do lado do servidor (se isso for uma opção). Como você realmente não conhece os recursos de um navegador móvel x, executar a lógica de detecção e alteração no lado do servidor seria o método mais confiável. Claro, tudo isso é um ponto discutível se você não pode usar um idioma do lado do servidor :)
fonte
|android|ipad|playbook|silk
conforme descrito na seção about (é por design)Às vezes, é desejável saber qual dispositivo de marca um cliente está usando para mostrar conteúdo específico para esse dispositivo, como um link para a loja do iPhone ou o mercado Android. O modernizador é ótimo, mas mostra apenas os recursos do navegador, como HTML5 ou Flash.
Aqui está minha solução UserAgent no jQuery para exibir uma classe diferente para cada tipo de dispositivo:
Esta solução é da Graphics Maniacs http://graphicmaniacs.com/note/detecting-iphone-ipod-ipad-android-and-blackberry-browser-with-javascript-and-php/
fonte
Encontrou uma solução em: http://www.abeautifulsite.net/blog/2011/11/detecting-mobile-devices-with-javascript/ .
E, para verificar se é um celular, você pode testar usando:
fonte
Se por "celular" você quer dizer "tela pequena", eu uso o seguinte:
No iPhone, você terminará com uma window.screen.width de 320. No Android, você terminará com uma window.outerWidth of 480 (embora isso possa depender do Android). Os iPads e tablets Android retornam números como 768 para obter a visualização completa como você deseja.
fonte
Se você usa o Modernizr , é muito fácil usar
Modernizr.touch
como mencionado anteriormente.No entanto, eu prefiro usar uma combinação de
Modernizr.touch
e teste de agente de usuário, apenas por segurança.Se você não usa o Modernizr, pode simplesmente substituir a
Modernizr.touch
função acima por('ontouchstart' in document.documentElement)
Observe também que ao testar o agente do usuário,
iemobile
você terá uma gama mais ampla de dispositivos móveis Microsoft detectados do queWindows Phone
.Veja também esta pergunta do SO
fonte
TouchEvent.supported
.('ontouchstart' in window)
é uma alternativa paraModernizr.touch
, também, hacks.mozilla.org/2013/04/...|
vez de muitas correspondências. Você também não precisa dotoLowerCase()
porque possui oi
modificador. Aqui:var isTouchDevice = Modernizr.touch || /iphone|ipod|ipad|android|iemobile|iphone|ipad|ipod|blackberry|bada/i.test(navigator.userAgent);
Você não pode confiar
navigator.userAgent
, nem todo dispositivo revela seu verdadeiro sistema operacional. No meu HTC, por exemplo, depende das configurações (ligar / desligar a versão móvel). Em http://my.clockodo.com , simplesmente usamosscreen.width
para detectar pequenos dispositivos. Infelizmente, em algumas versões do Android, há um erro no screen.width. Você pode combinar dessa maneira com o userAgent:fonte
Eu sei que esta pergunta tem muitas respostas, mas pelo que vi, ninguém se aproxima da resposta da maneira que eu resolveria isso.
O CSS usa a largura (Consultas de mídia) para determinar quais estilos aplicados ao documento da Web se baseiam na largura. Por que não usar largura no JavaScript?
Por exemplo, nas consultas de mídia do Bootstrap (Mobile First), existem 4 pontos de snap / break:
Podemos usar isso para também resolver nosso problema de JavaScript.
Primeiro, criaremos uma função que obtém o tamanho da janela e retorna um valor que nos permite ver qual tamanho de dispositivo está visualizando nosso aplicativo:
Agora que temos a função configurada, podemos chamá-la e armazenar o valor:
Sua pergunta foi
Agora que temos as informações do dispositivo, tudo o que resta é uma instrução if:
Aqui está um exemplo no CodePen: http://codepen.io/jacob-king/pen/jWEeWG
fonte
Small Devices range from 768 to 991 pixels.
isso significa que ele deve serwindow.innerWidth < 992
(991 está incluído) a mesma coisa para 1199 deve ser <1,200 vezEm uma linha de javascript:
Se o agente do usuário contiver 'Mobi' (conforme MDN) e o ontouchstart estiver disponível, é provável que seja um dispositivo móvel.
fonte
/Mobi/.test(navigator.userAgent)
...match
não fez isso por mimEstou surpreso que ninguém tenha apontado um site legal: http://detectmobilebrowsers.com/ Ele já criou código em diferentes idiomas para detecção móvel (incluindo, mas não se limitando a):
E se você precisar detectar os tablets também, basta verificar a seção Sobre para obter mais parâmetros RegEx.
fonte
Se você não estiver particularmente preocupado com telas pequenas, poderá usar a detecção de largura / altura. Dessa forma, se a largura estiver abaixo de um determinado tamanho, o site móvel será exibido. Pode não ser o caminho perfeito, mas provavelmente será o mais fácil de detectar para vários dispositivos. Pode ser necessário inserir um específico para o iPhone 4 (resolução grande).
fonte
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
Se for constatado que apenas verificar
navigator.userAgent
nem sempre é confiável. Maior confiabilidade pode ser alcançada também verificandonavigator.platform
. Uma simples modificação em uma resposta anterior parece funcionar melhor:fonte
Aconselho que você verifique http://wurfl.io/
Em poucas palavras, se você importar um pequeno arquivo JavaScript:
Você ficará com um objeto JSON que se parece com:
(Isso pressupõe 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.
fonte
Confira esta postagem , ele fornece um snippet de código muito bom sobre o que fazer quando dispositivos touch são detectados ou o que fazer se o evento touchstart for chamado:
fonte
'ontouchstart' in document.documentElement
é provavelmente um teste melhor para suporte por toque do quewindow.Touch
. Melhor ainda, use Modernizr.js ( modernizr.com ), porque gastamos muito tempo tentando acertar na detecção de toque. Você pode ver o código de detecção de toque em modernizr.com/downloads/modernizr.js se visualizar o código de desenvolvimento e pesquisar em "touch".Aqui está uma função que você pode usar para obter uma resposta verdadeira / falsa sobre se você está executando em um navegador móvel. Sim, é farejador de navegador, mas às vezes é exatamente isso que você precisa.
fonte
for
disso! + Você esqueceu de criar um RegExp. Aqui está uma mais simples:return !!navigator.userAgent.match(new RegExp(agents.join('|'),'i'))
Todas as respostas usam user-agent para detectar o navegador, mas a detecção de dispositivo com base em user-agent não é uma solução muito boa, melhor é detectar recursos como o dispositivo de toque (no novo jQuery, eles removem
$.browser
e usam$.support
).Para detectar dispositivos móveis, você pode verificar se há eventos de toque:
Retirado de Qual é a melhor maneira de detectar um dispositivo 'touch screen' usando JavaScript?
fonte
true
em computadores de mesa com telas sensíveis ao toque. stucox.com/blog/you-cant-detect-a-touchscreenEu sugeriria usar o seguinte combo de strings, para verificar se o tipo de dispositivo está sendo usado.
Conforme a documentação da Mozilla, a string
Mobi
é recomendada. Porém, alguns dos tablets antigos não retornam true seMobi
usados apenas , portanto, devemos usarTablet
string também.Da mesma forma, por estar do lado seguro
iPad
eiPhone
cordas também pode ser usado para verificar o tipo de dispositivo.A maioria dos novos dispositivos retornaria apenas
true
para aMobi
string.fonte
fonte
window.matchMedia("(pointer:coarse)").matches;
de uma resposta diferente.Ótima resposta, obrigado. Pequena melhoria no suporte ao Windows phone e Zune:
fonte
if (navigator.userAgent.match(/Android|webOS|iPhone|iPad|etc/)){self.location = "top.htm"}
Usa isto:
Então use isto:
fonte
Função simples com base em http://detectmobilebrowser.com/
fonte
Se você acessar qualquer navegador e tentar obter navigator.userAgent, obteremos as informações do navegador, como a seguir
Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit / 537.36 (KHTML, como Gecko) Chrome / 64.0.3282.186 Safari / 537.36
A mesma coisa, se você faz no celular, estará seguindo
Mozilla / 5.0 (Linux; Android 8.1.0; Pixel Build / OPP6.171019.012) AppleWebKit / 537.36 (KHTML, como Gecko) Chrome / 61.0.3163.98 Mobile Safari / 537.36
Todos os navegadores móveis terão useragent com uma string contendo "Mobile". Por isso, estou usando o snippet acima no meu código para verificar se o agente atual do usuário é web / mobile. Com base no resultado, farei as alterações necessárias.
fonte
Eu uso isso
fonte
Que tal mobiledetect.net ?
Outras soluções parecem muito básicas. Esta é uma classe PHP leve. Ele usa a sequência User-Agent combinada com cabeçalhos HTTP específicos para detectar o ambiente móvel. Você também pode se beneficiar do Mobile Detect usando qualquer um dos plug-ins de terceiros disponíveis para: WordPress, Drupal, Joomla, Magento, etc.
fonte
As strings do agente do usuário não devem ser confiáveis sozinhas. A solução abaixo funcionará em todas as situações.
e chame esta função:
fonte