How to prevent the default context menu from appearing on long press?

Undgå uønskede menuer på din mobilweb

23/10/2022

Rating: 4.74 (7204 votes)

Indholdsfortegnelse

Forhindring af Standard Kontekstmenu ved Langt Tryk på Mobile Enheder

Når du udvikler webapplikationer specifikt til mobile enheder, især dem der kører på iOS som iPhone og iPad, kan du støde på en uventet udfordring: standardkontekstmenuen, der dukker op, når en bruger foretager et langt tryk. Dette kan være særligt frustrerende i applikationer, hvor et langt tryk er tiltænkt en anden funktion, såsom i spil eller interaktive elementer. Heldigvis findes der en enkel og effektiv løsning ved hjælp af CSS.

How does Google Assistant function?
Google Assistant can play your favorite songs, hear incoming messages and notifications, give directions, and do much more. To use it, simply press and hold the 'Assistant' button and say what you need. Google Assistant is now available on Android and iPhone.

Forestil dig at bygge et avanceret webbaseret spil, hvor et langt tryk på en bestemt genstand skal udløse en unik handling. Hvis standard iOS-menuen, der tilbyder muligheder som "Kopiér", "Indsæt" eller "Gem billede", popper op i stedet, bryder det fuldstændig med den tilsigtede brugeroplevelse. Ligeledes kan uønsket tekstmarkering ved et utilsigtet langt tryk forstyrre brugerens interaktion med din applikation.

Problemet: Den Uønskede Kontekstmenu og Tekstmarkering

På mobile browsere, og især i Mobile Safari på Apple-enheder, er standardadfærden ved et langt tryk på et interaktivt element eller tekst at enten fremhæve teksten eller vise en kontekstmenu. Dette er en generel funktion designet til at give brugerne adgang til almindelige handlinger. Men i mange moderne webapplikationer, hvor brugergrænsefladen er finjusteret til specifikke interaktioner, kan denne standardadfærd være en betydelig hindring for en glat og intuitiv brugeroplevelse. Det er her, vi skal gribe ind.

Løsningen: CSS til Kontrol af Brugerinteraktioner

Heldigvis er det relativt nemt at deaktivere disse standardfunktioner ved hjælp af et par specifikke CSS-egenskaber. Disse egenskaber er primært rettet mod WebKit-baserede browsere, hvilket inkluderer Safari på iOS. Ved at anvende disse egenskaber globalt eller på specifikke elementer, kan du fuldstændig kontrollere, hvordan brugerne interagerer med dit indhold via lange tryk.

De Afgørende CSS-Egenskaber

De to mest effektive CSS-egenskaber til at opnå dette er:

  • -webkit-user-select: none;
  • -webkit-touch-callout: none;

Lad os dykke ned i, hvad hver af disse gør:

-webkit-user-select: none;

Denne egenskab styrer, om brugeren kan vælge tekst eller andre elementer på en webside. Når den sættes til none, forhindrer den effektivt brugeren i at markere tekst. Dette betyder, at selvom brugeren holder fingeren nede på et stykke tekst, vil det ikke blive fremhævet, og der vil ikke blive igangsat en kopieringshandling. Dette er afgørende for at forhindre utilsigtet tekstmarkering, der kan følge med et langt tryk.

-webkit-touch-callout: none;

Denne egenskab er specifikt designet til at forhindre den standardkontekstmenu, der vises, når en bruger foretager et langt tryk på et element på mobile enheder. Ved at sætte den til none, sikrer du, at når en bruger holder fingeren nede på et element, vil denne menu simpelthen ikke dukke op. Dette giver dig fuld kontrol over, hvilke handlinger der kan udføres ved et langt tryk.

Praktisk Implementering: Et Komplet Eksempel

For at illustrere, hvordan disse CSS-egenskaber fungerer i praksis, lad os oprette en simpel HTML-side. Vi vil anvende disse egenskaber på hele dokumentet for at demonstrere den globale effekt, og derefter style et specifikt element for at vise, hvordan det ser ud på et enkelt interaktivt element.

HTML og CSS Kode

Forhindr Kontekstmenu ved Langt Tryk

Forhindr Standard Kontekstmenu ved Langt Tryk

Prøv et langt tryk her!

Hold fingeren nede på boksen ovenfor. Du vil bemærke, at der hverken dukker en kontekstmenu op, eller at teksten bliver markeret.

Forklaring af Koden

  • Globale CSS-Egenskaber: Ved at anvende -webkit-user-select: none; og -webkit-touch-callout: none; direkte på html-elementet, sikrer vi, at disse begrænsninger gælder for hele websiden. Dette er den mest effektive måde at implementere denne funktionalitet på, hvis du ønsker at forhindre disse handlinger overalt på dit site.
  • Styleret Element: Klassen .interaktivt-element bruges til at skabe en visuelt tiltalende boks, der fungerer som et eksempel. Når du interagerer med dette element på en iOS-enhed, vil du se, at den tilsigtede effekt (ingen menu, ingen markering) er aktiv. De tilføjede hover-effekter og styling gør elementet mere engagerende og demonstrerer, at standardadfærden er blevet overskrevet, uden at forhindre andre visuelle feedback-mekanismer.

