Rilevamento di un browser mobile


889

Sto cercando una funzione che restituisca valore booleano se l'utente ha un browser mobile o meno.

So che posso usare navigator.userAgente scrivere quella funzione usando regex, ma gli user-agent sono troppo diversi per piattaforme diverse. Dubito che abbinare tutti i possibili dispositivi sarebbe facile e penso che questo problema sia stato risolto molte volte, quindi dovrebbe esserci una sorta di soluzione completa per tale compito.

Stavo guardando questo sito , ma purtroppo lo script è così criptico che non ho idea di come usarlo per il mio scopo, che è quello di creare una funzione che ritorni vero / falso.




5
@Thrustmaster: Non lo farebbe davvero. Servire JS diversi su browser diversi significa che devi aggiungere una Vary: User-Agentrisposta, altrimenti i proxy di cache memorizzeranno una versione e la invieranno all'altro tipo di browser. Ma Vary: User-Agentrende impossibile la risposta in IE.
bobince l'

17
@ave: cosa stai cercando di fare rilevando un browser "mobile"? La distinzione è altamente discutibile nel mondo odierno di tablet e dispositivi di elaborazione ibrida. Stai cercando di rilevare piccoli schermi e presentare un'interfaccia utente diversa in quel caso? Stai cercando di rilevare la connettività a bassa larghezza di banda? Stai cercando di rilevare interfacce touch?
bobince l'

2
Quindi ho aggiornato la mia risposta per utilizzare il metodo javascript detectmobilebrowsers.com ma restituire un valore booleano se qualcuno ne ha ancora bisogno. ( nel caso in cui ). Happy Detecting :)
Michael Zaporozhets,

Risposte:


1318

Utilizzando Regex (da detectmobilebrowsers.com ):

Ecco una funzione che utilizza una regex follemente lunga e completa che restituisce un valore trueo a falseseconda che l'utente stia navigando o meno con un cellulare.

window.mobileCheck = function() {
  let check = false;
  (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);
  return check;
};

Per coloro che desiderano includere compresse in questo test (anche se probabilmente non dovresti), puoi utilizzare la seguente funzione:

window.mobileAndTabletCheck = function() {
  let check = false;
  (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);
  return check;
};

La risposta originale

Puoi farlo semplicemente scorrendo un elenco di dispositivi e controllando che useragentcorrisponda a qualcosa del genere:

  function detectMob() {
    const toMatch = [
        /Android/i,
        /webOS/i,
        /iPhone/i,
        /iPad/i,
        /iPod/i,
        /BlackBerry/i,
        /Windows Phone/i
    ];

    return toMatch.some((toMatchItem) => {
        return navigator.userAgent.match(toMatchItem);
    });
}

Tuttavia, poiché ritieni che questo metodo sia inaffidabile, potresti presumere che qualsiasi dispositivo che avesse una risoluzione di 800x600 o inferiore fosse anche un dispositivo mobile, restringendo ulteriormente il tuo obiettivo (anche se al giorno d'oggi molti dispositivi mobili hanno risoluzioni molto maggiori di questa)

vale a dire

  function detectMob() {
    return ( ( window.innerWidth <= 800 ) && ( window.innerHeight <= 600 ) );
  }

Riferimento:


25
Ciao, ho appena visitato il link detectmobilebrowsers.com sul mio iPad 3, iOS 6.1.2 e dice "Nessun browser mobile rilevato".
Richard Lovejoy,

49
@RichardLovejoy quando si costruiscono siti, l'ipad non è generalmente considerato un cellulare.
Michael Zaporozhets,

42
Dalla pagina about : tablet Android, iPad, Kindle Fire e PlayBooks non vengono rilevati dal design. Per aggiungere supporto per tablet, aggiungi |android|ipad|playbook|silkal primo regex.
Gras Double

13
Google TV è anche Android. Cosa definisce un cellulare? Grandezza schermo ? Toccare? deviceOrientation? Quando disegno è più una questione di passaggio del mouse o meno, grande bouton o piccoli collegamenti. Quindi, per ora, corro con "if (Modernizr.touch)" :)
molokoloco il

31
Accidenti, tutta questa idea di user agent è terribile e davvero, deve davvero smettere. Dobbiamo davvero smettere di consentire ai clienti di combattere controcorrente e attenersi alle domande dei media. Se vogliono eseguire reindirizzamenti in base alla scala per determinate pagine, controlla semplicemente l'intervallo di una particolare query multimediale tramite JS, ad esempio tylergaw.com/articles/reacting-to-media-queries-in-javascript
markyzm,

324

Che ne dite di:

if (typeof window.orientation !== 'undefined') { ... }

... poiché gli smartphone di solito supportano questa proprietà e i browser desktop no.

