Where can I find jQuery Mobile slider source code?

Mestrer jQuery Mobile Skydere: Event Håndtering

12/10/2023

Rating: 4.55 (15632 votes)

At udvikle intuitive og responsivt brugergrænseflader til mobile enheder er en kerneopgave for enhver moderne webudvikler. jQuery Mobile har længe været et populært framework til at strømline denne proces, og dets indbyggede widgets, som for eksempel skyderen (slideren), er designet til at give en fremragende brugeroplevelse ud af boksen. Disse skydere er visuelt tiltalende og fungerer problemfrit på tværs af forskellige touch-enheder, hvilket gør dem til et ideelt valg for alt fra volumenkontrol til indstilling af datointervaller.

What is a slider widget?
The basic slider is horizontal and has a single handle that can be moved with the mouse or by using the arrow keys. Want to learn more about the slider widget? Check out the API documentation. Copyright 2025 OpenJS Foundation and jQuery contributors. All rights reserved. See jQuery License for more information.

Men hvad sker der, når du skal dykke dybere ned i funktionaliteten og fange specifikke brugerinteraktioner? Specifikt kan det være en frustrerende udfordring at opsamle værdien fra en jQuery Mobile skyder præcist i det øjeblik, brugeren slipper dens håndtag. Mange udviklere, der er vant til jQuery UI's adfærd, forventer måske, at standardbegivenheder som 'change' eller 'keyup' vil fungere direkte på det underliggende input-element. Dog er virkeligheden i jQuery Mobile en smule mere nuanceret, da frameworket transformerer den oprindelige HTML-struktur for at opnå sin touch-venlige funktionalitet. Denne artikel vil guide dig gennem skyderens indre virkemåde, afdække dens DOM-struktur, og vise dig den korrekte tilgang til effektiv begivenhedshåndtering, så du kan reagere præcist, når brugeren interagerer med din skyder.

Hvad er en Skyder-widget?

Før vi dykker ned i de tekniske detaljer, lad os kort definere, hvad en skyder-widget er, og hvorfor den er så nyttig i en mobil kontekst. En skyder er et grafisk kontrol-element, der giver brugeren mulighed for at vælge en numerisk værdi ved at trække et håndtag langs en bane. Den mest almindelige type er en horisontal skyder med et enkelt håndtag, der kan flyttes med en mus, et fingeraftryk på en touch-skærm eller via piletasterne på tastaturet.

Skydere er yderst velegnede til en række applikationer, hvor præcis numerisk indtastning ikke er nødvendig, men hvor en visuel repræsentation af en værdi inden for et interval er ønsket. Eksempler inkluderer:

  • Volumenkontrol: Justering af lydstyrken på en medieafspiller.
  • Lysstyrkejustering: Indstilling af skærmens lysstyrke.
  • Intervalvalg: Valg af et prisinterval i en e-handelsapplikation.
  • Zoom-niveauer: Kontrol af zoom i et kort eller billede.
  • Tidslinjer: Navigation gennem en video eller lydfil.

I kernen handler det om at give en visuel og interaktiv måde at vælge en værdi på, uden at skulle indtaste den manuelt, hvilket er særligt praktisk på mobile enheder med begrænset skærmplads og touch-baseret input.

Udfordringen med jQuery Mobile Skyderen

Den oprindelige antagelse for mange udviklere er, at jQuery Mobile skydere ville opføre sig på samme måde som jQuery UI skydere, især med hensyn til begivenhedshåndtering. Dette skyldes ofte en misforståelse af, hvordan jQuery Mobile transformerer dit simple HTML-markup til en fuldt funktionsdygtig, mobiloptimeret widget. Når du definerer en skyder i dit HTML som dette:

<div data-role="fieldcontain"> <label for="slider">Input skyder:</label> <input type="range" name="slider" id="slider" value="0" min="0" max="100" /> </div>

Du forventer måske, at du kan binde begivenheder direkte til `#slider`-elementet. Men som mange har opdaget, vil forsøg som `$("#slider").bind("keyup", function() { alert('her'); });` ikke give det ønskede resultat, når brugeren manipulerer skyderens håndtag. Grunden til dette er, at `keyup` er en tastaturbegivenhed, og når du trækker i skyderens håndtag med musen eller fingeren, er det ikke et 'keyup'-input, der foregår på det underliggende `` element. Hvis du inspicerer de begivenheder, der er bundet til input-elementet (`$("#slider").data("events");`), vil du typisk se standardbegivenheder som `blur`, `focus`, `keyup` og `remove`, men ingen, der direkte fanger 'release'-handlingen fra skyderens håndtag, som er en touch- eller musebegivenhed.

