Um Daten in eine HTML-gestützte Anwendung zu ziehen oder aus einer HTML-Anwendung herauszuziehen (oder in den HTML-Code eines HTML-Loaders zu ziehen oder aus dem HTML-Loader herauszuziehen), gibt es spezielle HTML-Drag & Drop-Ereignisse. Die HTML-Drag & Drop-API ermöglicht es Ihnen, Drag & Drop-Aktionen in und aus DOM-Elementen im HTML-Inhalt durchzuführen.
Hinweis:
Sie können auch die AIR-APIs „NativeDragEvent“ und „NativeDragManager“ verwenden. Dazu definieren Sie einen Listener für Ereignisse des HTMLLoader-Objekts, das den HTML-Inhalt enthält. Allerdings ist die HTML-API besser in das HTML-DOM integriert und bietet Ihnen Möglichkeiten zur Steuerung von Standardverhalten.
Standardverhalten bei Drag & Drop-Aktionen
Die HTML-Umgebung stellt das Standardverhalten für Drag & Drop-Bewegungen, einschließlich Text, Bildern und URLs, zur Verfügung. Wenn Sie das Standardverhalten verwenden, können Sie Daten mit diesen Datentypen immer aus einem Element herausziehen. Sie können allerdings nur Text in ein Element ziehen und nur unter der Voraussetzung, das Element befindet sich in einem editierbaren Bereich einer Seite. Wenn Sie Text innerhalb eines editierbaren Bereichs einer Seite oder auch in einen anderen editierbaren Bereich derselben Seite ziehen, wird als Standardverhalten eine Verschiebaktion durchgeführt. Wenn Sie Text von einem nicht editierbaren Bereich oder von außerhalb der Anwendung in einen editierbaren Bereich ziehen, wird als Standardverhalten eine Kopieraktion durchgeführt.
Sie können das Standardverhalten überschreiben, indem Sie die Drag & Drop-Ereignisse selbst definieren. Um das Standardverhalten zu deaktivieren, rufen Sie die
preventDefault()
-Methode der Objekte auf, die für die Drag & Drop-Ereignisse ausgelöst wurden. Anschließend können Sie nach Bedarf Daten in das Ablageziel einfügen oder Daten aus der Ziehquelle entfernen.
Standardmäßig kann der Benutzer jeglichen Text sowie Bilder und Links auswählen und ziehen. Mithilfe der WebKit-CSS-Eigenschaft
-webkit-user-select
können Sie steuern, wie ein HTML-Element ausgewählt werden kann. Wenn Sie zum Beispiel
-webkit-user-select
auf
none
setzen, ist der Elementinhalt nicht auswählbar und kann somit auch nicht gezogen werden. Und mithilfe der CSS-Eigenschaft
-webkit-user-drag
können Sie festlegen, ob ein Element als Ganzes gezogen werden kann. Allerdings wird der Inhalt des Elements dann gesondert verarbeitet. Der Benutzer könnte dann nach wie vor ausgewählte Textpassagen ziehen. Weitere Informationen finden Sie unter
CSS in AIR
.
Drag & Drop-Ereignisse in HTML
Im Initiatorelement, also dort, wo die Ziehaktion beginnt, werden folgende Ereignisse ausgelöst:
Ereignis
|
Beschreibung
|
dragstart
|
Wird ausgelöst, wenn der Benutzer eine Ziehbewegung beginnt. Die Ereignisprozedur für dieses Ereignis kann das Ziehen verhindern, falls notwendig, indem sie die preventDefault()-Methode des Ereignisobjekts aufruft. Um zu steuern, ob die zu ziehenden Daten kopiert, verschoben oder verknüpft werden sollen, setzen Sie die Eigenschaft „effectAllowed“. Ausgewählter Text, Bilder und Links werden gemäß dem Standardverhalten in die Zwischenablage gelegt, Sie können aber mithilfe der dataTransfer-Eigenschaft des Ereignisobjekts andere Daten für die Ziehbewegung festlegen.
|
drag
|
Wird während der Ziehbewegung kontinuierlich ausgelöst.
|
dragend
|
Wird ausgelöst, wenn der Benutzer die Maustaste loslässt, um die Ziehbewegung zu beenden.
|
Vom Ablageziel werden folgende Ereignisse ausgelöst:
Ereignis
|
Beschreibung
|
dragover
|
Wird kontinuierlich ausgelöst, solange die Ziehbewegung innerhalb der Elementgrenzen bleibt. Die Prozedur für dieses Ereignis sollte die Eigenschaft „dataTransfer.dropEffect“ setzen, um festzulegen, ob nach dem Loslassen der Maus eine Kopier-, Verschieb- oder Verknüpfaktion ausgeführt wird.
|
dragenter
|
Wird ausgelöst, wenn eine Ziehbewegung über die Begrenzung eines Elements geführt wird.
Wenn Sie in einer dragenter-Ereignisprozedur Eigenschaften des Objekts „dataTransfer“ ändern, werden diese Änderungen bald darauf von dem nächsten dragover-Ereignis überschrieben. Andererseits gibt es zwischen einem dragenter- und dem ersten dragover-Ereignis eine kurze Verzögerung. Dies kann zur Folge haben, dass der Cursor aufblinkt, wenn verschiedene Eigenschaften gesetzt wurden. In vielen Fällen können Sie für beide Ereignisse dieselbe Ereignisprozedur verwenden.
|
dragleave
|
Wird ausgelöst, wenn die Ziehbewegung die Elementgrenzen verlässt.
|
drop
|
Wird ausgelöst, wenn der Benutzer die Daten auf dem Element ablegt. Auf die gezogenen Daten kann nur innerhalb der Prozedur für dieses Ereignis zugegriffen werden.
|
Das als Reaktion auf diese Ereignisse ausgelöste Ereignisobjekt ähnelt einem Mausereignis. Sie können mithilfe von Mausereigniseigenschaften wie (
clientX
,
clientY
) und (
screenX
,
screenY
) die Mausposition bestimmen.
Die wichtigste Eigenschaft eines Ziehereignisobjekts ist
dataTransfer
, das die gezogenen Daten enthält. Das
dataTransfer
-Objekt selbst verfügt über folgende Eigenschaften und Methoden:
Eigenschaft oder Methode
|
Beschreibung
|
effectAllowed
|
Der von der Quelle des Ziehvorgangs zugelassene Effekt. Typischerweise setzt die Prozedur für das dragstart-Ereignis diesen Wert. (Siehe
Zieheffekte in HTML
.)
|
dropEffect
|
Der vom Ziel oder Benutzer gewählte Effekt. Wenn Sie den Ablegeffekt (
dropEffect
) in einer
dragover
- oder
dragenter
-Ereignisprozedur setzen, aktualisiert AIR den Mauscursor. Dadurch zeigt der Curser immmer den Effekt an, der beim Loslassen der Maustaste eintritt. Wenn der eingestellte
dropEffect
keinem der zulässigen Effekte entspricht, kann das Element nicht abgelegt werden und der
Nicht-verfügbar-
Cursor wird angezeigt. Wenn Sie keinen
dropEffect
als Reaktion auf das letzte
dragover
- oder
dragenter
-Ereignis gesetzt haben, kann der Benutzer mithilfe der Standardzusatztasten des jeweiligen Betriebssystems aus den zulässigen Effekten einen auswählen.
Der Abschlusseffekt wird von der
dropEffect
-Eigenschaft des Objekts gemeldet, das für
dragend
ausgelöst wurde. Wenn der Benutzer den Ablegvorgang abbricht, indem er die Maustaste außerhalb eines zulässigen Ziels loslässt, wird
dropEffect
auf den Wert
none
gesetzt.
|
types
|
Ein Array mit den MIME-Typen aller gegenwärtigen Datenformate im Objekt
dataTransfer
.
|
getData(mimeType)
|
Ruft die Daten in dem vom
mimeType
-Parameter angegebenen Format ab.
Die Methode
getData()
kann nur als Reaktion auf das Ereignis
drop
aufgerufen werden.
|
setData(mimeType)
|
Fügt die Daten in dem vom
mimeType
-Parameter angegebenen Format in das dataTransfer-Objekt ein. Sie können Daten in mehreren Formaten einbinden, indem Sie
setData()
für jeden MIME-Typ aufrufen. Daten, die vom Standardziehverhalten in das Objekt
dataTransfer
eingefügt wurden, werden gelöscht.
Die Methode
setData()
kann nur als Reaktion auf das Ereignis
dragstart
aufgerufen werden.
|
clearData(mimeType)
|
Löscht alle Daten in dem vom
mimeType
-Parameter angegebenen Format ab.
|
setDragImage(image, offsetX, offsetY)
|
Definiert ein benutzerdefiniertes Ziehbild. Die
setDragImage()
-Methode kann nur in Reaktion auf das dragstart-Ereignis aufgerufen werden und nur, wenn ein gesamtes HTML-Element gezogen wird, indem sein
-webkit-user-drag
-CSS-Stil auf
element
gesetzt wird. Der
image
-Parameter kann ein JavaScript-Element oder Image-Objekt sein.
|
MIME-Typen für HTML-Drag & Drop-Aktionen
Für das
dataTransfer
-Objekt eines HTML-Drag & Drop-Ereignisses können folgende MIME-Typen verwendet werden:
Datenformat
|
MIME-Typ
|
Text
|
"text/plain"
|
HTML
|
"text/html"
|
URL
|
"text/uri-list"
|
Bitmap
|
"image/x-vnd.adobe.air.bitmap"
|
File list
|
"application/x-vnd.adobe.air.file-list"
|
Sie können auch andere MIME-Strings verwenden, auch von der Anwendung definierte Strings. Es ist jedoch möglich, dass andere Anwendungen die übertragenen Daten dann nicht erkennen oder verarbeiten können. Es liegt in Ihrer Verantwortung, Daten im erwarteten Format in das
dataTransfer
-Objekt einzufügen.
Wichtig:
Nur Code, der in der Anwendungs-Sandbox ausgeführt wird, kann auf abgelegte Dateien zugreifen. Der Versuch, Eigenschaften eines File-Objekts innerhalb einer anwendungsfremden Sandbox zu lesen oder zu setzen, erzeugt einen Sicherheitsfehler. Weitere Informationen finden Sie unter
Abgelegte Dateien in anwendungsfremden HTML-Sandboxen
.
Zieheffekte in HTML
Der Initiator der Ziehbewegung kann die zugelassenen Zieheffekte einschränken, indem er die Eigenschaft
dataTransfer.effectAllowed
in der Prozedur für das
dragstart
-Ereignis setzt. Es können die folgenden Stringwerte verwendet werden:
Stringwert
|
Beschreibung
|
"none"
|
Es sind keine Ziehoperationen zugelassen.
|
"copy"
|
Die Daten werden in das Ziel kopiert, bleiben aber auch am Herkunftsort erhalten.
|
"link"
|
Die Daten werden gemeinsam mit dem Ziel genutzt, indem eine Verknüpfung zum Herkunftsort erstellt wird.
|
"move”
|
Die Daten werden vom Herkunftsort entfernt und in das Ziel kopiert.
|
"copyLink"
|
Die Daten können kopiert oder verknüpft werden.
|
"copyMove"
|
Die Daten können kopiert oder verschoben werden.
|
"linkMove"
|
Die Daten können verknüpft oder verschoben werden.
|
"all"
|
Die Daten können kopiert, verschoben oder verknüpft werden.
all
ist der Standardeffekt, wenn Sie das Standardverhalten deaktiviert haben.
|
Vom Ziel der Ziehbewegung kann in der Eigenschaft
dataTransfer.dropEffect
festgelegt werden, welche Aktion durchgeführt wird, wenn der Benutzer den Ablegvorgang abschließt. Ist der Ablegeffekt eine der zulässigen Aktionen, zeigt das System den entsprechenden Kopier-, Verschieb- oder Verknüpfcursor an. Andernfalls zeigt das System den
Nicht-verfügbar-
Cursor an. Wenn vom Ziel kein Ablegeffekt eingestellt wurde, kann der Benutzer mithilfe der Zusatztasten aus den zulässigen Aktionen einen Effekt auswählen.
Den
dropEffect
-Wert legen Sie in den Prozeduren für die Ereignisse
dragover
und
dragenter
fest:
function doDragStart(event) {
event.dataTransfer.setData("text/plain","Text to drag");
event.dataTransfer.effectAllowed = "copyMove";
}
function doDragOver(event) {
event.dataTransfer.dropEffect = "copy";
}
function doDragEnter(event) {
event.dataTransfer.dropEffect = "copy";
}
Hinweis:
Obwohl Sie die Eigenschaft
dropEffect
in der Prozedur für
dragenter
immer einstellen sollten, müssen Sie sich im Klaren darüber sein, dass das nächste
dragover
-Ereignis die Eigenschaft auf ihren Standardwert zurücksetzt. Legen Sie daher als Reaktion auf beide Ereignisse einen
dropEffect
-Wert fest.
|
|
|