Für eine lange Zeit haben JavaScript-Funktionen existiert, die es uns erlauben, Drag-and-Drop-Schnittstellen zu erstellen, aber keine dieser Implementierungen war nativ für den Browser.

In HTML5 haben wir eine native Methode zum Erstellen von Drag & Drop-Schnittstellen (mit ein wenig Hilfe von JavaScript).

Ich werde Ihnen sagen, wie Sie das erreichen können ...

Browserunterstützung

Ich möchte das aus dem Weg räumen, bevor wir fortfahren: Zur Zeit wird HTML5 Drag and Drop von allen gängigen Desktop-Browsern unterstützt (einschließlich IE (sogar IE 5.5 hat teilweise Unterstützung)), aber es wird derzeit von keinem der beliebten Handys unterstützt Browser.

Drag & Drop von Ereignissen

In jedem Stadium der Drag & Drop-Operation wird ein anderes Ereignis ausgelöst, damit der Browser weiß, welcher JavaScript-Code ausgeführt werden soll. Die Ereignisse sind:

  • dragStart: Wird ausgelöst, wenn der Benutzer das Element zu ziehen beginnt.
  • dragEnter: Wird ausgelöst, wenn das ziehbare Element zuerst über das Zielelement gezogen wird.
  • dragOver: Wird ausgelöst, wenn die Maus beim Ziehen über ein Element bewegt wird.
  • dragLeave: Wird ausgelöst, wenn der Cursor des Benutzers beim Ziehen ein Element verlässt.
  • Ziehen: Wird jedes Mal ausgelöst, wenn wir die Maus beim Ziehen unseres Elements bewegen.
  • Drop: Wird ausgelöst, wenn der tatsächliche Drop ausgeführt wird.
  • dragEnd: Wird ausgelöst, wenn der Benutzer beim Ziehen des Objekts die Maustaste loslässt.

Mit all diesen Event-Listenern haben Sie eine Menge Kontrolle darüber, wie Ihre Oberfläche funktioniert und wie sie unter verschiedenen Umständen funktioniert.

Das dataTransfer-Objekt

Hier findet all die Drag and Drop-Magie statt. Dieses Objekt enthält die Daten, die von der Ziehoperation gesendet wurden. Die Daten können auf verschiedene Arten gesetzt und abgerufen werden, die wichtigsten sind:

  • dataTransfer.effectAllowed = Wert: Dies gibt die zulässigen Aktionstypen zurück, mögliche Werte sind none, copy, copyLink, copyMove, link, linkMove, move, alle und nicht initialisiert.
  • dataTransfer.setData (Format, Daten): Fügt die angegebenen Daten und ihr Format hinzu.
  • dataTransfer.clearData (Format): Löscht alle Daten für ein bestimmtes Format.
  • dataTransfer.setDragImage (element, x, y): legt das Bild fest, das Sie ziehen möchten, die x- und y-Werte geben an, wo der Mauszeiger sein soll (0, 0 wird oben links platziert).
  • data = dataTransfer.getData (format): Wie der Name sagt, gibt es die für ein bestimmtes Format verfügbaren Daten zurück.

Erstellen eines Drag & Drop-Beispiels

Jetzt werden wir anfangen, unsere zu erstellen einfaches Drag & Drop Beispiel, Sie können sehen, dass wir zwei kleine divs haben und eine größere, wir können die Kleinen in die Große ziehen und ablegen und wir können sie sogar zurück bewegen.

Ziehen Sie das Objekt

Das erste, was wir tun müssen, ist unser HTML zu erstellen. Wir machen die divs mit dem ziehbaren Attribut wie folgt ziehbar:

draggable="true">

Wenn dies erledigt ist, müssen wir die JavaScript-Funktion definieren, die ausgeführt wird, wenn wir dieses Element ziehen:

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 diesem Code deklarieren wir zuerst, welche Art von Effekt wir in der Operation erlauben und setzen diese, um zu bewegen, in der zweiten Zeile setzen wir die Daten für die Operation und in diesem Fall ist der Typ Text und der Wert ist die ID des Elements wir schleifen. Danach verwenden wir die Methode setDragImage , um festzulegen , was wir ziehen werden und wo sich der Cursor befindet, wenn Sie ziehen, und da die Cubes 200 x 200 Pixel groß sind , platziere ich das genau in der Mitte. Endlich kehren wir wahr zurück.

Das Objekt fallen lassen

Damit ein Element einen Drop akzeptieren kann, muss es 3 verschiedene Events anhören: dragEnter, dragOver und auch das Drop- Event. Lassen Sie uns das also zu unserem html im div mit der ID of big hinzufügen:

Jetzt, da wir Event-Listener hinzugefügt haben, müssen wir diese Funktionen erstellen, die wir mit den Dragenter- und Dragover-Events beginnen:

function dragEnter(ev) {ev.preventDefault();return true;}function dragOver(ev) {ev.preventDefault();}

In der ersten Funktion definieren wir, was wir tun wollen, wenn das Element, das wir ziehen, das Element erreicht, in das es eingefügt werden soll. In diesem Fall verhindern wir nur das Standardverhalten des Browsers, aber Sie können eine beliebige Anzahl von Dingen ändern Hintergrund oder fügen Sie einen Text hinzu, um anzuzeigen, dass der Benutzer in den richtigen Bereich zieht, und verwenden Sie das Dragleave-Ereignis, um die vorgenommenen Änderungen rückgängig zu machen. Als nächstes verhindern wir in der dragOver- Funktion einfach, dass der Standardwert für das Ablegen berücksichtigt wird .

Im nächsten Teil definieren wir die Funktion, wenn wir das Element tatsächlich auf das gewünschte Ziel fallen lassen:

function dragDrop(ev) {var data = ev.dataTransfer.getData("Text");ev.target.appendChild(document.getElementById(data));ev.stopPropagation();return false;}

In diesem letzten Teil setzen wir zuerst eine Variable namens data, in der wir alle Daten erhalten, die für das Textformat verfügbar sind, und dann fügen wir diese Daten (die das Element sind, das wir ziehen) an das div an, das wir löschen wollen das Element. Abschließend noch ein paar Feinheiten, wie das Stoppen der Fortpflanzung und auch das Zurückkehren zu false

Den Abschnitt zu einem Drop-Ziel machen

Überprüfung die Demo Sie können sehen, dass wir auch sichergestellt haben, dass die beiden Divs an ihren ursprünglichen Ort zurückgeschleift werden können. Glücklicherweise ist das Hinzufügen eines anderen Drop-Ziels möglicherweise einfacher als Sie denken; Da die Funktionen bereits vorhanden sind, müssen wir lediglich die Ereignis-Listener hinzufügen:

Und das ist alles, was wir brauchen, um die Divs an den ursprünglichen Ort ziehen zu können.

Fazit

Es gibt viele Drag & Drop-Anwendungen, die mit JavaScript-Bibliotheken erstellt wurden, und diese Bibliotheken sind oft einfacher zu verwenden. Aber ich hoffe, dass Sie in dieser HTML5 & JavaScript-Technik das zukünftige Potenzial der nativen Lösung sehen.

Haben Sie eine Drag & Drop-Schnittstelle erstellt? Wie vergleicht natives HTML5 mit reinen JavaScript-Lösungen? Lassen Sie es uns in den Kommentaren wissen.

Ausgewähltes Bild / Vorschaubild, Drop-Bild über Photophilde.