EDIT: Come sottolineato da @Gajus, questa soluzione è ora obsoleta e non dovrebbe essere utilizzata ( https://developer.mozilla.org/en-US/docs/Web/API/Window/orientation )


14
questo è in realtà super unico e fantastico, ti dispiace se lo aggiungo alla mia risposta?
Michael Zaporozhets,

77
Questo probabilmente non funzionerà a lungo. 1) I tablet possono avere dimensioni dello schermo decenti, vuoi che visualizzino il sito Web desktop completo ma avranno questa proprietà 2) Windows 8 è qui e con esso un gruppo di laptop con touchscreen e schermi che ruotano.
Dave Hilditch,

10
per quanto riguarda il tuo primo punto sui tablet con dimensioni dello schermo decenti, penso che potresti fare gli stessi argomenti anche per tutte le altre soluzioni (un tablet con grande schermo che è stato monitorato come piccolo schermo). comunque l'idea qui è quella di cercare proprietà che sono state condivise da piccoli dispositivi invece di mantenere il codice di manutenzione lungo e aggiungere regex con ogni nuovo dispositivo / versione / modello in arrivo. Penso che il rilevamento dei dispositivi appartenga al passato e oggi dobbiamo concentrarci sul rilevamento delle funzionalità. di nuovo sarò lieto di qui riguardo alla proprietà più adatta a tale questione ...
yoav barnea

2
Lo adoro e funziona perfettamente, grazie. Per la mia soluzione ero subito dopo semplice.
Bojangles,

40
window.orientationè una proprietà obsoleta ( developer.mozilla.org/en-US/docs/Web/API/Window/orientation , compat.spec.whatwg.org/#dom-window-orientation ) che alcuni browser mobili scelgono di supportare per motivi sconosciuti . Implementare gli stessi browser window.screen.orientation(che è definito anche nei browser desktop). Posso solo supporre che window.orientationsia rimasto lì per motivi legacy e non debba quindi essere utilizzato in nuove applicazioni.
Gajus

115
var isMobile = {
    Android: function() {
        return navigator.userAgent.match(/Android/i);
    },
    BlackBerry: function() {
        return navigator.userAgent.match(/BlackBerry/i);
    },
    iOS: function() {
        return navigator.userAgent.match(/iPhone|iPad|iPod/i);
    },
    Opera: function() {
        return navigator.userAgent.match(/Opera Mini/i);
    },
    Windows: function() {
        return navigator.userAgent.match(/IEMobile/i) || navigator.userAgent.match(/WPDesktop/i);
    },
    any: function() {
        return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows());
    }
};

Come usare

if( isMobile.any() ) alert('Mobile');

Per verificare se l'utente si trova su un dispositivo mobile specifico:

if( isMobile.iOS() ) alert('iOS');

Rif: http://www.abeautifulsite.net/blog/2011/11/detecting-mobile-devices-with-javascript

Versione avanzata su github: https://github.com/smali-kazmi/detect-mobile-browser


Perché non creare any()un for ... in loop dei isMobilemembri ORed ?
SomeShinyObject

@ChristopherW avevo creato il suo plugin e il codice modificato come mi hai consigliato
Mudaser Ali

2
Forse spostare iOS davanti a BlackBerry () solo per mettere prima i casi più comuni e lasciare che il salvataggio anticipato risparmi un po 'di elaborazione extra?
Rob_vH,

2
@Rob_vH avevo inserito questo codice in github ( github.com/smali-kazmi/detect-mobile-browser ) con alcune funzionalità avanzate; sei aperto a inviare suggerimenti anche lì
Mudaser Ali

1
@AkarshSatija Il calo delle prestazioni di quei 5 controlli regex ha effettivamente un impatto su qualsiasi tua applicazione? Sarei molto sorpreso se lo facesse. L'ottimizzazione prematura può essere una perdita di tempo ...
trusktr,

68

Ecco una semplice soluzione dalla fonte della fionda di Facebook

var isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
if (isMobile) {
  /* your code here */
}

Bello. Molto utile in determinate situazioni
Chuck Le Butt

Utile nel caso di rilevamento di un dispositivo in cui è possibile installare un'app mobile. Non ti interessa il browser, di per sé. Solo il dispositivo / sistema operativo.
Charlie Reitzel,

31

Sono venuto qui alla ricerca di un modo semplice e pulito per rilevare "dispositivi touch screen", che classifico come mobile e tablet. Non ho trovato una scelta chiara nelle risposte attuali, ma ho risolto quanto segue che potrebbe anche aiutare qualcuno.

var touchDevice = ('ontouchstart' in document.documentElement);

Modifica : per supportare desktop con touchscreen e dispositivi mobili contemporaneamente è possibile utilizzare quanto segue:

var touchDevice = (navigator.maxTouchPoints || 'ontouchstart' in document.documentElement);

9
Cosa succede se il monitor del desktop supporta il tocco?
Anton Kuzmin,

@HappyCoder Credo che spetti al sistema operativo comunicare al browser quando il touchscreen su un desktop è attivo. Quindi, sì, questo controllo dovrebbe essere ancora valido.
Tigro

(+1), tuttavia, il mio desktop che sto usando ora ha un touchscreen, e non è sempre coerente per touchstart|end|etc.
Cody,

