How do I know if a user's device is mobile?

Sådan Opdager Du Mobile Enheder med JavaScript

18/03/2022

Rating: 4.62 (8483 votes)

I dagens digitale landskab er internettet tilgængeligt på et utal af enheder – fra kraftfulde stationære computere til slanke smartphones, tablets og endda bærbare gadgets. Som udviklere er det vores ansvar at sikre, at websteder er tilgængelige og responsive, uanset hvilken enhed brugeren benytter. Men hvordan skelner man effektivt mellem en mobil enhed og en stationær computer? Mens CSS-medieforespørgsler er fremragende til at styre layout og styling, er de begrænsede, når det kommer til at tilpasse funktionalitet. Her kommer JavaScript ind i billedet som et uundværligt værktøj.

What is mobile detect in JavaScript?
Mobile-Detect A lightweight PHP class for detecting mobile devices (including tablets). This is the "source" of this JavaScript project and if you use PHP on your server you should use it!

Ved at udnytte JavaScript kan vi dynamisk identificere, om en hjemmeside bliver vist fra en smartphone, en tablet eller en traditionel desktop-computer. Denne indsigt giver os mulighed for at skræddersy brugeroplevelsen, optimere ydeevnen og levere indhold, der er perfekt tilpasset den specifikke enhed. Lad os dykke ned i de forskellige metoder, der er tilgængelige for at opnå dette.

Indholdsfortegnelse

navigator.userAgent: Den Klassiske Tilgang

En af de ældste og mest ligefremme metoder til at detektere enhedstypen er gennem navigator.userAgent-egenskaben. Denne streng indeholder detaljer om browseren og operativsystemet i almindelig tekstformat. Ved at matche denne streng mod specifikke mønstre kan vi identificere potentielle mobile enheder.

Et simpelt JavaScript-eksempel kunne se således ud:

var isMobile = /iPhone|iPad|iPod|Android|webOS|BlackBerry|Windows Phone/i.test(navigator.userAgent); var element = document.getElementById('text'); if (isMobile) { element.innerHTML = "Du bruger en mobil enhed."; } else { element.innerHTML = "Du bruger en stationær computer."; }

Denne kode erklærer en variabel isMobile, der tester navigator.userAgent mod et regulært udtryk. Hvis det regulære udtryk finder et match (f.eks. 'iPhone', 'Android' osv.), returnerer test()-funktionen true, og vi ved, at det sandsynligvis er en mobil enhed. Ellers er det en stationær computer.

Fordele og Ulemper ved userAgent

Den primære fordel ved navigator.userAgent er dens simplicitet. Den kræver ingen eksterne biblioteker og kan implementeres hurtigt. Den er ideel til hurtige tjek, såsom at omdirigere brugere til en mobiloptimeret version af en hjemmeside eller vise en simpel advarsel.

Dog har navigator.userAgent også betydelige ulemper. Den største ulempe er, at userAgent-strengen let kan manipuleres eller 'spoofes' af brugeren. Desuden er den ikke altid pålidelig, da nye enheder og operativsystemer konstant dukker op, hvilket kræver løbende opdatering af de regulære udtryk. Ved at basere sig udelukkende på userAgent risikerer man at overse nye enheder eller fejlagtigt identificere dem. Dette gør metoden mindre robust til komplekse eller fremtidssikre løsninger.

Anvendelseseksempler med userAgent

Udover grundlæggende mobil/desktop-detektion kan navigator.userAgent bruges til mere specifikke formål:

1. Advarsel om forældet browser

Man kan bruge userAgent til at tjekke browserversion og advare brugere, hvis de anvender en forældet eller ikke-understøttet browser. Dette er især nyttigt, hvis din applikation kræver specifikke browserfunktioner, der kun findes i nyere versioner.

var userAgent = navigator.userAgent; var browserVersion = userAgent.substring(userAgent.indexOf("Chrome") + 7); if (parseFloat(browserVersion) < 107) { alert("Din browser er forældet og understøttes ikke. Opgrader venligst til den nyeste version."); }

