Er hebben lang JavaScript-functies bestaan waarmee we slepen-en-neerzetinterfaces kunnen maken, maar geen van deze implementaties was oorspronkelijk voor de browser.
In HTML5 hebben we een native methode voor het maken van drag-and-drop-interfaces (met een beetje hulp van JavaScript).
Ik ga je vertellen hoe je dit kunt bereiken ...
Ik wil dit graag uit de weg halen voordat we verder gaan: HTML5 slepen en neerzetten wordt momenteel ondersteund door alle grote desktopbrowsers (inclusief IE (zelfs IE 5.5 heeft gedeeltelijke ondersteuning)), maar het wordt momenteel niet ondersteund door populaire mobiele apparaten browsers.
In elke fase van het slepen en neerzetten wordt een andere gebeurtenis geactiveerd, zodat de browser weet welke JavaScript-code moet worden uitgevoerd; de evenementen zijn:
Met al deze gebeurtenislisteners heeft u veel controle over hoe uw interface werkt en hoe deze precies presteert in verschillende omstandigheden.
Dit is waar alle magie met slepen en neerzetten gebeurt; dit object bevat de gegevens die zijn verzonden door de sleepbewerking. De gegevens kunnen op verschillende manieren worden ingesteld en opgehaald, de belangrijkste zijn:
Nu gaan we beginnen met het maken van onze eenvoudig slepen en neerzetten voorbeeld, je kunt zien dat we twee kleine div's en een grotere hebben, we kunnen de kleine binnen de grote slepen en neerzetten en we kunnen ze zelfs terugzetten.
Het eerste dat we moeten doen, is onze HTML maken. We maken de divs versleepbaar met het versleepbare attribuut, zoals zo:
draggable="true">
Wanneer dit is gebeurd, moeten we de javascript-functie definiëren die wordt uitgevoerd wanneer we dit element gaan slepen:
function dragStart(ev) {ev.dataTransfer.effectAllowed='move';ev.dataTransfer.setData("Text", ev.target.getAttribute('id')); ev.dataTransfer.setDragImage(ev.target,100,100);return true;}
In deze code verklaren we eerst welk type effect we toestaan in de bewerking en stellen we dat in om te verplaatsen, in de tweede regel stellen we de gegevens in voor de bewerking en in dit geval is het type Tekst en de waarde is de ID van het element we slepen. Hierna gebruiken we de methode setDragImage om in te stellen wat we gaan slepen en waar de cursor zich bevindt tijdens het slepen, en aangezien de kubussen 200 bij 200 px zijn, heb ik dat in het midden geplaatst. Eindelijk keren we terug waar.
Om een element een drop te laten accepteren, moet het luisteren naar 3 verschillende evenementen: dragEnter, dragOver en ook de drop- gebeurtenis, dus laten we dit toevoegen aan onze html in de div met de ID van groot:
Nu we gebeurtenislisteners hebben toegevoegd, moeten we deze functies maken. We beginnen met de dragenter en dragover-evenementen:
function dragEnter(ev) {ev.preventDefault();return true;}function dragOver(ev) {ev.preventDefault();}
In de eerste functie definiëren we wat we willen bereiken wanneer het element dat we slepen het element bereikt waarin het zou moeten vallen. In dit geval voorkomen we alleen het standaardgedrag van de browser, maar je kunt een aantal dingen doen, zoals de achtergrond of voeg wat tekst toe om aan te geven dat de gebruiker naar het juiste gebied sleept en met de dragleave-gebeurtenis kunt u de door u aangebrachte wijzigingen ongedaan maken. Vervolgens in de dragOver- functie voorkomen we eenvoudig dat de standaard de drop- down toestaat.
Het volgende deel is waar we de functie definiëren voor wanneer we het element daadwerkelijk op het gewenste doel laten vallen:
function dragDrop(ev) {var data = ev.dataTransfer.getData("Text");ev.target.appendChild(document.getElementById(data));ev.stopPropagation();return false;}
In dit laatste deel stellen we eerst een variabele in met de naam data waarin we alle gegevens krijgen die beschikbaar zijn voor het tekstformaat en vervolgens voegen we die gegevens (die het element zijn dat we slepen) toe aan de div waar we willen laten vallen het element. Eindelijk enkele laatste details, zoals het stoppen van propagatie en ook het retourneren van false.
controleren de demo , je kunt zien dat we er ook voor zorgden dat de twee divs naar hun oorspronkelijke locatie konden worden gesleept. Gelukkig is het toevoegen van een ander bestemmingsdoel eenvoudiger dan je denkt; omdat de functies al aanwezig zijn, hoeven we alleen de gebeurtenislisteners toe te voegen, zoals:
En dat is alles wat we nodig hebben om de divs naar de originele plek te slepen.
Er zijn veel versleeptoepassingen gebouwd met JavaScript-bibliotheken en het is vaak eenvoudiger om die bibliotheken te gebruiken. Maar ik hoop dat u in deze HTML5 & JavaScript-techniek het toekomstige potentieel van de native oplossing ziet.
Heeft u een interface voor slepen en neerzetten gebouwd? Hoe verhoudt native HTML5 zich tot pure JavaScript-oplossingen? Laat het ons weten in de comments.
Uitgelichte afbeelding / thumbnail, beeld laten vallen via fotophilde.