6.2 Drop zones
Då man drar ett element över en drop zone, kan man förändra dess stil, för att visa att det är en aktiv drop zone. När man sedan släpper ett element på en drop zon, kan man också förändra drop zone, t.ex. lägga in något innehåll. Beroende på om det dragna elementet ska kunna dras igen eller ej, kan man också behöva göra förändringar av det. Detta exempel består utav tre delar:
- Visuell effekt på en drop zone, då muspekaren befinner sig över den.
- Åtgärder vid händelsen drop. Exempel på vad som kan göras både på elementet för drop zone och det element som dragits.
- Urval av vilka element som man får släppa på. Exemplet visar några olika sätt att hantera detta.
17 min.
Sammanfattning
- I detta exempel används samma funktion för alla fyra händelserna
dragover
,dragenter
,dragleave
ochdrop
. Först i funktionen ligger gemensam kod och sedan skiljer man på de olika händelserna i enswitch
-sats. Händelsendragover
är dock inte med där, eftersom det endast är den inledande koden (egentligen endast -e.preventDefault()
- som ska utföras för denna händelse. - I funktionen kan man antingen använda
this
ellere.currentTarget
, som referens till det element som är aktuell drop zone. - På
dragenter
görs en förändring av elementets stil. Denna förändring får sedan tas bort pådragleave
, men den måste även tas bort pådrop
, eftersomdragleave
inte inträffar, om man släpper det som dras ochdrop
inträffar. - För att i koden för
drop
även kunna förändra det element som dragits, måste man spara en referens till det, då det börjar dras. Det görs i den inledande koden fördragstart
, därthis
(ellere.currentTarget
) sparas i en variabel. - Om det inte är tillåtet att släppa på alla drop zones, kan man i början av funktionen för drop zone kontrollera om det är en tillåten drop zone. Om det inte är det, lämnar man funktionen med
return
. - Ett alternativ till ovanstående är att i funktionen för
dragstart
kontrollera vilka drop zones som är tillåtna och endast lägga på händelsernadragover
, etc. på dem. Det urvalet kan t.ex. ske med en klass i elementen för drop zones.
Egna övningar
Här följer ett förslag på några egna övningar. Öppna filen test.html och test.js och utför följande:
- I HTML-koden finns ett antal
img
-taggar med frukter som ska kunna dras och släppas i rutorna till höger (div
-elementen). Kopiera funktionendragStart
(inklusive underfunktioner) från script-b.js och gör sedan ändringar i den koden. - I
init
-funktionen lägger du till kod, så att bilderna med frukterna blir dragbara och anropar funktionendragStart
på händelsendragstart
. - I funktionen
dragStart
ska det läggas på händelsehanterare fördragover
, etc. på alla rutor, dvs alladiv
-element inom det medid="dropZones"
. - Vid händelsen
drop
ska det läggas in enimg
-tagg i detdiv
-element som man släppt på.- I elementets
innerHTML
ska du alltså lägga in en textsträng för enimg
-tagg, därsrc
ska vara den adress som finns isrc
-attributet i denimg
-tagg som dragits.
- I elementets
- Ändra också stilen för det dragna elementet (sätt t.ex.
opacity
till 0.5) och se till att det inte kan dras igen. - Med ovanstående kod kan man dra frukter till alla rutor, oavsett om den är tom eller om det redan finns en frukt där. Lägg nu till kod, så att man endast kan släppa en frukt på en tom ruta.