1
Bootstrap datepicker utilizza quanto segue: if (window.navigator.msMaxTouchPoints || 'ontouchstart' nel documento) {this.input.blur (); }
JT Taylor,

1
@JTTaylor Sembra che Microsoft stia raccomandando navigator.maxTouchPoints (nessun msprefisso). C'è anche un articolo MDN da controllare.
Tigro

20

Come molti hanno affermato, basarsi sul target mobile dei dati dell'agente utente è problematico. Lo stesso si può dire per contare sulla dimensione dello schermo.

Il mio approccio è preso in prestito da una tecnica CSS per determinare se l'interfaccia è touch:

Utilizzando solo javascript (supporto di tutti i browser moderni), una corrispondenza di media query può facilmente dedurre se il dispositivo è mobile .

function isMobile() {
    var match = window.matchMedia || window.msMatchMedia;
    if(match) {
        var mq = match("(pointer:coarse)");
        return mq.matches;
    }
    return false;
}

6
Che dire dei laptop con display touch abilitati?
Massima

6
Vorrei verificare! MatchMedia ("(any-pointer: fine)"). Corrisponde a me stesso. ("Nessun mouse collegato", anziché "ha un touchscreen".
Sora2455

Questo funziona mentre il mio ultimo script verrebbe ingannato dalle persone che utilizzano la funzione di zoom del browser (ad esempio un ragazzo con cui stavo parlando su uno schermo da 13 "con 4K che è sceso a 1080p e dovevo ancora usare lo zoom). Ha funzionato sul mio iPhone (Safari / Firefox) e dispositivi Android (Waterfox / Chrome / "Browser"). Sicuramente molto più affidabile di tutte le risposte più votate.
John,

non rileva FireFox fennec su un Android per il quale ho integrato con navigator.userAgent.toLowerCase (). indexOf ('fennec')> -1 (forse non è il miglior integratore ..)
StayCool

2
Inoltre puoi testare la proprietà hover: per smartphone e touchscreen @media (hover: nessuno) e (puntatore: approssimativo)
Batailley

16

Secondo l'articolo di MDN sul rilevamento del browser che utilizza l'agente utente , si consiglia di evitare questo approccio, se possibile, e suggerire altre strade come il rilevamento delle funzionalità.

Tuttavia, se si deve utilizzare l'agente utente come mezzo per rilevare se il dispositivo è mobile, suggeriscono:

In breve, consigliamo di cercare la stringa "Mobi" in qualsiasi punto dell'agente utente per rilevare un dispositivo mobile.

Pertanto, questo one-liner sarà sufficiente:

const isMobileDevice = window.navigator.userAgent.toLowerCase().includes("mobi");

[AGGIORNARE]:

Come suggerisce @ zenw0lf nei commenti, sarebbe meglio usare un'espressione regolare:

const isMobileDevice = /Mobi/i.test(window.navigator.userAgent)


.includesnon sopportato da IE-11
Pasha Oleynik,

1
@PashaOleynik può essere risolto da un polifill
Massimo

Il tablet Nexus 7 con Android non ha Mobilenella stringa agente utente
Alex Sorokoletov il

@AlexSorokoletov Anche per l'articolo MDNIf 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).
TheDarkIn1978,

1
Penso che funzionerebbe ovunque senza polyfill: const isMobile = /Mobi/.test(window.navigator.userAgent)
zenw0lf

14

Non esiste una soluzione perfetta per rilevare se il codice JS viene eseguito su un browser mobile, ma le seguenti due opzioni dovrebbero funzionare nella maggior parte dei casi.

Opzione 1: sniffing del browser

!function(a){var b=/iPhone/i,c=/iPod/i,d=/iPad/i,e=/(?=.*\bAndroid\b)(?=.*\bMobile\b)/i,f=/Android/i,g=/(?=.*\bAndroid\b)(?=.*\bSD4930UR\b)/i,h=/(?=.*\bAndroid\b)(?=.*\b(?:KFOT|KFTT|KFJWI|KFJWA|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|KFARWI|KFASWI|KFSAWI|KFSAWA)\b)/i,i=/IEMobile/i,j=/(?=.*\bWindows\b)(?=.*\bARM\b)/i,k=/BlackBerry/i,l=/BB10/i,m=/Opera Mini/i,n=/(CriOS|Chrome)(?=.*\bMobile\b)/i,o=/(?=.*\bFirefox\b)(?=.*\bMobile\b)/i,p=new RegExp("(?:Nexus 7|BNTV250|Kindle Fire|Silk|GT-P1000)","i"),q=function(a,b){return a.test(b)},r=function(a){var r=a||navigator.userAgent,s=r.split("[FBAN");return"undefined"!=typeof s[1]&&(r=s[0]),s=r.split("Twitter"),"undefined"!=typeof s[1]&&(r=s[0]),this.apple={phone:q(b,r),ipod:q(c,r),tablet:!q(b,r)&&q(d,r),device:q(b,r)||q(c,r)||q(d,r)},this.amazon={phone:q(g,r),tablet:!q(g,r)&&q(h,r),device:q(g,r)||q(h,r)},this.android={phone:q(g,r)||q(e,r),tablet:!q(g,r)&&!q(e,r)&&(q(h,r)||q(f,r)),device:q(g,r)||q(h,r)||q(e,r)||q(f,r)},this.windows={phone:q(i,r),tablet:q(j,r),device:q(i,r)||q(j,r)},this.other={blackberry:q(k,r),blackberry10:q(l,r),opera:q(m,r),firefox:q(o,r),chrome:q(n,r),device:q(k,r)||q(l,r)||q(m,r)||q(o,r)||q(n,r)},this.seven_inch=q(p,r),this.any=this.apple.device||this.android.device||this.windows.device||this.other.device||this.seven_inch,this.phone=this.apple.phone||this.android.phone||this.windows.phone,this.tablet=this.apple.tablet||this.android.tablet||this.windows.tablet,"undefined"==typeof window?this:void 0},s=function(){var a=new r;return a.Class=r,a};"undefined"!=typeof module&&module.exports&&"undefined"==typeof window?module.exports=r:"undefined"!=typeof module&&module.exports&&"undefined"!=typeof window?module.exports=s():"function"==typeof define&&define.amd?define("isMobile",[],a.isMobile=s()):a.isMobile=s()}(this);

alert(isMobile.any ? 'Mobile' : 'Not mobile');

Questo particolare codice di sniffing del browser è quello di una libreria chiamata isMobile .


Opzione 2: window.orientation

Verifica se window.orientationè definito:

var isMobile = window.orientation > -1;
alert(isMobile ? 'Mobile' : 'Not mobile');


Nota

Non tutti i dispositivi touchscreen sono mobili e viceversa. Quindi, se vuoi implementare qualcosa di specifico per il touchscreen, non dovresti testare se il tuo browser è eseguito su un dispositivo mobile, ma piuttosto se i dispositivi hanno il supporto per touchscreen:

var hasTouchscreen = 'ontouchstart' in window;
alert(hasTouchscreen ? 'has touchscreen' : 'doesn\'t have touchscreen');


L'approccio all'orientamento è davvero bello! ))
Massimo