Forståelse af DOM-strukturen

Nøglen til at løse denne udfordring ligger i at forstå, hvordan jQuery Mobile dynamisk ændrer DOM (Document Object Model) for at skabe den visuelle skyder. Når siden indlæses, og jQuery Mobile initialiserer sine widgets, tager den dit simple ``-tag og indkapsler det i en mere kompleks struktur. Den genererede HTML ser typisk sådan ud:

<div data-role="fieldcontain" class="ui-field-contain ui-body ui-br"> <label for="slider" class="ui-input-text ui-slider" id="slider-label">Input skyder:</label> <input data-type="range" max="100" min="0" value="0" id="slider" name="slider" class="ui-input-text ui-body-null ui-corner-all ui-shadow-inset ui-body-c ui-slider-input" /> <div role="application" class="ui-slider ui-btn-down-c ui-btn-corner-all"> <a class="ui-slider-handle ui-btn ui-btn-corner-all ui-shadow ui-btn-up-c" href="#" data-theme="c" role="slider" aria-valuemin="0" aria-valuemax="100" aria-valuenow="54" aria-valuetext="54" title="54" aria-labelledby="slider-label" style="left: 54%;"> <span class="ui-btn-inner ui-btn-corner-all"> <span class="ui-btn-text"></span> </span> </a> </div> </div>

Som du kan se, er den faktiske skyder, som brugeren interagerer med, ikke længere det oprindelige ``-tag alene. I stedet er det en `div` med klassen `ui-slider`, der indeholder et ``-tag med klassen `ui-slider-handle`. Det er dette ``-tag, der repræsenterer skyderens håndtag, og det er her, de primære interaktioner finder sted, når brugeren trækker i skyderen. Den originale `` er stadig til stede (og dens værdi opdateres af jQuery Mobile bag kulisserne), men den er ofte skjult eller styret af de genererede visuelle elementer og er ikke den direkte kilde til de begivenheder, du ønsker at fange ved 'release'. At forstå denne DOM-struktur er afgørende for at tilknytte begivenheder korrekt.

Løsningen: Bind til de rigtige elementer

Da brugeren interagerer med de genererede elementer, skal vores begivenhedslyttere også tilknyttes disse elementer. jQuery Mobile, der er designet med touch-interaktioner i tankerne, tilbyder specifikke begivenheder, der er ideelle til dette formål: `tap` og `taphold`.

  • tap: Denne begivenhed udløses, når en finger (eller et museklik) hurtigt trykkes ned og slippes på et element. For en skyder kan dette bruges til at fange, når en bruger klikker på et punkt på skyderbanen, og skyderhåndtaget flytter sig dertil og dermed 'frigives'. Det er en letvægtsbegivenhed, der simulerer et hurtigt klik.
  • taphold: Denne begivenhed udløses, når en finger (eller et museklik) holdes nede på et element i en kort periode (typisk omkring 750 millisekunder). Dette er især nyttigt, hvis du vil skelne mellem et hurtigt tryk og en længere interaktion. For at fange 'release' af håndtaget efter træk er `tap` på selve skyderbanen eller `taphold` på håndtaget ofte de mest pålidelige valg, da de indikerer, at brugerens interaktion med elementet er afsluttet.

Den mest effektive metode er at binde til `tap` på selve den genererede skyder-container (`.ui-slider`) eller til `taphold` på skyderens håndtag (`.ui-slider a`). Disse begivenheder opstår efter, at brugeren har manipuleret skyderen og 'sluppet' den, hvilket giver dig det perfekte øjeblik til at opsamle den endelige værdi. Det er vigtigt at binde disse begivenheder efter, at jQuery Mobile har initialiseret skyderen, hvilket typisk gøres inden for en `pagecreate` begivenhed eller lignende, der sikrer, at DOM-elementerne er fuldt genereret og klar til interaktion.

Praktisk eksempel

Lad os se på den korrekte implementering, der løser problemet med at fange skyderens værdi, når brugeren slipper den. Først, dit simple og rene HTML for skyderen:

<div data-role="fieldcontain"> <label for="slider">Input skyder:</label> <input type="range" name="slider" id="slider" value="0" min="0" max="100" /> </div>

Og her er JavaScript-koden, der korrekt fanger begivenheden, når brugeren slipper skyderens håndtag eller trykker på skyderbanen:

