Is swipeleft available in jQuery Mobile?

Forstå 'Swipe'-begivenheder i JavaScript

03/01/2023

Rating: 4.19 (1788 votes)

I den moderne verden af smartphones, tablets og touchskærme er intuitive brugergrænseflader altafgørende. Blandt de mest grundlæggende og udbredte interaktioner finder vi 'swipe'-begivenheden – den hurtige bevægelse af en finger hen over skærmen i en bestemt retning. Denne simple gestus åbner op for et væld af muligheder, fra at bladre gennem billedgallerier og skifte mellem faner til at slette e-mails med et snuptag. Men på trods af dens allestedsnærværende karakter er der ingen indbygget 'onswipe'-begivenhed direkte tilgængelig i standard JavaScript. Dette betyder, at udviklere selv skal konstruere denne funktionalitet ved hjælp af de mere grundlæggende touch-begivenheder, der er tilgængelige i browseren. Denne artikel vil udforske, hvad en 'swipe'-begivenhed er, hvordan den kan implementeres, de udfordringer man kan støde på, og hvordan populære biblioteker som jQuery Mobile tackler dette.

What is a 'swipe' event in JavaScript?
In JavaScript, a 'swipe' event is the act of quickly moving your finger across the touch surface in a certain direction. Although there is no built-in 'onswipe' event, we can implement one using the available touch events and define what constitutes a 'swipe'.
Indholdsfortegnelse

Hvad er en 'swipe'-begivenhed i JavaScript?

En 'swipe'-begivenhed refererer til handlingen, hvor en bruger hurtigt bevæger en finger hen over en touch-overflade i en bestemt retning – typisk vandret (venstre/højre) eller lodret (op/ned). Selvom konceptet er ligetil for brugeren, er det for udvikleren en sammensætning af flere underliggende touch-begivenheder: touchstart, touchmove og touchend. Når en finger rører skærmen (touchstart), bevæges den (touchmove), og til sidst løftes den fra skærmen (touchend). For at definere en 'swipe' skal vi analysere data fra disse begivenheder, herunder start- og slutpositioner, bevægelsens hastighed og den samlede distance. En 'swipe' adskiller sig fra et 'tryk' (tap) eller et 'langt tryk' (long press) ved sin retningsbestemte bevægelse og typisk også sin hastighed.

Målet med at implementere en 'swipe'-begivenhed er at give en flydende og responsiv brugeroplevelse, der føles naturlig på touch-enheder. Uden en indbygget 'onswipe'-begivenhed i DOM (Document Object Model) er vi nødt til at skrive kode, der fanger disse individuelle touch-begivenheder og derefter beregner, om den registrerede bevægelse opfylder kriterierne for en 'swipe'. Dette indebærer ofte at bestemme en minimumsbevægelsesafstand (en 'tærskel') og en maksimumstid, inden for hvilken bevægelsen skal fuldføres, for at blive betragtet som en 'swipe' og ikke blot en 'træk'-begivenhed (drag) eller en utilsigtet scrolling.

Implementering af 'swipe'-begivenheder fra bunden

At skabe en 'swipe'-begivenhed fra bunden kræver en forståelse af de lavniveau touch-begivenheder. Lad os gennemgå processen:

  1. Registrering af startposition: Når touchstart-begivenheden udløses, skal vi gemme fingerens X- og Y-koordinater. Dette er udgangspunktet for vores swipe-detektion. Vi skal også notere tidspunktet for denne begivenhed.
  2. Sporing af bevægelse: Mens fingeren bevæger sig hen over skærmen, udløses touchmove-begivenheden gentagne gange. Selvom vi kunne spore alle disse punkter, er det ofte tilstrækkeligt at fokusere på start- og slutpunkterne for at bestemme retningen og afstanden. Dog kan touchmove bruges til at forhindre standard scroll-adfærd.
  3. Bestemmelse af slutposition og beregning: Når fingeren løftes fra skærmen (touchend-begivenheden), får vi fat i de endelige X- og Y-koordinater samt sluttidspunktet. Nu kan vi beregne:
    • Den horisontale afstand (deltaX): Forskellen mellem start-X og slut-X.
    • Den vertikale afstand (deltaY): Forskellen mellem start-Y og slut-Y.
    • Tidsinterval: Forskellen mellem starttidspunkt og sluttidspunkt.
  4. Anvendelse af tærskler: For at afgøre, om bevægelsen var en 'swipe', sammenligner vi deltaX, deltaY og tidsintervallet med foruddefinerede tærskler. For eksempel kunne en horisontal swipe kræve en deltaX på mindst 50 pixels og et tidsinterval på maksimalt 300 millisekunder. Hvis deltaX er betydeligt større end deltaY, indikerer det en horisontal swipe (venstre eller højre, afhængigt af fortegnet på deltaX). Hvis deltaY er større, er det en vertikal swipe.
  5. Forhindring af standardadfærd: Det er ofte nødvendigt at kalde event.preventDefault()touchmove-begivenheden for at forhindre browseren i at udføre sin standard scroll-adfærd, når brugeren forsøger at swipe et element. Dette er afgørende for en god brugeroplevelse og for at sikre, at din swipe-logik udføres korrekt.