1
Mi piace la tua window.orientationsoluzione, ma i documenti dicono che è deprecato! developer.mozilla.org/en-US/docs/Web/API/Window/orientation
skwidbreth

3
L'approccio all'orientamento NON è piacevole perché Windows 8 e versioni successive possono cambiare orientamento.
Heitor

Windows 8 e versioni successive si concentrano sull'aggiunta del supporto per i cellulari ma anche per gli ibridi (laptop che possono essere convertiti in pad di grandi dimensioni), motivo per cui l'orientamento non riesce come metodo di rilevamento anche se Moz non si riferiva ad esso come obsoleto.
Jeff Clayton,

È da Win 7 con il software grafico installato che può cambiare l'orientamento ma poniti una domanda, chi può utilizzare Desktop / Laptop usando un altro orientamento dello schermo come Ritratto anziché Orizzontale e usare i per anche più di 1 minuto. Nessuno !!! Cambiare l'orientamento sul desktop significa che inizierai a leggere i caratteri sullo schermo dal basso verso l'alto.
GirlCode

11

Ecco una soluzione userAgent che è più efficace della corrispondenza ...

function _isMobile(){
    // if we want a more complete list use this: http://detectmobilebrowsers.com/
    // str.test() is more efficent than str.match()
    // remember str.test is case sensitive
    var isMobile = (/iphone|ipod|android|ie|blackberry|fennec/).test
         (navigator.userAgent.toLowerCase());
    return isMobile;
}

7
il metodo di test non fa distinzione tra maiuscole e minuscole, ma lo è il tuo regex. potresti semplicemente /iphone|etc/i.test(navigator.userAgent)
segnalare

11

Per aggiungere un ulteriore livello di controllo, utilizzo l'archiviazione HTML5 per rilevare se utilizza l'archiviazione mobile o l'archiviazione desktop. Se il browser non supporta l'archiviazione, ho un array di nomi di browser mobili e confronto l'agente utente con i browser dell'array.

È abbastanza semplice Ecco la funzione:

// Used to detect whether the users browser is an mobile browser
function isMobile() {
    ///<summary>Detecting whether the browser is a mobile browser or desktop browser</summary>
    ///<returns>A boolean value indicating whether the browser is a mobile browser or not</returns>

    if (sessionStorage.desktop) // desktop storage 
        return false;
    else if (localStorage.mobile) // mobile storage
        return true;

    // alternative
    var mobile = ['iphone','ipad','android','blackberry','nokia','opera mini','windows mobile','windows phone','iemobile']; 
    for (var i in mobile) if (navigator.userAgent.toLowerCase().indexOf(mobile[i].toLowerCase()) > 0) return true;

    // nothing found.. assume desktop
    return false;
}