Yderligere Overvejelser og Bedste Praksis

Mens disse CSS-egenskaber er meget effektive, er det vigtigt at overveje, hvordan de påvirker den generelle brugeroplevelse. Hvis du deaktiverer tekstmarkering og kontekstmenuer globalt, kan det forhindre brugere i at udføre legitime handlinger, som de forventer at kunne, såsom at kopiere vigtig information fra din side. Derfor kan det være en god idé kun at anvende disse egenskaber på specifikke elementer, hvor det er strengt nødvendigt, f.eks. i spil eller interaktive komponenter, hvor lange tryk har en defineret, ikke-standardiseret funktion.

Anvendelse på Specifikke Elementer

Hvis du kun vil deaktivere kontekstmenuen for et bestemt element, kan du anvende CSS-klasser direkte på det pågældende element i din HTML:

Bevæg dette objekt!

Eller bedre, definer en klasse i din CSS:

.ingen-kontekstmenu { -webkit-user-select: none; -webkit-touch-callout: none; }

Og anvend den på dit element:

Bevæg dette objekt!

Alternativer og JavaScript

Selvom CSS-løsningen er den mest ligetil og anbefalede metode til at forhindre den standardkontekstmenu, kan der i mere komplekse scenarier være behov for JavaScript. Du kan bruge JavaScript til at lytte efter touchstart og touchend events samt contextmenu events og forhindre deres standardadfærd med event.preventDefault(). Dette giver en endnu større grad af kontrol, men medfører også øget kompleksitet.

Her er et simpelt JavaScript-eksempel:

document.addEventListener('contextmenu', function(e) { e.preventDefault(); }); document.getElementById('dit-element-id').addEventListener('touchstart', function(e) { // Yderligere logik kan tilføjes her });

Det er dog vigtigt at bemærke, at CSS-løsningen generelt er mere performant og enklere for denne specifikke opgave.

Tabel: Sammenligning af Metoder

Her er en hurtig sammenligning af CSS-metoden versus JavaScript:

MetodeFordeleUlemperBedst til
CSS (-webkit-user-select, -webkit-touch-callout)Enkel, høj performance, ingen JavaScript nødvendigPrimært effektive på WebKit/Safari; mindre kontrol over specifikke touch-eventsForhindre standardkontekstmenu og tekstmarkering overalt eller på specifikke elementer.
JavaScript (event.preventDefault())Fuld kontrol over alle touch-events, kan bruges på tværs af browsere (med korrekt implementering)Mere kompleks, potentiel performance-påvirkning, kræver kendskab til event-håndteringMeget specifikke interaktioner, hvor CSS alene ikke er nok, eller hvor der kræves kompleks logik baseret på touch-events.

Ofte Stillede Spørgsmål (FAQ)

  • Virker disse CSS-egenskaber på Android?
    -webkit-user-select virker bredt i mange browsere, herunder Chrome på Android, for at forhindre tekstmarkering. -webkit-touch-callout er dog primært en WebKit/Safari-specifik egenskab og har ikke samme effekt på Android. For Android kan du normalt stole på user-select: none; for at forhindre markering, men kontekstmenuen kan stadig opføre sig anderledes.
  • Kan jeg kun forhindre det på billeder?
    Ja, du kan anvende disse CSS-egenskaber på ethvert HTML-element, herunder <img>, <div>, <button> osv. Du skal blot målrette elementet med din CSS-selektor.
  • Er der en standard CSS-egenskab, der gør det samme?
    Ja, standard CSS-egenskaben er user-select: none;. Den er bredt understøttet, men -webkit-user-select er stadig nødvendig for fuld kompatibilitet med ældre versioner af Safari og for at sikre den mest pålidelige adfærd på iOS. -webkit-touch-callout har ingen direkte standardiseret ækvivalent, der specifikt forhindrer kontekstmenuen på samme måde.
  • Hvad hvis jeg vil have brugeren til at kunne vælge noget tekst, men ikke åbne menuen?
    Dette er en mere kompleks situation. Du kan forsøge at bruge JavaScript til at lytte efter longpress events og kun forhindre contextmenu eventen, mens du tillader standard tekstmarkering. Dog kan det være svært at skelne præcist mellem et ønske om at markere tekst og et ønske om at åbne menuen for brugeren. Ofte er det bedst at vælge en klar interaktionsmodel.

Konklusion

At forhindre standardkontekstmenuen og tekstmarkering ved et langt tryk på mobile enheder, især iOS-enheder, er en vigtig overvejelse for mobilwebudviklere. Ved at anvende de kraftfulde CSS-egenskaber -webkit-user-select: none; og -webkit-touch-callout: none; kan du effektivt styre disse interaktioner og skabe en mere poleret og målrettet brugeroplevelse. Husk at anvende disse egenskaber med omhu og overvej, hvor de bedst tjener formålet med din applikation for at undgå at begrænse brugerens muligheder unødvendigt.

Hvis du vil læse andre artikler, der ligner Undgå uønskede menuer på din mobilweb, kan du besøge kategorien Teknologi.

Go up