23/10/2024
- jQuery UI Sortable på mobil: En dybdegående guide
- Forståelse af Touch-Events vs. Muse-Events
- Hvordan Får Man jQuery UI Sortable til at Virke på Touch-Enheder?
- Fejlfinding: Scroll-problemer og `preventDefault()`
- jQuery UI Sortable Indstillinger til Mobilbrug
- Særlige Overvejelser for Table Rows
- Deling af Draggable Egenskaber
- Bedste Praksis for Mobil Sortérbarhed
- Konklusion
jQuery UI Sortable på mobil: En dybdegående guide
jQuery UI's Sortable-widget er en kraftfuld funktion, der giver brugerne mulighed for at omarrangere elementer i lister eller gitre med simpel træk-og-slip-funktionalitet. Mens den fungerer upåklageligt på desktop-browsere, har mange udviklere stødt på udfordringer, når de forsøger at implementere den på mobile enheder som iPads og andre touch-baserede enheder. Dette skyldes primært forskellene i, hvordan touch-events håndteres sammenlignet med muse-events. Denne guide vil dykke ned i, hvordan du får jQuery UI Sortable til at fungere på mobile enheder, herunder fejlfinding af almindelige problemer og udnyttelse af de relevante indstillinger.

Forståelse af Touch-Events vs. Muse-Events
På en desktop-enhed interagerer brugere typisk med webindhold via en mus. jQuery UI Sortable er designet med disse muse-events (som mousedown, mousemove og mouseup) i tankerne. På mobile enheder er interaktionen derimod baseret på berøring (touch). De tilsvarende touch-events er touchstart, touchmove og touchend.
Den mest almindelige faldgrube, når man forsøger at få Sortable til at virke på touch-enheder, er at ignorere disse forskelle. Hvis du blot anvender standard jQuery UI Sortable-kode på en touch-enhed uden yderligere tilpasninger, vil træk-og-slip-funktionaliteten sandsynligvis ikke udløses korrekt. Dette skyldes, at de underliggende event-lyttere i jQuery UI Sortable primært er bundet til muse-events.
Hvordan Får Man jQuery UI Sortable til at Virke på Touch-Enheder?
For at få jQuery UI Sortable til at fungere på touch-enheder som iPads, er det essentielt at simulere muse-events ved hjælp af touch-events. En almindelig tilgang er at binde touch-events til at udløse de tilsvarende muse-events. Dette kan gøres ved at tilføje event-lyttere for touchstart, touchmove og touchend og derefter manuelt udløse de relevante muse-events på det element, der bliver trukket.
En typisk implementering kunne se således ud:
$( function() { $("#sortable").sortable(); // Tilføj touch-event håndtering $("#sortable").on('touchstart touchmove touchend', function(event) { var touch = event.originalEvent.touches[0] || event.originalEvent.changedTouches[0]; var simulatedEvent; switch(event.type) { case 'touchstart': simulatedEvent = new MouseEvent('mousedown', { bubbles: true, cancelable: true, view: window, screenX: touch.screenX, screenY: touch.screenY, clientX: touch.clientX, clientY: touch.clientY }); break; case 'touchmove': simulatedEvent = new MouseEvent('mousemove', { bubbles: true, cancelable: true, view: window, screenX: touch.screenX, screenY: touch.screenY, clientX: touch.clientX, clientY: touch.clientY }); break; case 'touchend': simulatedEvent = new MouseEvent('mouseup', { bubbles: true, cancelable: true, view: window, screenX: touch.screenX, screenY: touch.screenY, clientX: touch.clientX, clientY: touch.clientY }); break; default: return; } // Udløs den simulerede event på det berørte element event.target.dispatchEvent(simulatedEvent); // Forhindr standard scroll-adfærd, hvis det er en touchmove if (event.type === 'touchmove') { event.preventDefault(); } }); }); Bemærk: Koden ovenfor er et simpelt eksempel. I mere komplekse scenarier kan det være nødvendigt at tilpasse den yderligere for at håndtere flere berøringspunkter eller specifikke UI-elementer.

Fejlfinding: Scroll-problemer og `preventDefault()`
En almindelig udfordring, som mange støder på, er at forhindre siden i at scrolle, når man forsøger at trække et element. Brugere forventer, at de kan scrolle siden ved at trække med fingeren, men hvis touchmove-eventet afbrydes for tidligt, kan dette forhindre den ønskede scroll-funktionalitet.
Som brugeren i dit eksempel nævnte, kan brug af event.preventDefault();, event.cancelBubble=true; og event.stopPropagation(); på touchmove- og scroll-events føre til, at siden ikke længere kan scrolle. Dette sker, fordi disse metoder forhindrer standardadfærd for eventet.
Nøglen til at løse dette ligger i at være selektiv med, hvornår du kalder preventDefault(). Du bør kun kalde det, når du aktivt trækker et sortérbart element, og ikke for almindelig side-scroll. I eksemplet ovenfor er event.preventDefault(); placeret inden i touchmove-casen, hvilket er en god start. Det er dog vigtigt at sikre, at dette kun sker, når et sortérbart element er i gang med at blive trukket.
En mere robust løsning involverer at kontrollere, om det element, der modtager touchmove-eventet, rent faktisk er et sortérbart element, der er ved at blive trukket. Dette kan gøres ved at tjekke for klasser eller data-attributter, der indikerer, at et element er en del af en sortérbar liste.

jQuery UI Sortable Indstillinger til Mobilbrug
jQuery UI Sortable tilbyder en række indstillinger, der kan være særligt nyttige til at optimere oplevelsen på touch-enheder:
| Indstilling | Beskrivelse | Relevans for Mobil |
|---|---|---|
axis | Begrænser trækningen til en bestemt akse (f.eks. "x" eller "y"). | Nyttig til at forhindre utilsigtet vandret eller lodret bevægelse på små skærme. |
cancel | Forhindrer sortering, hvis trækningen starter på elementer, der matcher en selector. | God til at forhindre, at interaktion med knapper eller inputfelter inden for et sortérbart element udløser sortering. |
containment | Begrænser trækningen til et bestemt område. | Kan bruges til at forhindre, at elementer trækkes ud af det synlige område på en mobilskærm. Værdier som "parent" eller "window" er nyttige. |
cursor | Definerer musemarkøren under sortering. | Mindre relevant for touch, men kan stadig påvirke visuel feedback. |
cursorAt | Justerer positionen af den hjælpe-element, der trækkes. | Kan forbedre præcisionen på touch-skærme ved at sikre, at trækket starter fra det korrekte punkt. |
delay | Forsinkelse i millisekunder, før sortering starter. | Kan være nyttig for at undgå utilsigtet trækning, når brugeren blot ønsker at trykke på et element. |
distance | Minimum distance i pixels, før sortering starter. | Ligner delay, hjælper med at skelne mellem et tryk og et træk. |
forceHelperSize | Tvinger hjælpe-elementet til at have en fast størrelse. | Kan forhindre, at størrelsen på det trukkede element ændrer sig uventet på mobile enheder. |
forcePlaceholderSize | Tvinger placeholder-elementet til at have en fast størrelse. | Sikrer en konsistent visuel oplevelse, når elementer omarrangeres. |
helper | Definerer, hvordan hjælpe-elementet ser ud under trækning (f.eks. "clone"). | Brug af "clone" kan give en bedre visuel indikation af, hvilket element der trækkes. |
opacity | Justerer gennemsigtigheden af hjælpe-elementet. | Kan bruges til at give visuel feedback, når et element trækkes over andre. |
placeholder | En CSS-klasse til placeholder-elementet. | Vigtigt for at give brugeren et klart visuelt signal om, hvor elementet vil blive placeret. |
revert | Animerer elementet tilbage til sin oprindelige position, hvis trækningen mislykkes. | Giver en god brugeroplevelse ved at give visuel feedback på fejlslagne handlinger. |
scroll | Ruller siden automatisk, når man nærmer sig kanten. | Meget vigtig for mobil. Sørg for, at denne er sat til true (standard), men vær opmærksom på, at den kan komme i konflikt med manuel scrolling, som diskuteret tidligere. |
scrollSensitivity | Afstand fra kanten, der udløser scrolling. | Justerbar for at finjustere scroll-adfærd på touch-skærme. |
scrollSpeed | Hastigheden af side-scrolling. | Kan justeres for en glattere scroll-oplevelse. |
tolerance | Hvornår et element betragtes som værende over et andet ("intersect" eller "pointer"). | "pointer" kan være mere responsiv på touch-skærme, da det baseres på præcis fingerplacering. |
Særlige Overvejelser for Table Rows
jQuery UI Sortable kan også bruges til at omarrangere rækker i en tabel. Det er dog vigtigt at bemærke, at du skal gøre tbody-elementet sortérbart, ikke selve table-elementet. Dette skyldes, hvordan tabeller er struktureret i HTML.
$( function() { $("#myTable tbody").sortable(); }); Deling af Draggable Egenskaber
Et vigtigt aspekt af jQuery UI Sortable er, at sortérbare elementer som standard deler draggable egenskaber. Det betyder, at de kan trækkes rundt, ligesom elementer der kun er defineret som draggable. Dette er grundlaget for, hvordan Sortable fungerer – det bygger oven på den underliggende draggable funktionalitet i jQuery UI.
Bedste Praksis for Mobil Sortérbarhed
- Test grundigt på forskellige enheder: Hvad der virker på en iPad, virker måske ikke på en Android-telefon. Test på et bredt udvalg af enheder og operativsystemer.
- Prioriter touch-events: Sørg for, at din kode korrekt håndterer
touchstart,touchmoveogtouchend. - Undgå aggressive
preventDefault(): Vær forsigtig med at afbryde standardadfærd. Implementer logik, der kun forhindrer scrolling, når det er nødvendigt for selve trækningen. - Brug klare visuelle indikatorer: Sørg for, at brugerne tydeligt kan se, hvilket element der trækkes, og hvor det vil blive placeret (via
placeholderoghelperindstillinger). - Overvej touch-venlige størrelser: Sørg for, at dine sortérbare elementer er store nok til at blive trykket på komfortabelt med en finger.
- Optimér ydeevnen: Komplekse sortérbare lister kan påvirke ydeevnen på ældre mobile enheder. Test og optimér, hvis nødvendigt.
Konklusion
At få jQuery UI Sortable til at fungere problemfrit på mobile enheder kræver en dybere forståelse af touch-events og omhyggelig implementering. Ved at simulere muse-events korrekt, håndtere preventDefault() med omhu og udnytte de relevante indstillinger i Sortable-widgetten, kan du skabe en intuitiv og effektiv brugeroplevelse, der fungerer lige så godt på en smartphone som på en desktop-computer. Husk altid at teste din implementering grundigt for at sikre maksimal kompatibilitet og ydeevne.
Ofte Stillede Spørgsmål (FAQ)
- Virker jQuery UI Sortable på alle touch-enheder?
- Med den rette implementering, der håndterer touch-events korrekt, bør det fungere på de fleste moderne touch-enheder. Dog kan der være variationer i browser- og OS-implementeringer, der kræver specifikke justeringer.
- Hvad er den bedste måde at håndtere scrolling på, mens man trækker et element på mobil?
- Den bedste metode er at bruge
event.preventDefault()selektivt påtouchmove-events, men kun når et element faktisk er ved at blive trukket. Undgå at anvende det på alletouchmove-events, da det vil forhindre al side-scrolling. - Kan jeg trække elementer mellem forskellige sortérbare lister på mobil?
- Ja, ved at bruge
connectWith-indstillingen kan du tillade elementer at blive trukket mellem flere sortérbare lister, også på mobile enheder, så længe touch-håndteringen er korrekt implementeret. - Hvordan påvirker
tolerance-indstillingen mobilbrug? tolerance: "pointer"kan være mere responsiv på touch-skærme, da den afhænger af den præcise placering af fingeren, i modsætning tiltolerance: "intersect", der kræver en større overlapning af elementerne.
Hvis du vil læse andre artikler, der ligner jQuery UI Sortable på mobil: En dybdegående guide, kan du besøge kategorien Teknologi.