3
Non ho ancora testato su dispositivi mobili, ma sessionStorage.desktopnon esiste in Safari, Chrome o Firefox (tutte le versioni più recenti al momento della pubblicazione). Ottieni comunque un voto positivo, poiché la tua soluzione va in una direzione migliore rispetto ad altre. Ma non dimenticare di usare al var mobile =posto di mobile =.
shuckster,

3
Inoltre, è una buona idea non utilizzare indexOf con browser più vecchi ancora in circolazione che non supportano quel metodo o utilizzare un polyfill. Non è necessario utilizzare toLowerCase in un elenco di valori minuscoli, né è necessario farlo se si esegue /ipad|iphone|etc/i.test(navigator.userAgent) anziché il loop lento presente.
Jeffrey Gilbert,

10

Il rilevamento delle caratteristiche è molto meglio del cercare di capire quale dispositivo si trova e molto difficile tenere il passo con i nuovi dispositivi che escono continuamente, una libreria come Modernizr ti fa sapere se una particolare funzione è disponibile o meno.


18
Hai risposto a un'altra domanda rispetto a ciò che è stato chiesto. Invece di "come posso rilevare i dispositivi mobili?", Hai risposto "come posso rilevare determinate funzioni?". Non tutto il rilevamento dei dispositivi è per il rilevamento delle funzionalità. E se stessimo cercando di ottenere statistiche sui dispositivi? Quindi no, "rilevamento funzionalità" non è "molto meglio di [capire dispositivo]".
Jonathan Allard,

1
Questa non è la risposta, ma merita più di un semplice commento. La domanda è: perché vuoi rilevare un browser e probabilmente vorrai conoscerlo solo a causa della (mancanza di) tocco. Webdesign reattivo è sufficiente nella maggior parte se non in tutti i casi.
volte il

8

Che ne dici di questo?

if(
    (screen.width <= 640) || 
    (window.matchMedia && 
     window.matchMedia('only screen and (max-width: 640px)').matches
    )
  ){
   // Do the mobile thing
}

Perché non semplicemente usare screen.widthinvece? Mi sembra più affidabile di window.matchMedia.
John Slegers,

Buon punto John, non riesco a ricordare esattamente cosa stavo pensando in quel momento, sembra improbabile (guardandolo ora) che la seconda clausola tornerebbe vera se la prima è falsa. Ci deve essere stato un motivo per cui l'ho aggiunto però.
stujo

La maggior parte dei programmatori decenti si vergogna quando vedono il codice che si sono scritti un anno prima. Coloro che non solo non sono cresciuti come programmatori ;-)
John Slegers,

4
La risoluzione della finestra non ha nulla a che vedere con il browser su un dispositivo mobile o meno. Ad esempio, molti browser desktop vengono eseguiti in finestre non a schermo intero. Se si presenta un'interfaccia utente progettata per schermi portatili a tali browser, i loro utenti vivranno un'esperienza frustrante.
ʇsәɹoɈ

1
@JohnSlegers - Mi vergogno principalmente di cercare una domanda su Google e di trovare la mia risposta su StackOverflow. ancora e ancora. Io stesso sono in uno stack overflow costante
vsync il

7

Una volta che l'elemento diventa attivo, lo sfuoco immediatamente. Bootstrap-datepicker, che è un componente molto popolare e ben mantenuto con quasi 10.000 stelle in GitHub, utilizza questo approccio:

if (window.navigator.maxTouchPoints || 'ontouchstart' in document) {
    this.input.blur();
}

https://github.com/uxsolutions/bootstrap-datepicker

Grazie a Tigger per l'assistenza.


7

Un ottimo modo per rilevare dispositivi mobili o tablet è cercare se il browser può creare un evento touch.

Codice JavaScript semplice:

function isMobile() {
   try{ document.createEvent("TouchEvent"); return true; }
   catch(e){ return false; }
}

if (isMobile()) {
   # do whatever you wanna do!
}

Questo ha funzionato molto bene per me, ma potrebbe esserci un problema con i dispositivi laptop che includono un display touchscreen.

Non sono sicuro se un laptop touchscreen verrà rilevato come dispositivo mobile perché non l'ho ancora testato.


5
I laptop touchscreen verranno rilevati come dispositivo mobile. Oltre ai monitor touchscreen per desktop. Che ci crediate o no, si verificherà anche un problema se si utilizza un dispositivo touchscreen per RDP in un altro dispositivo che non ha un touchscreen.
blissfool,

@blissfool Immagino che questo non sarà il modo giusto per rilevare i dispositivi mobili allora.
Neo Morina,

Sfortunatamente no. Tuttavia, potrebbe essere comunque un'opzione praticabile per un caso d'uso molto limitato.
blissfool,

mai scrivere codice, che si basa su un'eccezione, che verrà comunque lanciato di sicuro ...
Pablo,

@Sivic viene generato solo quando un TouchEvent non esiste e il codice sopra lo cattura e restituisce false. Questo non è il caso su dispositivi mobili, tablet o altri dispositivi touch screen.
Neo Morina,

5