Denne manuelle implementering giver fuld kontrol, men den kan være kompleks at håndtere alle edge cases, såsom multi-touch, små utilsigtet bevægelser eller interaktion med andre DOM-elementer.

Udfordringer ved implementering af 'swipe' fra bunden

Selvom det er muligt at implementere swipe-begivenheder fra bunden, er der flere udfordringer, der gør det komplekst og tidskrævende:

  • Tærskelværdier: At finde de optimale tærskelværdier for distance og tid kan være vanskeligt. Hvis tærsklen er for lav, kan utilsigtede bevægelser registreres som swipes. Hvis den er for høj, kan brugere have svært ved at udløse swipen. Disse værdier kan også variere afhængigt af enhedstypen og skærmstørrelsen.
  • Forhindring af scroll: Som nævnt er event.preventDefault() afgørende. Men forkert brug kan forhindre brugere i at scrolle normalt på elementer, der burde være scrollbare. En balance skal findes, så scroll kun forhindres, når en swipe er tydeligt i gang.
  • Multi-touch og gestuskonflikter: Hvad sker der, hvis brugeren bruger to fingre? Eller hvis en 'swipe' ligner et 'knib' (pinch) for at zoome? At skelne mellem forskellige gestus kan være meget komplekst.
  • Ydeevne: Overdreven brug af touchmove-lyttere, der udfører tunge beregninger, kan påvirke ydeevnen, især på ældre eller mindre kraftfulde enheder. Brug af requestAnimationFrame eller event throttling/debouncing kan hjælpe.
  • Krydsbrowser-kompatibilitet: Selvom touch-begivenheder er standardiserede, kan der stadig være små forskelle i implementeringen på tværs af forskellige browsere og enheder.

Populære biblioteker og frameworks: Er 'swipeleft' tilgængelig i jQuery Mobile?

På grund af kompleksiteten ved at implementere touch-begivenheder fra bunden, har mange udviklere valgt at bruge biblioteker og frameworks, der abstraherer denne logik. Et af de mest kendte, historisk set, er jQuery Mobile. jQuery Mobile var designet specifikt til at forenkle udvikling af mobilvenlige webapplikationer og tilbød en række indbyggede gestusbegivenheder, herunder swipe, swipeleft og swiperight.

Ja, swipeleft var absolut tilgængelig i jQuery Mobile! Det var en af de mest værdsatte funktioner, der gjorde det utroligt nemt at tilføje swipe-funktionalitet til elementer. I stedet for at skrive al den komplekse touch-logik, kunne man simpelthen skrive:

