JavaScript-træk og slip
Oversigt: i denne vejledning lærer du om JavaScript-træk og slip-API.
Introduktion til JavaScript Drag and Drop API
HTML5 introducerede formelt træk-og-slip-specifikationen. De fleste moderne webbrowsere har implementeret native træk-og-slip baseret på HTML5-specifikationen.
Som standard kan kun billede og tekst trækkes. For at trække et billede skal du blot holde museknappen nede og derefter flytte det. For at trække teksten skal du fremhæve noget tekst og trække det på samme måde som du ville trække et billede.
HTML5-specifikationen angiver, at næsten alle elementer kan trækkes. For at gøre et element trækkeligt skal du tilføje draggable
egenskaben med værdien true
til dets HTML-tag. For eksempel:
Code language: HTML, XML (xml)
Begivenheder på trækbare elementer
Når du trækker et element, udløses disse begivenheder i følgende rækkefølge:
-
dragstart
-
drag
-
dragend
Når du holder en museknap og begynder at bevæge musen, hændes dragstart
på det trækbare element at du trækker. Markøren skifter til et no-drop-symbol (en cirkel med en linje gennem den) for at indikere, at du ikke kan slippe elementet på sig selv.
Efter dragstart
begivenhed fyres, drag
begivenheden udløses gentagne gange, så længe du trækker elementet.
Og begivenheden dragend
når du holder op med at trække elementet.
Målet for alle begivenheder (e.target
) er det element, der trækkes.
Som standard , browseren ændrer ikke udseendet på det trækkede element. Derfor kan du tilpasse dets udseende ud fra dine præferencer.
Begivenheder på drop-mål
Når du trækker et element over et gyldigt drop-mål, affyres disse begivenheder i følgende rækkefølge:
-
dragenter
-
dragover
-
dragleave
ellerdrop
dragenter
begivenheden udløses så snart når du trækker elementet over et drop target.
Efter dragenter
begivenheden udløses, begivenheden dragover
affyres gentagne gange så længe du trækker elementet inden for drop target-grænsen.
Når du trækker elementet uden for drop target-grænsen, vises dragover
begivenhed stopper med at skyde, og dragleave
begivenheden udløses.
Hvis du taber elementet på målet, er drop
begivenheden udløses i stedet for dragleave
begivenheden.
Målet (dragenter
, dragover
, dragleave
, og drop
begivenheder er drop target-elementer.
Gyldigt drop target
Næsten alle elementer understøtter drop target events (dragenter
, dragover
, dragleave
og drop
). De tillader dog ikke at droppe som standard.
Hvis du slipper et element over et faldmål, der ikke tillader at falde, vandt begivenheden drop
t fire.
For at gøre et element til et gyldigt drop target kan du tilsidesætte standardadfærden for både dragenter
og dragover
begivenheder ved at kalde event.preventDefault()
metoden i deres tilsvarende begivenhedshåndterere. (Se eksemplet for mere information)
Overfør data ved hjælp af dataTransfer-objekt
For at overføre data i en træk-og-slip-handling bruger du dataTransfer
objekt.
dataTransfer
objektet er en egenskab for begivenheden. Det giver dig mulighed for at overføre data fra det trakne element til drop target.
dataTransfer
-objektet har to metoder: setData()
og getData()
.
setData()
giver dig mulighed for at indstille trækoperationens data til det angivne format og data :
Code language: CSS (css)
Formatet kan være text/plain
eller text/uri-list
. Og dataene kan være en streng, der repræsenterer de data, der skal føjes til trækobjektet.
getData()
-metoden henter trækdata, der er gemt af setData()
metode.
getData()
accepterer et argument:
Formatet kan være text/plain
eller text/uri-list
. getData()
returnerer en streng gemt ved setData()
-metoden eller en tom streng, hvis trækoperationen ikke inkluderer data.
Eksempel på træk og slip-JavaScript
Vi udvikler følgende enkle træk-og-slip-applikation til at demonstrere JavaScript-træk og slip-API:
Opret projektstruktur
Opret først en ny mappe kaldet drag-n-drop-basics
. Inde i denne mappe skal du oprette to undermapper kaldet css
og js
.
For det andet skal du oprette en ny fil kaldet app.js
i js
-mappen, style.css
i css
mappe og index.html
i drag-n-drop-basics
mappen.
For det tredje skal du placere linket til style.css
og script-tag, der linker til app.js
i index.html
-filen sådan:
Byg index.html-filen
Placer følgende kode i index.html
-filen:
I denne index.html-fil, vi brugte elementet .container
til at justere overskriften og drop-targets
-elementet.
Inde i drop-target-elementet, vi placerede tre div
-elementer med samme klasse box
. Og vi placerer et andet div-element med klassen item
i det første felt.
Hvis du åbner index.html
og prøv at trække det gule felt, du vil se markøren, der indikerer, at du ikke kan trække:
For at gøre elementet trækkeligt tilføjes draggable
egenskaben med værdien true
til sit HTML-tag som følger:
Code language: JavaScript (javascript)
Hvis du nu gemmer index.html
, skal du åbne den i browseren igen ser du, at du kan trække elementet på denne måde:
Håndter begivenheder på det trækbare element
style.css
-filen har .hide
klasse, der skjuler et element:
Code language: CSS (css)
I filen app.js
tilføjer du følgende kode:
Hvordan jeg t fungerer:
- Vælg først det trækbare element ved hjælp af
querySelector()
. - For det andet vedhæft en
dragstart
begivenhedshåndterer til elementet, der kan trækkes. - For det tredje skal du definere
dragStart()
-funktionen for at håndteredragstart
begivenhed.
Hvis du åbner filen index.html og begynder at trække elementet, der kan trækkes, vises meddelelsen drag starts...
konsollen.
I dragStart
begivenhedshåndteringen skal du gemme id
for det trækbare element. Og du skal skjule det:
Hvis du trækker elementet, vil du se, at det forsvinder, når du begynder at trække.
For at løse dette skal du bruge setTimeout()
-funktion:
Nu kan du trække det trækbare element ud af dets oprindelige position:
Håndter begivenheder på slipmål
Style.css-filen har også en CSS-klasse kaldet .drag-over
der omdanner drop-targetens kantstil til stiplet og rødt:
Code language: CSS (css)
I app.js har du brug for for at vælge drop-målelementerne og håndtere dragenter
, dragover
, dragleave
og drop
begivenheder for disse elementer:
Drop-målets kantstil skal ændres, når dragenter
og dragover
begivenhed opstår. Det skal gendanne stilen, når begivenheden dragleave
og drop
opstår.
For at gøre det skal du tilføje og fjerne drag-over
klassen til drop
målet på denne måde:
Hvis du nu trækker det trækbare element til en anden dråbe mål, vil du se, at grænsen til faldmålet ændres som vist på følgende billede:
For at gøre drop-målet gyldigt skal du ringe til event.preventDefault()
i dragenter
og dragover
begivenhedshåndterere som denne:
Hvis du ikke gør dette, bliver begivenheden drop
aldrig tænk, fordi div
-elementet som standard ikke er et gyldigt dropmål.
Hvis du trækker det trækbare element til et drop target, ser du, at markøren ændringer, der indikerer, at du kan slippe elementet:
Hvis du nu slipper elementet, ser du, at det forsvinder med det samme.
For at løse dette problem, skal du tilføje håndtere drop
begivenheden.
- Først skal du hente
id
for det trækkelige element ved hjælp afgetData()
-metoden tildataTransfer
objekt. - For det andet skal du tilføje det trækbare element som et underordnet element i drop target-elementet.
- For det tredje skal du fjerne
hide
klasse fradraggable
elementet.
Den følgende kode viser det komplette drop
event handler:
Hvis du trækker og slipper elementet, der kan trækkes nu, skal det fungere som forventet.
Følgende viser den komplette app.js-fil:
Og her er linket til demoen.
Resume
- Tilføj
draggable
egenskaben med værdien sand til et element for at gøre det trækkeligt. -
dragstart
,drag
ogdragend
begivenheder affyrer det trækbare element. -
dragenter
,dragover
, ellerdrop
begivenheder udløses på drop target. - Ring til
event.preventDefault()
pådragenter
ogdragover
begivenhedshåndterere for at gøre et element til et gyldigt drop target. - Brug
event.dataTransfer
objekt medsetData()
oggetData()
metoder til at overføre data i træk-og-slip-operationen.
- Var denne tutorial nyttig?
- Ja Nej