Ecco la mia soluzione ripensata per il problema. Non è ancora perfetto L'unica vera soluzione sarebbe se i produttori di dispositivi iniziassero a prendere sul serio le stringhe user-agent "Mobile" e "Tablet".

window.onload = userAgentDetect;
function userAgentDetect() {
  if(window.navigator.userAgent.match(/Mobile/i)
  || window.navigator.userAgent.match(/iPhone/i)
  || window.navigator.userAgent.match(/iPod/i)
  || window.navigator.userAgent.match(/IEMobile/i)
  || window.navigator.userAgent.match(/Windows Phone/i)
  || window.navigator.userAgent.match(/Android/i)
  || window.navigator.userAgent.match(/BlackBerry/i)
  || window.navigator.userAgent.match(/webOS/i)) {
    document.body.className += ' mobile';
    alert('True - Mobile - ' + navigator.userAgent);
  } else {
    alert('False - Mobile - ' + navigator.userAgent);
  }
  if(window.navigator.userAgent.match(/Tablet/i)
  || window.navigator.userAgent.match(/iPad/i)
  || window.navigator.userAgent.match(/Nexus 7/i)
  || window.navigator.userAgent.match(/Nexus 10/i)
  || window.navigator.userAgent.match(/KFAPWI/i)) {
    document.body.className -= ' mobile';
    document.body.className += ' tablet';
    alert('True - Tablet - ' + navigator.userAgent);
  } else {
    alert('False - Tablet - ' + navigator.userAgent);
  }
}

Cosa succede quando il tablet Nexus 7 ha solo la stringa Android UA? Innanzitutto, il cellulare diventa realtà, poi anche il tablet diventa realtà, ma il tablet eliminerà la stringa UA mobile dal tag body.

CSS:

body.tablet { background-color: green; }
body.mobile { background-color: red; }

alertlinee aggiunte per lo sviluppo. La console Chrome può emulare molti dispositivi portatili. Prova lì.

MODIFICARE:

Basta non usare questo, utilizzare invece il rilevamento delle funzionalità. Ci sono così tanti dispositivi e marchi là fuori che il targeting di un marchio non sarà MAI la soluzione giusta.


4

Vi consiglio di dare un'occhiata a http://wurfl.io/

In poche parole, se importi un piccolo file JS:

<script type='text/javascript' src="//wurfl.io/wurfl.js"></script>

ti verrà lasciato un oggetto JSON simile a:

{
 "complete_device_name":"Google Nexus 7",
 "is_mobile":true,
 "form_factor":"Tablet"
}

(supponendo che tu stia utilizzando un Nexus 7, ovviamente) e sarai in grado di fare cose come:

if(WURFL.form_factor == "Tablet"){
    //dostuff();
}

Questo e ciò che stai cercando.

Disclaimer: lavoro per l'azienda che offre questo servizio gratuito. Grazie.


1
E come mai questo non riconosce Safari su iPhone?
Amyth,

Puoi espandere su quale browser stai utilizzando (la stringa UA esatta sarebbe perfetta), quali dati stai ricevendo e cosa ti aspetti?
Luca Passani,

Anch'io ho provato wurfl, sono su un iPhone 5C con IOS 11.2. Non sta riconoscendo Safari come browser mobile. Mi aspetto di usare "is_mobile": true e poi "form_factor": Smartphone e non sta nemmeno ritornando.
Mike Wells,

Ho dovuto rivolgersi ai guru dei dati mobili dell'azienda e mi hanno detto che OS 11.2 non funziona con il 5C. Il dispositivo più basso è il 5S. Quindi qualcosa non va bene in quello che hai scritto. Sentiti libero di contattare ScientiaMobile offline per verificare dove potrebbe essere la disconnessione. Grazie
Luca Passani il

4

ecco una fodera

function isMobile() {
  return (typeof window.orientation !== "undefined") || (navigator.userAgent.indexOf('IEMobile') !== -1);
};

3

Dipende dal caso d'uso. Tutti i dispositivi mobili richiedono una batteria. Se ciò che cerchi è la potenza di calcolo senza scaricare la batteria, utilizza l' API di stato della batteria :

navigator.getBattery().then(battery => {
  battery.charging ? 'charging' : 'not charging';
});

Se quello che stai cercando è l'uso della presentazione matchMedia, che restituisce un valore booleano:

if (window.matchMedia("(min-width: 400px)").matches) {
  /* the viewport is at least 400 pixels wide */
} else {
  /* the viewport is less than 400 pixels wide */
}

Oppure combinali per un'esperienza utente ancora migliore sui dispositivi tablet.


Si noti che l'API di stato della batteria viene rimossa dai browser.
Sora2455

L'API di stato della batteria è stata rimossa da Firefox ma rimane una raccomandazione del candidato W3C da luglio 2016 , continua a funzionare nei browser più diffusi ed è utile per modellare l'esperienza.
Josh Habdas,

2

Ecco una soluzione ECMAScript 6 (predisposta per TypeScript)

public isMobile(): boolean {
  let check = false;
  ((a => {
      if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check = true;
      }))(navigator.userAgent || navigator.vendor);
  return check;
 }