I dette eksempel bruges indexOf("Chrome") + 7 til at finde startpositionen for Chrome-versionsnummeret. Tallet 7 tæller 'Chrome' plus det efterfølgende mellemrum, så udtrækningen starter lige efter disse tegn. Dette er en simpel måde at isolere versionsnummeret på fra den længere userAgent-streng.

2. Omdirigering til mobil version

Hvis du har en separat mobiloptimeret version af din hjemmeside, kan du omdirigere mobile brugere automatisk:

if (navigator.userAgent.match(/Android|webOS|iPhone|iPad|iPod|BlackBerry|Windows Phone/i)) { window.location = "https://www.dinhjemmeside.com/mobil"; }

Denne metode er enkel, men det er vigtigt at overveje, om en fuldstændig omdirigering er den bedste brugeroplevelse sammenlignet med et responsivt design, der tilpasser sig dynamisk.

3. Visning af indhold baseret på browser

I nogle tilfælde ønsker man at vise specifikt indhold baseret på den detekterede browser, f.eks. forskellige downloadlinks. Her kan en funktion, der detekterer browsertype, være nyttig:

function detectBrowser() { let userAgent = navigator.userAgent; let browserName; if (userAgent.match(/chrome|chromium|crios/i)) { browserName = "Chrome"; } else if (userAgent.match(/firefox|fxios/i)) { browserName = "Firefox"; } else if (userAgent.match(/safari/i)) { browserName = "Safari"; } else if (userAgent.match(/opr\//i)) { browserName = "Opera"; } else if (userAgent.match(/edg/i)) { browserName = "Edge"; } else if (userAgent.match(/android/i)) { browserName = "Android"; } else if (userAgent.match(/iphone/i)) { browserName = "iPhone"; } else { browserName = "Ukendt"; } document.querySelector("div.form-style h3").innerText = "Du browser med: " + browserName + ""; }

Denne funktion kan udvides eller forkortes afhængigt af, hvilke browsere du ønsker at detektere og reagere på.

TouchEvent: Detektering af Touchskærm

En alternativ metode til at detektere mobile brugere er at tjekke, om enheden har en touchskærm. Mobile enheder interagerer typisk via berøring, mens stationære computere oftest bruger mus og tastatur. Ved at kontrollere tilstedeværelsen af ontouchstart-egenskaben på dokumentets rodbaserede element kan vi få en indikation af touch-funktionalitet.

if ("ontouchstart" in document.documentElement) { // Indhold eller funktionalitet for touch-skærm (mobile) enheder } else { // Indhold eller funktionalitet for alle andre (desktop) enheder }

Denne metode er mere robust end userAgent i den forstand, at den ikke er baseret på en streng, der kan spoofes. Den detekterer en fysisk egenskab ved enheden. En af dens fordele er, at den er enkel og direkte. Dog er en væsentlig ulempe, at ikke alle touchskærmsenheder nødvendigvis er 'mobile' i den traditionelle forstand. For eksempel vil en stationær computer med touchskærm (som Microsoft Surface-enheder) også returnere true for ontouchstart, men den er stadig en stationær enhed. Dette betyder, at den ikke alene kan bruges til at skelne mellem mobil og desktop i alle scenarier, men den er nyttig, hvis din primære bekymring er interaktionsmetoden (berøring vs. mus).

Window.matchMedia(): Integration med CSS Medieforespørgsler

Window.matchMedia() er en af de mere moderne og kraftfulde egenskaber til at detektere enhedstyper med JavaScript, primært fordi den giver dig mulighed for at interagere direkte med CSS-medieforespørgsler. Dette er særligt nyttigt, da medieforespørgsler allerede er designet til at håndtere responsivt design.

Du kan f.eks. tjekke, om enhedens primære pegeredskab er 'groft' (pointer:coarse), hvilket typisk indikerer en touchskærm:

let isMobile = window.matchMedia("(pointer:coarse)").matches;

Alternativt kan du tjekke, om *nogen* af enhedens pegeredskaber er grove (any-pointer:coarse), hvilket fanger tilfælde, hvor en enhed har både en fin (f.eks. mus) og en grov (f.eks. finger) pointer:

let isMobile = window.matchMedia("(any-pointer:coarse)").matches;

Disse forespørgsler validerer, om enhedens pointer er fin (præcis, som en mus) eller grov (mindre præcis, som en finger). En fordel ved denne metode er, at den er tæt knyttet til responsivt design og kan give en mere semantisk forståelse af, hvordan brugeren interagerer med enheden. En ulempe er, at en grov pointer ikke nødvendigvis garanterer, at det er en mobiltelefon – det kan også være en tablet eller en touchskærmslaptop.

Does Internet Explorer detect iOS devices?
Internet Explorer on this device contains a message '...like iPhone OS...' in the user agent string and thus will return true on this test. After iOS 13 you should detect iOS devices like this, since iPad will not be detected as iOS devices by old ways (due to new "desktop" options, enabled by default):

For en mere direkte detektion af mobilskærmstørrelse kan du bruge en medieforespørgsel til maksimal bredde:

let isMobile = window.matchMedia("only screen and (max-width: 480px)").matches;

Denne forespørgsel tjekker direkte enhedens maksimale bredde og afgør, om den matcher kriterierne. Fordelen er klar: du kan definere præcise skærmstørrelser, der traditionelt associeres med mobile enheder. Ulempen er dog, at skærmstørrelse ikke altid er lig med enhedstype. Tablets kan have større skærme, og nye, foldbare telefoner kan ændre skærmstørrelse dynamisk. Desuden kan pixels pr. tomme (DPI) variere, hvilket gør det svært at stole udelukkende på pixelbredde. Selvom Window.matchMedia() er fleksibel, kræver den omhyggelig definition af medieforespørgsler for at opnå en omfattende detektion.

Biblioteker til Detektering af Mobile Enheder

Mens de indbyggede JavaScript-egenskaber er nyttige til simple detektioner, bliver opgaven mere kompleks, hvis du har brug for en robust, fremtidssikret og omfattende løsning. Nye enheder, browsere og operativsystemer dukker konstant op, hvilket gør det tidskrævende at vedligeholde dine egne regulære udtryk og logikker. Her kommer specialiserede JavaScript-biblioteker ind i billedet. De er designet til at håndtere de mange nuancer og særheder ved enhedsdetektion og er ofte opdaterede med de seneste oplysninger.

Her er nogle af de mest populære JavaScript-biblioteker til detektering af mobile enheder:

UAParser.js

UAParser.js er et af de mest omfattende og populære biblioteker til parsing af User-Agent-strenge. Med millioner af ugentlige downloads er det de facto-løsningen for mange udviklere. Biblioteket kan parse hundredvis af enhedsvariationer, herunder operativsystemer, browsere, CPU-arkitektur og enhedstyper (mobil, tablet, desktop, konsol, wearable osv.). Dets styrke ligger i dets detaljegrad og løbende vedligeholdelse, hvilket gør det til et robust valg for næsten ethvert projekt, der kræver dybdegående enhedsdetektion.

mobile-detect.js

mobile-detect.js er en ligefrem port af det populære Mobile Detect-bibliotek til PHP. Ligesom UAParser.js bruger det User-Agent-strenge til detektion. Selvom det er mere simpelt end UAParser.js, er det stadig en solid løsning til almindelige HTML-skabeloner eller porteføljeprojekter, hvor en hurtig og nem implementering er ønsket.

isMobile

isMobile er endnu et bibliotek, der bygger på User-Agent-egenskaben, men det tilbyder en række specifikationer. Du kan teste for enhver mobil enhed eller mere specifikt for telefoner eller tablets. Dets enkelhed og klare API gør det nemt at integrere og bruge, hvis du har brug for en letvægtsløsning med specifikke mobil- og tablet-tjek.

react-device-detect

For React.js-udviklere er react-device-detect et oplagt valg. Dette bibliotek detekterer enhedstypen og render derefter visningen baseret på denne type. Det fungerer problemfrit med komponentintegration og kan tilpasses yderligere via API-kald. Det dækker et bredt spektrum af enheder, herunder smart-tv'er, wearables og en række iPhone-modeller, hvilket giver en høj grad af fleksibilitet, når du designer specifikke brugeroplevelser til forskellige enhedskategorier.

Sammenligning af JavaScript-detektionsmetoder og -biblioteker

For at give et bedre overblik over de forskellige tilgange, er her en sammenligningstabel:

Metode/BibliotekStyrkerSvaghederBedst Egnet Til
navigator.userAgentSimpel, ingen biblioteker påkrævet.Kan spoofes, kræver løbende vedligeholdelse, unøjagtig for nye/ukendte enheder.Hurtige, grundlæggende tjek; omdirigeringer.
TouchEventDetekterer fysisk touch-funktionalitet, mere pålidelig end userAgent for input.Detekterer ikke nødvendigvis 'mobil', touch-laptops kan forvirre resultatet.Tilpasning af interaktion baseret på touch/ikke-touch.
Window.matchMedia()Integreres med CSS, fleksibel med medieforespørgsler (f.eks. pointer, bredde).Kræver omhyggelig definition af medieforespørgsler, skærmstørrelse er ikke altid lig med enhedstype.Avanceret responsiv funktionalitet, tilpasning baseret på inputtype.
UAParser.jsMeget omfattende, præcis, opdateret med nye enheder, detaljeret information.Større filstørrelse end simple scripts, kan være overkill for simple behov.Komplekse applikationer, dybdegående enhedsanalyser, robuste løsninger.
mobile-detect.js / isMobileEnkle at bruge, lette.Baseret på userAgent (samme svagheder), mindre detaljerede end UAParser.js.Letvægtsløsninger, porteføljeprojekter, simple mobil/tablet-tjek.
react-device-detectSpecifik for React, komponentbaseret, bred dækning af enhedstyper.Kun for React-projekter.React-baserede applikationer, der kræver detaljeret enhedsdetektion og komponentrendering.

Hvorfor er Mobil Detektion Nyttig?

Selvom responsivt design er grundlaget for moderne webudvikling, kan mobil detektion i JavaScript tilføje et ekstra lag af tilpasning og optimering:

  • Skræddersyet UI/UX: Du kan vise forskellige navigationsmenuer, indholdsformater eller interaktionsmønstre, der er optimeret specifikt til mobile touchskærme versus desktop med mus. Dette kan forbedre brugervenligheden markant.
  • Ydeevneoptimering: Ved at detektere en mobilenhed kan du vælge at indlæse lettere billeder, færre scripts eller en simplere version af en applikation for at reducere indlæsningstider og dataforbrug. Dette er kritisk for brugere med langsomme internetforbindelser eller begrænsede dataabonnementer.
  • Betinget indlæsning af funktioner: Nogle JavaScript-funktioner eller tredjepartsbiblioteker er måske kun relevante for desktop-brugere (f.eks. avancerede animationer eller mus-baserede spil) eller mobile brugere (f.eks. integration med native mobilfunktioner som kamera eller GPS). Detektion giver dig mulighed for kun at indlæse disse, når det er nødvendigt.
  • A/B-testning: Du kan udføre A/B-tests specifikt for mobilbrugere for at se, hvilke design- eller funktionsændringer der fungerer bedst på små skærme.
  • Analytisk indsigt: At vide, hvilken enhedstype en bruger kommer fra, kan give værdifuld indsigt i din brugerbase og hjælpe med at informere fremtidige udviklingsbeslutninger.

Overvejelser og Begrænsninger

Det er vigtigt at huske, at ingen detektionsmetode er perfekt, og alle har deres begrænsninger:

  • Spoofing: Som nævnt kan User-Agent-strenge manipuleres, hvilket gør dem mindre pålidelige for sikkerhedskritiske funktioner.
  • Fremtidssikring: Webverdenen udvikler sig hurtigt. Nye enhedstyper (foldbare telefoner, blandede virkelighedsheadsets) og browsere kan hurtigt gøre eksisterende detektionslogikker forældede. Regelmæssig opdatering af dine detektionsstrategier er nødvendig.
  • Hybridenheder: Enheder som touchskærms-laptops eller tablets med aftagelige tastaturer udvisker grænserne mellem mobil og desktop. En enhed kan have både en grov pointer (touch) og en fin pointer (mus/touchpad).
  • Responsivt design først: Mobil detektion bør ses som et supplement til, ikke en erstatning for, responsivt webdesign. Responsive principper sikrer, at dit layout og indhold tilpasser sig alle skærmstørrelser og retninger, mens detektion giver dig mulighed for at tilføje specifik funktionalitet eller ydeevneoptimering, der går ud over den visuelle tilpasning.

Ofte Stillede Spørgsmål (FAQ)

Q: Hvorfor kan jeg ikke bare bruge CSS-medieforespørgsler?

A: CSS-medieforespørgsler er fremragende til at styre layout, styling og præsentation af dit websted baseret på skærmstørrelse, opløsning og andre enhedsegenskaber. De er ideelle til at gøre dit design responsivt. Men de kan ikke ændre JavaScript-funktionalitet, indlæse forskellige scripts, foretage omdirigeringer eller tilpasse interaktionslogik dynamisk. Til disse formål har du brug for JavaScript-baseret detektion.

Q: Er navigator.userAgent en pålidelig metode?

A: navigator.userAgent er simpel og fungerer til grundlæggende tjek, men den er ikke den mest pålidelige løsning. Strengen kan spoofes af brugere, og den kræver konstant vedligeholdelse for at holde trit med nye enheder og browsere. For simple omdirigeringer eller ikke-kritiske funktioner kan den være tilstrækkelig. For mere robust og fremtidssikret detektion anbefales det at bruge mere avancerede metoder eller specialiserede biblioteker.

Q: Hvornår skal jeg bruge et bibliotek i stedet for min egen kode?

A: Du bør overveje et bibliotek, hvis du har brug for en robust og omfattende løsning, der dækker mange forskellige enhedstyper og browsere. Biblioteker som UAParser.js vedligeholdes aktivt af fællesskabet og håndterer mange af de kompleksiteter og særheder, du ellers selv skulle håndtere. Hvis dit behov er simpelt (f.eks. kun at skelne mellem telefon og desktop), kan enkle JavaScript-snippets være nok. For komplekse applikationer, hvor præcis detektion er vigtig, er et bibliotek næsten altid det bedste valg.

Q: Er der ydeevnemæssige konsekvenser ved mobil detektion?

A: For simple JavaScript-tjek som navigator.userAgent er ydeevnepåvirkningen minimal og ubetydelig. Brug af større biblioteker vil tilføje en smule til den samlede JavaScript-filstørrelse og eksekveringstid, men for de fleste moderne websteder er denne overhead også forsvindende lille. Den potentielle forbedring i brugeroplevelse og ydeevne gennem optimeret indhold og funktionalitet overstiger typisk den minimale overhead fra detektionskoden.

Q: Kan jeg detektere mobilenheder på serversiden?

A: Ja, det er også muligt at detektere mobilenheder på serversiden ved at inspicere User-Agent-headeren, som sendes med hver HTTP-anmodning. Dette kan være nyttigt til at servere forskellige HTML-strukturer eller aktiver, før JavaScript overhovedet indlæses i browseren. Serverside-detektion lider dog af de samme ulemper som clientside User-Agent-detektion (spoofing, vedligeholdelse af lister over User-Agent-strenge). Ofte kombineres serverside- og clientside-detektion for den mest robuste løsning.

Konklusion

Mobil detektion forbliver en kritisk komponent i moderne webudvikling, da den direkte påvirker brugeroplevelsen og effektiviteten af din applikation. Mens dedikerede biblioteker som UAParser.js tilbyder omfattende løsninger, kan en mere ligefrem tilgang være tilstrækkelig i visse situationer. De JavaScript-teknikker, vi har udforsket her – lige fra den ældre navigator.userAgent til den mere sofistikerede Window.matchMedia() – præsenterer et væld af muligheder, der er skræddersyet til forskellige behov og projektomfang.

Husk, at hver metode har sine egne fordele og begrænsninger. At vælge den rigtige handler om at forstå dit projekts specifikke krav og afveje simplicitet mod robusthed og fremtidssikring. Uanset om du er en erfaren udvikler eller lige er startet, giver disse teknikker og biblioteker et solidt fundament for at detektere mobile brugere, hvilket giver dig mulighed for at bygge mere responsive og adaptive digitale oplevelser.

Hvis du vil læse andre artikler, der ligner Sådan Opdager Du Mobile Enheder med JavaScript, kan du besøge kategorien Teknologi.

Go up