I lang tid har JavaScript-funksjoner eksistert som tillater oss å lage dra og slipp-grensesnitt, men ingen av disse implementasjonene var innfødt i nettleseren.
I HTML5 har vi en innfødt metode for å lage dra og slipp-grensesnitt (med litt hjelp fra JavaScript).
Jeg skal fortelle deg hvordan du skal oppnå dette ...
Jeg vil gjerne få dette ut av veien før vi utvikler: for øyeblikket er HTML5 dra og slipp støttet av alle de store nettleserne (inkludert IE (selv IE 5.5 har delvis støtte)), men det støttes ikke for øyeblikket av noen av de populære mobilene lesere.
I hvert trinn av dra og slipp operasjonen en annen begivenhet er sparket slik at nettleseren vet hva JavaScript-kode skal utføre; hendelsene er:
Med alle disse hendelseslytterne har du mye kontroll over hvordan grensesnittet fungerer og nøyaktig hvordan det utføres under ulike forhold.
Det er her hvor alt dra og slipp magien skjer; Dette objektet inneholder dataene som ble sendt av draoperasjonen. Dataene kan settes og hentes på ulike måter, de viktigste er:
Nå skal vi begynne å lage vår enkelt dra og slipp eksempel, du kan se at vi har to små divs og en større, vi kan dra og slippe de små i den store, og vi kan til og med flytte dem tilbake.
Det første vi må gjøre er å lage vår HTML. Vi gjør divsene draggable med draggable attributtet, slik som:
draggable="true">
Når dette er gjort må vi definere javascript-funksjonen som vil løpe når vi begynner å dra dette elementet:
function dragStart(ev) {ev.dataTransfer.effectAllowed='move';ev.dataTransfer.setData("Text", ev.target.getAttribute('id')); ev.dataTransfer.setDragImage(ev.target,100,100);return true;}
I denne koden erklærer vi først hvilken type effekt vi tillater i operasjonen, og vi setter det for å flytte, i den andre linjen angir vi dataene for operasjonen og i dette tilfellet er typen Tekst og verdien er elementets ID vi drar Etter dette bruker vi setDragImage- metoden til å angi hva vi skal dra og deretter hvor markøren skal være mens du drar, og siden kubene er 200 ved 200px plasserte jeg det i sentrum. Til slutt returnerer vi sant.
For at et element skal kunne akseptere en dråpe, må det høres på 3 forskjellige hendelser: dragEnter, dragOver og også drop- eventet, så la oss legge til dette i vår html i div med ID for big:
Nå som vi har lagt til hendelselyttere, må vi opprette disse funksjonene, og vi starter med drakter og drakthendelser:
function dragEnter(ev) {ev.preventDefault();return true;}function dragOver(ev) {ev.preventDefault();}
I den første funksjonen definerer vi hva vi vil skje når elementet vi drar når elementet som det skal tapt inn, i dette tilfellet forhindrer vi bare nettleserens vanlige oppførsel, men du kan gjøre et hvilket som helst antall ting som forandre bakgrunn eller legg til litt tekst for å indikere at brukeren drar til riktig område, og ved hjelp av dragleave-hendelsen kan du tilbakestille endringene du har gjort. Neste i dragOver- funksjonen forhindrer vi simpelthen standarden til å tillate dråpen.
Neste del er hvor vi definerer funksjonen for når vi faktisk slipper elementet på ønsket mål:
function dragDrop(ev) {var data = ev.dataTransfer.getData("Text");ev.target.appendChild(document.getElementById(data));ev.stopPropagation();return false;}
I denne siste delen setter vi først en variabel som heter data der vi får alle dataene som er tilgjengelige for tekstformatet, og deretter legger vi til dataene (som blir det elementet vi drar) til div hvor vi ønsker å slippe elementet. Endelig kommer noen endelige berører som å stoppe forplantning og også returnere falsk.
Kontrollere demoen , kan du se at vi også sørget for at de to divene kunne bli trukket tilbake til deres opprinnelige plassering. Heldigvis kan legge til et annet dråpemål være enklere enn du tror; Fordi funksjonene allerede er på plass, er alt vi trenger å legge til hendelseslytterne, slik som:
Og det er alt vi trenger for å tillate å dra av divs til det opprinnelige stedet.
Det er mange dra og slipp applikasjoner bygget ved hjelp av JavaScript-biblioteker, og det er ofte enklere å bruke disse bibliotekene. Men jeg håper at i denne HTML5 og JavaScript-teknikken ser du fremtidens potensial for den opprinnelige løsningen.
Har du bygget et dra og slipp-grensesnitt? Hvordan sammenligner native HTML5 med rene JavaScript-løsninger? Gi oss beskjed i kommentarene.
Utvalgt bilde / miniatyrbilde, slipp bildet via photophilde.