$('mitElement').on('swipeleft', function() { // Udfør jQuery-kode ved swipe til venstre }); 

Dette demonstrerede kraften i biblioteker: de tager sig af alle de underliggende beregninger, tærskelværdier og browserforskelle, så udvikleren kan fokusere på applikationens logik. Udover jQuery Mobile findes der andre biblioteker, der specialiserer sig i gestusgenkendelse, såsom Hammer.js og Swiper.js (sidstnævnte er mere til slideshows, men bygger på swipe-logik).

Problemet med Tocca.js og 'onclick' vs. 'swipe'

Du nævner, at du forsøger at bruge Tocca.js (https://gianlucaguarini.com/Tocca.js/) og oplever, at onclick virker, men swipe ikke. Dette er et almindeligt problem, der kan skyldes flere faktorer, især med ældre eller mindre vedligeholdte biblioteker som Tocca.js (som ikke er blevet opdateret i mange år):

  • Tærskler og hastighed: Tocca.js, ligesom andre swipe-detektorer, har interne tærskler for minimumsbevægelsesafstand og/eller maksimumstid for at detektere en 'swipe'. Hvis din bevægelse er for langsom, for kort, eller hvis fingeren løftes for hurtigt/langsomt, vil den muligvis ikke blive registreret som en 'swipe'. En onclick (eller tap i touch-kontekst) har typisk ingen afstandstærskel, kun et kort tidsinterval.
  • touch-action CSS-egenskab: Nogle gange kan CSS-egenskaben touch-action på elementet eller dets forældre forhindre touch-begivenheder i at blive korrekt behandlet af JavaScript. For eksempel kan touch-action: pan-y; tillade lodret scroll, men blokere horisontale swipes. Prøv at sætte touch-action: none; på elementet for at se, om det løser problemet (vær dog opmærksom på, at dette også vil deaktivere standard scroll på elementet).
  • Event Propagation og preventDefault(): Andre begivenhedslyttere på elementet eller dets forældre kan kalde event.preventDefault() for tidligt, hvilket stopper Tocca.js i at modtage de nødvendige touch-begivenheder. Eller Tocca.js selv kalder muligvis ikke preventDefault() korrekt for at forhindre standardadfærd, der forstyrrer dets egen detektion.
  • Konflikter med andre biblioteker: Hvis du bruger flere JavaScript-biblioteker, kan de have konflikter i deres håndtering af touch-begivenheder, hvilket fører til uventet adfærd.
  • Elementets synlighed/interaktivitet: Sørg for, at elementet, du forsøger at swipe på, er synligt, ikke dækket af et andet element, og har en tilstrækkelig stor touch-overflade. CSS-egenskaber som pointer-events: none; kan også forhindre begivenheder.
  • Forældet bibliotek: Tocca.js er et relativt gammelt bibliotek og understøtter muligvis ikke fuldt ud nyere browseradfærd eller optimeringer for touch-begivenheder. Moderne browsere kan have ændret måden, de håndterer touch-begivenheder på, hvilket kan bryde ældre biblioteker. Overvej at bruge et mere moderne og aktivt vedligeholdt bibliotek som Hammer.js eller at implementere en simpel swipe-detektor selv, hvis du kun har brug for grundlæggende funktionalitet.

For at debugge problemet ville man typisk tilføje console.log-udtryk inde i Tocca.js' event-lyttere for touchstart, touchmove og touchend for at se, om begivenhederne overhovedet fyres, og hvilke koordinater og tider der registreres. Dette kan give indsigt i, hvorfor 'swipe'-kriterierne ikke opfyldes.

What is a 'swipe' event in JavaScript?
In JavaScript, a 'swipe' event is the act of quickly moving your finger across the touch surface in a certain direction. Although there is no built-in 'onswipe' event, we can implement one using the available touch events and define what constitutes a 'swipe'.

Sammenligning af tilgange: Ren JavaScript vs. Biblioteker

Når det kommer til at implementere 'swipe'-begivenheder, står man over for valget mellem at skrive koden selv med ren JavaScript eller at benytte et eksisterende bibliotek. Begge tilgange har deres fordele og ulemper:

Ren JavaScript (Vanilla JS)

Fordele:

  • Fuld kontrol: Du har 100% kontrol over logikken og kan tilpasse den præcist til dine behov.
  • Ingen eksterne afhængigheder: Koden er selvstændig, hvilket reducerer filstørrelsen og eliminerer risikoen for konflikter med andre biblioteker.
  • Bedre forståelse: At implementere det selv giver en dybere forståelse af, hvordan touch-begivenheder fungerer.
  • Ydeevne: Hvis det er optimalt skrevet, kan egen kode potentielt være mere performant, da den kun indeholder den nødvendige logik.

Ulemper:

  • Kompleksitet: Kræver mere kode og er sværere at vedligeholde, især med flere gestus og edge cases.
  • Tidskrævende: Det tager længere tid at udvikle og debugge.
  • Vedligeholdelse: Du er ansvarlig for at håndtere browserforskelle, ydeevneoptimeringer og fremtidige ændringer i touch-API'er.

Biblioteker (f.eks. jQuery Mobile, Hammer.js)

Fordele:

  • Hurtig udvikling: Gør det nemt at tilføje swipe-funktionalitet med få linjer kode.
  • Håndterer kompleksitet: Tager sig af tærskelværdier, retningsbestemmelse, tidsberegninger og browserkompatibilitet.
  • Robusthed: Typisk mere testet og robust, da de er udviklet af fællesskabet og testet på tværs af mange enheder.
  • Flere gestus: Mange biblioteker understøtter en bred vifte af gestus udover swipe, såsom pinch, rotate, tap, press osv.

Ulemper:

  • Afhængighed: Introducerer en ekstern afhængighed, som kan øge den samlede filstørrelse af din applikation.
  • Overhead: Kan indeholde kode, du ikke har brug for, hvilket potentielt kan påvirke ydeevnen marginalt.
  • Mindre kontrol: Du har mindre kontrol over de lavniveau detaljer i gestusdetektionen.
  • Vedligeholdelse af biblioteket: Du er afhængig af, at biblioteket bliver vedligeholdt og opdateret af dets udviklere.

Valget afhænger af projektets omfang, dit teams ekspertise og de specifikke krav. For et lille projekt med grundlæggende swipe-behov kan ren JavaScript være tilstrækkeligt. For større, mere komplekse applikationer med behov for mange gestus, er et velvedligeholdt bibliotek ofte den bedre løsning.

Optimering af 'swipe'-oplevelsen

Uanset om du implementerer swipe fra bunden eller bruger et bibliotek, er der flere måder at optimere brugeroplevelsen på:

  • Visuel feedback: Giv brugeren øjeblikkelig visuel feedback, når en swipe registreres. Det kan være en subtil skygge, en farveændring eller en animation, der indikerer, at elementet reagerer på gestus. Dette forbedrer følelsen af responsivitet.
  • Animationer: Brug flydende animationer, der matcher swipens hastighed og retning. Hvis en bruger swiper hurtigt, skal animationen være hurtig. Hvis den er langsom, skal animationen også være mere afdæmpet. CSS-overgange og JavaScript-baserede animationsbiblioteker kan hjælpe her.
  • Tærskler og tolerance: Finjuster tærskelværdierne for distance og tid. Test på forskellige enheder og med forskellige brugere for at finde den mest komfortable og intuitive indstilling. Husk, at en 'swipe' ofte er hurtigere end et 'drag'.
  • Tilgængelighed: Overvej brugere, der ikke kan bruge touch-skærme. Sørg for, at der er alternative måder at interagere med indholdet på, f.eks. knapper eller tastaturnavigation, der udfører den samme handling som en swipe.
  • Ydeevne: Vær opmærksom på ydeevnen. Undgå tunge beregninger i touchmove-lyttere. Brug passive: true i addEventListener, når det er muligt, for at forbedre scroll-ydeevnen, men vær forsigtig, da det forhindrer preventDefault(). For animationsrammer bør requestAnimationFrame altid foretrækkes.

Ofte Stillede Spørgsmål (FAQ)

Q: Hvorfor virker min swipe-begivenhed ikke, selvom jeg har skrevet koden korrekt?

A: Der kan være flere årsager. Tjek dine tærskelværdier for distance og tid – er de for høje eller for lave? Sørg for, at event.preventDefault() kaldes korrekt i din touchmove-lytter for at forhindre standard browseradfærd (som scroll). Kontrollér også CSS-egenskaben touch-action på dit element, da den kan forhindre touch-begivenheder i at blive udløst. Endelig kan andre JavaScript-biblioteker eller CSS-regler (f.eks. pointer-events: none;) forstyrre. Debugging med browserens udviklerværktøjer kan give indsigt i, hvilke begivenheder der fyres, og hvilke værdier de har.

Q: Hvad er forskellen på 'swipe' og 'drag'?

A: Forskellen ligger primært i hastighed og formål. En 'swipe' er en hurtig, retningsbestemt bevægelse, der typisk udløser en handling (f.eks. at skifte side, slette et element). En 'swipe' involverer ofte, at fingeren løftes fra skærmen kort efter bevægelsen. En 'drag' (træk) er en mere kontrolleret, ofte langsommere bevægelse, hvor et element flyttes eller trækkes hen over skærmen (f.eks. at omarrangere ikoner, trække en slider). Ved 'drag' er fingeren ofte i kontakt med skærmen under hele bevægelsen, og handlingen er kontinuerlig.

Q: Skal jeg bruge et bibliotek til swipe-begivenheder, eller skal jeg implementere det selv?

A: Det afhænger af dine behov. Hvis du kun har brug for meget grundlæggende swipe-detektion på et par elementer og ønsker fuld kontrol uden eksterne afhængigheder, kan du implementere det selv. Hvis dit projekt er større, kræver flere forskellige gestus, eller hvis du vil spare udviklingstid og drage fordel af en robust, testet løsning, er et bibliotek som Hammer.js (eller tidligere jQuery Mobile) et bedre valg. Biblioteker tager sig af mange af de kompleksiteter og edge cases, du ellers selv skulle håndtere.

Q: Hvordan forhindrer jeg scroll, når jeg swiper?

A: Den primære metode er at kalde event.preventDefault() inde i din touchmove-begivenhedslytter. Dette stopper browserens standard scroll-adfærd. Det er dog vigtigt at gøre dette selektivt, så du kun forhindrer scroll, når en swipe er tydeligt i gang. Du kan også bruge CSS-egenskaben touch-action: none; på elementet for at deaktivere al standard touch-adfærd (inklusive scroll) på det specifikke element, men vær forsigtig med at anvende dette for bredt, da det kan påvirke brugervenligheden negativt.

At mestre 'swipe'-begivenheder i JavaScript er essentielt for enhver udvikler, der arbejder med moderne webapplikationer til touch-enheder. Ved at forstå de underliggende touch-begivenheder og enten implementere logikken selv eller udnytte kraften i biblioteker, kan du skabe intuitive og engagerende brugeroplevelser, der føles naturlige for dine brugere.

Hvis du vil læse andre artikler, der ligner Forstå 'Swipe'-begivenheder i JavaScript, kan du besøge kategorien Mobilteknologi.

Go up