perché non solo restituire la ifcondizione invece di avere l'intera checkvariabile?
Vic

2

C'è un semplice trucco per rilevare se si tratta di un dispositivo mobile o meno. Controlla se esiste l'evento ontouchstart :

function isMobile()
{
    return "ontouchstart" in window;
}

3
Non funziona con laptop e computer desktop con monitor touchscreen. Inoltre sarà un problema con PC ibrido come Surface. Meno problemi con i desktop ma al giorno d'oggi ci sono più laptop touchscreen venduti.
blissfool,

2

Ho affrontato alcuni scenari in cui le risposte sopra non funzionano per me. Quindi ho pensato a questo. Potrebbe essere utile a qualcuno.

if(/iPhone|iPad|iPod|Android|webOS|BlackBerry|Windows Phone/i.test(navigator.userAgent)
 || screen.availWidth < 480){
//code for mobile
}

Dipende dal tuo caso d'uso. Se ti concentri sull'uso dello schermo screen.availWidtho puoi utilizzare document.body.clientWidthse desideri eseguire il rendering in base al documento.


1

Il migliore deve essere:

var isMobile = (/Mobile/i.test(navigator.userAgent));

Ma come dice Yoav Barnea ...

// Seem legit
var isMobile = ('DeviceOrientationEvent' in window || 'orientation' in window);
// But with my Chrome on windows, DeviceOrientationEvent == fct()
if (/Windows NT|Macintosh|Mac OS X|Linux/i.test(navigator.userAgent)) isMobile = false;
// My android have "linux" too
if (/Mobile/i.test(navigator.userAgent)) isMobile = true;

Dopo questi 3 test, spero che var isMobile sia ... ok


> Firefox mobile su Android non sembra avere "orientamento" nella finestra "
molokoloco,

1
Scusa .. ok per me funziona bene così adesso. "if (Modernizr.touch) / * ... * /" e continua ...
molokoloco

Mi chiedo solo come funzionerebbe Modernizr.touch su un dispositivo desktop touchscreen.
B2K,

Per renderlo più elegante, dovresti rendere tutto il codice te in un solo blocco if-else if-else if.
Heitor

1

Ecco la sua piena funzione

function isMobile(){
    return (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino|android|ipad|playbook|silk/i.test(navigator.userAgent||navigator.vendor||window.opera)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test((navigator.userAgent||navigator.vendor||window.opera).substr(0,4)))
}

jQuery.noConflict();
jQuery(document).ready(function(){
    if(isMobile()) alert("Mobile"); else alert("Not Mobile");
});

.substr (0,4) restituisce le prime 4 lettere. Come rileva "android. + Mobile"?
raacer,

1
@raacer ci sono in realtà due regex nella risposta (entrambi sulla stessa riga) - il primo controlla contro l'intera stringa UA e cerca Android, mobile ecc., mentre il secondo controlla solo con i primi 4 caratteri della UA .
JackW,

1
//true / false
function isMobile()
{
   return (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) ); 
}

inoltre puoi seguire questo tutorial per rilevare un cellulare specifico. Clicca qui .


Aggiungi Mobileal tuo RX
oriadam l'

1

che dire dell'utilizzo di "window.screen.width"?

if (window.screen.width < 800) {
// do something
}

o

if($(window).width() < 800) {
//do something
}

Immagino che questo sia il modo migliore perché ogni giorno c'è un nuovo dispositivo mobile!

(anche se penso che non sia supportato nei vecchi browser, ma provalo :))


1
Che dire del paesaggio?
Erick Voodoo,

1
Questo non è molto utile per alcuni scenari. Se il browser desktop viene ridimensionato,
potrebbe

Un PC è sostanzialmente diverso dai dispositivi mobili in termini di usabilità, risposta accettabile !!
Heitor

1

Nota che la maggior parte dei dispositivi mobili di nuova generazione ora ha risoluzioni maggiori di 600x400. cioè un iPhone 6 ....

Prova del test: eseguito qui i post più votati e più recenti, con un controllo facoltativo una volta eseguito in questo modo:

(function(a){
    window.isMobile = (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))
})(navigator.userAgent||navigator.vendor||window.opera);

alert("This browser was found to be a % browser.", window.isMobile ? 'mobile' : 'desktop');

In qualche modo, i seguenti risultati sono stati restituiti nelle seguenti app del browser. Specifiche: iPhone 6S, iOS 10.3.1.

Safari (più recente): rilevato come dispositivo mobile.

Chrome (più recente): non rilevato come dispositivo mobile.