<script> $(document).bind("pagecreate", function(event, ui) { // Bind begivenhed til den genererede skyderbane (den grå bjælke). // Denne 'tap' begivenhed udløses, når brugeren klikker et sted på skyderbanen, // og skyderhåndtaget flytter sig dertil og derefter 'frigives'. $('#slider').siblings('.ui-slider').bind('tap', function(event, ui){ // 'this' refererer her til '.ui-slider' elementet, som er skyderbanen. // For at få den aktuelle værdi, skal vi finde det oprindelige input-element, // som er en søskende til '.ui-slider' elementets forælder, eller direkte til '.ui-slider's søskende hvis det er bedre struktureret. // I dette tilfælde er det oprindelige input en søskende til '.ui-slider' div'en, men 'siblings()' på .ui-slider vil finde inputtet. makeAjaxChange($(this).siblings('input')); }); // Bind begivenhed til selve skyderhåndtaget (den runde knap). // Denne 'taphold' begivenhed er nyttig, hvis du vil reagere, når brugeren // specifikt trækker i håndtaget og derefter holder det nede i kort tid, eller efter en længere interaktion. $('#slider').siblings('.ui-slider a').bind('taphold', function(event, ui){ // 'this' refererer her til '<a>' (håndtaget). // For at få fat i det originale input-element, skal vi navigere op til håndtagets forælder (den .ui-slider div), // og derefter finde input-elementet, som er en søskende til denne forælder. makeAjaxChange($(this).parent().siblings('input')); }); // En hjælpefunktion til at håndtere den ændrede værdi. function makeAjaxChange( elem ) { // Her kan du udføre din AJAX-kald, opdatere UI eller anden logik. // 'elem.val()' giver dig den aktuelle numeriske værdi af skyderen. alert("Skyderens værdi er: " + elem.val()); console.log("Skyderens værdi er: ", elem.val()); } }); </script>

I ovenstående kode binder vi begivenhederne inden for `$(document).bind("pagecreate", ...)`. Dette er en afgørende detalje, da det sikrer, at DOM-elementerne for skyderen er fuldt initialiseret og 'forbedret' af jQuery Mobile, *før* vi forsøger at tilknytte begivenheder til dem. Hvis du forsøger at binde begivenheder for tidligt (f.eks. med `$(document).ready()`), eksisterer de genererede elementer måske ikke endnu, og dine begivenhedslyttere vil fejle.

Lad os se nærmere på selektorerne:

  • `$('#slider').siblings('.ui-slider')`: Her starter vi med det oprindelige ``. Metoden `.siblings('.ui-slider')` finder derefter den `div` med klassen `ui-slider`, som jQuery Mobile har oprettet som en søskende til dit input-element. Dette er selve skyderbanen.
  • `$('#slider').siblings('.ui-slider a')`: Dette bygger videre på den forrige selektor. Efter at have fundet `.ui-slider` elementet, finder vi derefter ``-tagget inde i den, som har klassen `ui-slider-handle`. Dette er det element, der repræsenterer skyderens håndtag.

Når `tap` eller `taphold` udløses, kaldes `makeAjaxChange`-funktionen, som modtager det oprindelige input-element som argument. Dette giver dig nem adgang til `elem.val()`, som returnerer skyderens aktuelle værdi. Denne værdi opdateres automatisk af jQuery Mobile, når håndtaget flyttes, så du altid får den korrekte og seneste værdi.

What is Swiper jQuery?
Swiper is a powerful and modular javascript library to implement responsive, accessible, flexible, touch-enabled carouses/sliders on your mobile websites and apps. Can be used as a jQuery plugin. Available for Angular, React, Vue, and Svelte. 1. Install the package with NPM. 2.

Hvorfor 'tap' og 'taphold'?

Valget af `tap` og `taphold` frem for mere traditionelle begivenheder som `mouseup` eller `change` er afgørende i jQuery Mobile's kontekst. jQuery Mobile er bygget som et 'touch-first' framework, og dets begivenhedssystem er optimeret til at håndtere touch-interaktioner på en robust og konsistent måde på tværs af forskellige browsere og enheder. Dette er en væsentlig forskel fra desktop-fokuserede frameworks som jQuery UI.

  • `mouseup` og `touchend` begivenheder: Selvom `mouseup` (for mus) og `touchend` (for touch-skærme) teknisk set kan fange, når en mus frigives eller en finger løftes, kan deres adfærd variere mellem browsere og enheder. jQuery Mobile's `tap` og `taphold` abstraherer over disse lavniveau-forskelle og giver en mere ensartet og pålidelig adfærd, uanset om brugeren interagerer med en mus eller en finger. De er designet til at give feedback, når en 'klik'-lignende eller 'tryk og hold'-lignende handling er afsluttet, hvilket gør dem perfekte til at fange det øjeblik, brugeren 'slipper' skyderens håndtag.
  • `change` begivenheden: `change`-begivenheden på et `` udløses typisk, når værdien er ændret, og input-feltet mister fokus, eller i nogle browsere umiddelbart efter en ændring. I jQuery Mobile's implementering af skyderen kan `change` på det skjulte input-element være inkonsekvent eller udløses for tidligt/sent i forhold til den visuelle interaktion med håndtaget. Ved at binde til de visuelle elementer med `tap` eller `taphold` får du en mere direkte og øjeblikkelig reaktion på brugerens interaktion med selve UI-komponenten.

Disse specialiserede touch-begivenheder er en del af jQuery Mobile's strategi for at give en 'native'-lignende følelse på mobile enheder, hvor 'klik' ofte erstattes af 'tap' og 'langt tryk' af 'taphold'.

jQuery Mobile vs. jQuery UI: En Kort Sammenligning

Den forvirring, der opstår, når man forventer, at jQuery Mobile opfører sig som jQuery UI, er forståelig. Begge frameworks bygger på jQuery-biblioteket og tilbyder UI-widgets, men deres filosofier og implementeringer adskiller sig markant. For at understrege forskellen mellem de to frameworks, kan vi betragte deres tilgang til skydere og begivenhedshåndtering:

EgenskabjQuery UI SkyderjQuery Mobile Skyder
Primær MålgruppeDesktop-applikationerMobile (touch-først) applikationer
DOM-TransformationMinimal; tilføjer klasser til eksisterende elementer for at style og tilføje funktionalitet. Den oprindelige HTML-struktur forbliver stort set intakt.Betydelig; ombygger ofte HTML-strukturen radikalt (f.eks. indkapsler input i divs, erstatter input med anker-tags for håndtag) for optimal touch-interaktion og visuel konsistens på tværs af enheder.
Standard Begivenheder for "Release"slidechange (specifik for slider), change på input-elementet. Disse begivenheder er typisk bundet direkte til det oprindelige jQuery UI-initialiserede element.tap.ui-slider (skyderbanen), taphold.ui-slider-handle (håndtaget). Disse begivenheder er optimeret til touch-interaktioner og skal bindes til de genererede DOM-elementer.
Fokus påMus- og tastaturinteraktioner, tilgængelighed for desktop-brugere.Finger- og touch-interaktioner, ydeevne og ensartet udseende på mobile enheder.
Eksempel på Begivenhedsbinding$( "#slider" ).slider({ change: function( event, ui ) { /* ... din logik ... */ } });$('#slider').siblings('.ui-slider').bind('tap', function(){ /* ... din logik ... */ });

Denne tabel illustrerer tydeligt, hvorfor en direkte overførsel af viden fra det ene framework til det andet kan føre til forvirring. Hvert framework har sin egen logik og bedste praksis, som det er essentielt at forstå for at udnytte dets fulde potentiale. Det handler om at kende det specifikke frameworks DOM-transformationer og de begivenheder, det eksponerer for den mest effektive interaktion.

Bedste praksis for mobiludvikling

Udover at forstå begivenhedshåndtering er der et par bedste praksisser, der kan forbedre din oplevelse med jQuery Mobile skydere og mobiludvikling generelt:

  • Event Delegation: For dynamisk indhold eller elementer, der indlæses via AJAX efter den indledende sideindlæsning, er det ofte bedre at bruge begivenhedsdelegation frem for direkte binding. I stedet for at binde direkte til `#slider.siblings('.ui-slider')`, kan du bruge `$(document).on('tap', '.ui-slider', function(){...})`. Dette sikrer, at begivenhedslytteren fungerer, selvom elementet ikke eksisterede, da siden oprindeligt blev indlæst, da lytteren er bundet til et statisk forældreelement (som `document.body` eller en bestemt side-container).
  • Performanceoptimering: Overvåg ydeevnen, især på ældre mobile enheder. Hyppige DOM-manipulationer eller komplekse JavaScript-funktioner, der udløses på `tap` eller `taphold`, kan påvirke responsiviteten. Optimer din `makeAjaxChange`-funktion, og undgå unødvendige beregninger eller tunge DOM-ændringer, der kan føre til 'janky' scrolling eller langsomme reaktioner. Overvej at 'debounce' eller 'throttle' funktioner, der udløses ofte under træk, hvis du også lytter til `slide` begivenheden.
  • Fejlfinding med udviklerværktøjer: Brug browserens udviklerværktøjer (især med mobil emulering til Chrome, Firefox eller Safari) til at inspicere DOM-strukturen efter jQuery Mobile's initialisering. Se, hvilke klasser der er tilføjet, og hvilke begivenheder der er bundet til de forskellige elementer. Dette er uvurderligt, når du støder på uventet adfærd og skal spore kilden til problemet.
  • Korrekt initialisering: Sørg altid for, at dine jQuery Mobile widgets er korrekt initialiseret. Dette gøres typisk automatisk, når elementerne er en del af en jQuery Mobile 'side', men for dynamisk tilføjede elementer skal du muligvis kalde `$('#yourSliderId').slider('refresh');` eller `$('#yourContainer').trigger('create');` for at tvinge jQuery Mobile til at 'forbedre' dem.

Ofte Stillede Spørgsmål (OSS)

Hvordan får jeg skyderens aktuelle værdi, når den flyttes, og ikke kun ved 'release'?

For at få værdien kontinuerligt under træk, kan du binde til begivenheden `slide` på det genererede `.ui-slider` element. Denne begivenhed udløses gentagne gange, mens brugeren trækker håndtaget. Du kan også få den aktuelle værdi ved at kalde `$('#slider').val()` på det originale input-element, da jQuery Mobile opdaterer dette elements værdi i realtid under træk.

Kan jeg bruge `change` begivenheden på det originale input-element?

Ja, `change`-begivenheden på det oprindelige `` vil til sidst udløses, når skyderens værdi er blevet endeligt opdateret af jQuery Mobile og fokus forlader elementet, eller i nogle tilfælde umiddelbart efter trækket stopper (afhængigt af browseren). Dog giver `tap` eller `taphold` på de genererede UI-elementer ofte en mere præcis kontrol over timingen af interaktionen, da de er direkte knyttet til den visuelle manipulation af skyderens håndtag, og de er mere konsistente på tværs af mobile enheder.

Hvor kan jeg finde jQuery Mobile sliderens kildekode eller mere dokumentation?

jQuery Mobile's kildekode er fuldt ud tilgængelig på GitHub, hvilket giver dig mulighed for at dykke ned i, hvordan widgets som skyderen er implementeret, og hvordan de håndterer interne begivenheder. Derudover kan du finde test-sider og eksempler på platforme som JSBin, der kan hjælpe dig med at eksperimentere med funktionaliteten i et isoleret miljø. Selvom jQuery Mobile ikke længere er under aktiv udvikling, er den officielle dokumentation stadig en værdifuld ressource for detaljer om alle widgets og begivenheder.

Hvad hvis min skyder er dynamisk indlæst?

Hvis din skyder indlæses dynamisk (f.eks. via AJAX), skal du sørge for, at jQuery Mobile 'forbedrer' den korrekt efter indlæsning. Dette gøres typisk ved at kalde `$('#yourSliderId').slider('refresh');` efter at elementet er tilføjet DOM'en. For begivenhedshåndtering skal du bruge begivenhedsdelegation som nævnt tidligere (`$(document).on('tap', '.ui-slider a', function(){...})`) for at sikre, at lytteren er aktiv, selv for elementer, der tilføjes DOM'en efter den indledende sideindlæsning.

Konklusion

At mestre begivenhedshåndtering i jQuery Mobile skydere handler om at forstå den underliggende DOM-struktur, som frameworket genererer. Ved at rette din opmærksomhed mod de faktiske visuelle elementer – skyderbanen (`.ui-slider`) og skyderens håndtag (`.ui-slider a`) – og bruge de touch-venlige begivenheder som `tap` og `taphold`, kan du præcist fange det øjeblik, brugeren slipper skyderen og reagere derefter. Denne viden er ikke kun specifik for skydere, men er en generel lektion i at arbejde effektivt med jQuery Mobile's unikke tilgang til mobil UI-udvikling. Ved at anvende disse principper kan du sikre, at dine mobile applikationer reagerer intuitivt og effektivt på brugerens interaktioner, hvilket fører til en mere poleret og brugervenlig oplevelse.

Hvis du vil læse andre artikler, der ligner Mestrer jQuery Mobile Skydere: Event Håndtering, kan du besøge kategorien Mobiludvikling.

Go up