Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

Datei Drag-and-Drop

HTML Drag and Drop Schnittstellen ermöglichen es Webanwendungen, Dateien auf einer Webseite zu ziehen und abzulegen. Dieses Dokument beschreibt, wie eine Anwendung eine oder mehrere Dateien akzeptieren kann, die aus dem Dateimanager der zugrunde liegenden Plattform gezogen und auf einer Webseite abgelegt werden.

Die Hauptschritte für Drag-and-Drop sind das Definieren einer Ablagezone (d.h. ein Zielelement für das Ablegen der Datei) und das Definieren von Ereignis-Handlern für die drop und dragover Ereignisse. Diese Schritte werden unten beschrieben, einschließlich Codebeispielen.

Definition der Ablagezone

Das HTML definiert die Ablagezone als ein <div> und einen Ausgabebereich (<pre>), der später gefüllt wird.

html
<div id="drop-zone">
  <p>Drag one or more files to this <i>drop zone</i>.</p>
</div>
<pre id="output"></pre>

Als Zielelement hört es auf das drop Ereignis, um die abgelegte Datei zu verarbeiten.

js
const dropZone = document.getElementById("drop-zone");
const output = document.getElementById("output");

dropZone.addEventListener("drop", dropHandler);

Damit das drop Ereignis ausgelöst wird, muss das Element auch das dragover Ereignis abbrechen. Hier brechen wir das Ereignis auf window ab (was auch das Ereignis betrifft, das auf dropZone gefeuert wird, da es nach oben blubbert), weil wir auch das drop Ereignis auf window hören möchten, um die Standardaktion des Browsers zu verhindern, die Datei zu öffnen, wenn sie nicht in der Ablagezone abgelegt wurde.

js
window.addEventListener("dragover", (e) => {
  e.preventDefault();
});
window.addEventListener("drop", (e) => {
  e.preventDefault();
});

Schließlich möchte eine Anwendung möglicherweise das Ziel-Ablageelement stylen, um visuell anzuzeigen, dass das Element eine Ablagezone ist. In diesem Beispiel verwendet das Ziel-Ablageelement folgendes Styling:

css
#drop-zone {
  border: 5px solid blue;
  width: 200px;
  height: 100px;
}

Hinweis: dragstart und dragend Ereignisse werden nicht ausgelöst, wenn eine Datei vom Betriebssystem in den Browser gezogen wird. Um zu erkennen, wann OS-Dateien in den Browser gezogen werden, verwenden Sie dragenter und dragleave. Dies bedeutet, dass es nicht möglich ist, setDragImage() zu verwenden, um ein benutzerdefiniertes Drag-Bild/Cursor-Overlay anzuwenden, wenn Dateien vom Betriebssystem gezogen werden — da der Drag-Daten-Store nur im dragstart Ereignis modifiziert werden kann. Dies gilt auch für setData().

Verarbeitung des Ablagevorgangs

Das drop Ereignis wird ausgelöst, wenn der Benutzer die Datei(en) ablegt. Im folgenden Handler für das Ablegen wird die Methode getAsFile() verwendet, um auf jede Datei zuzugreifen. Dieses Beispiel zeigt, wie der Name jeder gezogenen Datei in die Konsole geschrieben wird. In einer echten Anwendung möchte eine Anwendung möglicherweise eine Datei mithilfe der File API verarbeiten.

Beachten Sie, dass in diesem Beispiel alle Ziehelemente, die keine Dateien sind, ignoriert werden.

js
function dropHandler(ev) {
  // Prevent default behavior (Prevent file from being opened)
  ev.preventDefault();
  let result = "";
  // Use DataTransferItemList interface to access the file(s)
  [...ev.dataTransfer.items].forEach((item, i) => {
    // If dropped items aren't files, reject them
    if (item.kind === "file") {
      const file = item.getAsFile();
      result += `• file[${i}].name = ${file.name}\n`;
    }
  });
  output.textContent = result;
}

Ergebnis

Siehe auch