Quindi, ho testato il suggerimento di Lanti ( https://stackoverflow.com/a/31864119/7183483 ) e ha restituito i risultati corretti (mobile per tutti i dispositivi iOS e desktop per il mio Mac). Pertanto, ho proceduto a modificarlo un po 'dal momento che avrebbe sparato due volte (sia per dispositivi mobili che per tablet). Ho notato poi durante i test su un iPad, che è tornato anche come dispositivo mobile, il che ha senso, dal momento che i parametri che Lantiutilizza controlla il sistema operativo più di ogni altra cosa. Pertanto, ho semplicemente spostato l'istruzione IF del tablet all'interno del controllo mobile, che restituirebbe il dispositivo mobile se il controllo Tablet era negativo e il tablet altrimenti. Ho quindi aggiunto la clausola else per il controllo del cellulare da restituire come desktop / laptop, poiché entrambi si qualificano, ma poi ho notato che il browser rileva CPU e sistema operativo. Quindi ho aggiunto ciò che viene restituito lì come parte dell'altro se l'istruzione invece. Per finire, ho aggiunto un'istruzione cautelativa nel caso in cui non venisse rilevato nulla. Vedi sotto, si aggiornerà presto con un test su un PC Windows 10.

Oh, e ho anche aggiunto una variabile 'debugMode', per passare facilmente dal debug alla compilazione normale.

Dichiarazione di non responsabilità: pieno merito a Lanti , anche che questo non è stato testato su tablet Windows ... che potrebbe restituire desktop / laptop, poiché il sistema operativo è Windows puro. Verificherò quando troverò un amico che ne usa uno.

function userAgentDetect() {
    let debugMode = true;
    if(window.navigator.userAgent.match(/Mobile/i)
        || window.navigator.userAgent.match(/iPhone/i)
        || window.navigator.userAgent.match(/iPod/i)
        || window.navigator.userAgent.match(/IEMobile/i)
        || window.navigator.userAgent.match(/Windows Phone/i)
        || window.navigator.userAgent.match(/Android/i)
        || window.navigator.userAgent.match(/BlackBerry/i)
        || window.navigator.userAgent.match(/webOS/i)) {
        if (window.navigator.userAgent.match(/Tablet/i)
            || window.navigator.userAgent.match(/iPad/i)
            || window.navigator.userAgent.match(/Nexus 7/i)
            || window.navigator.userAgent.match(/Nexus 10/i)
            || window.navigator.userAgent.match(/KFAPWI/i)) {
            window.deviceTypeVar = 'tablet';
            if (debugMode === true) {
                alert('Device is a tablet - ' + navigator.userAgent);
            }
        } else {
            if (debugMode === true) {
                alert('Device is a smartphone - ' + navigator.userAgent);
            };
            window.deviceTypeVar = 'smartphone';
        }
    } else if (window.navigator.userAgent.match(/Intel Mac/i)) {
        if (debugMode === true) {
            alert('Device is a desktop or laptop- ' + navigator.userAgent);
        }
        window.deviceTypeVar = 'desktop_or_laptop';
    } else if (window.navigator.userAgent.match(/Nexus 7/i)
        || window.navigator.userAgent.match(/Nexus 10/i)
        || window.navigator.userAgent.match(/KFAPWI/i)) {
        window.deviceTypeVar = 'tablet';
        if (debugMode === true) {
            alert('Device is a tablet - ' + navigator.userAgent);
        }
    } else {
        if (debugMode === true) {
            alert('Device is unknown- ' + navigator.userAgent);
        }
        window.deviceTypeVar = 'Unknown';
    }
}

1

Questa è solo una porta es6 della risposta accettata che sto usando nel mio progetto. Si noti che questo include anche i tablet.

export const isMobile = () => {
  const vendor = navigator.userAgent || navigator.vendor || window.opera;

  return !!(
    /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(
      vendor
    ) ||
    /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(
      vendor.substr(0, 4)
    )
  );
};

1

return 'ontouchstart' in window && window.screen.availWidth < 768

Che ne dici, si espande sulla risposta sopra ma controlla anche le dimensioni dello schermo


1

Utilizzando Regex (da detectmobilebrowsers.com ):

/* eslint-disable */
export const IS_MOBILE = (function (a) {
  return (
    /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i
      .test(
        a.substr(0,4)
      )
  )
  // @ts-ignore
})(navigator.userAgent || navigator.vendor || window.opera)
/* eslint-enable */

0

Questa potrebbe anche essere una soluzione.

var isMobile = false; //initiate as false

  // device detection
  if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent) 
  || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0,4))) isMobile = true;

  console.log('Mobile device:'+isMobile);

  var doc_h = $(document).height(); // returns height of HTML document
  var doc_w = $(document).width(); // returns width of HTML document
  console.log('Height: '+doc_h);
  console.log('width: '+doc_w);

  var iPadVertical = window.matchMedia("(width: 768px) and (height: 1024px) and (orientation: portrait)");
  var iPadHoricontal = window.matchMedia("(width: 1024px) and (height: 767px) and (orientation: landscape)");

  console.log('Height: '+doc_h);
  console.log('width: '+doc_w);

  if (iPadVertical.matches) {
      console.log('Ipad vertical detected');
  }else if (iPadHoricontal.matches){
      console.log('Ipad horicontal detected');
  }else {
      console.log('No Ipad');
  }

Se usi entrambi i metodi, otterrai un modo perfetto per rilevare diversi dispositivi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.