Als u gegevens in en uit een HTML-toepassing wilt slepen (of in en uit de HTML die wordt weergegeven in een HTMLLoader), kunt u gebeurtenissen voor het slepen en neerzetten van HTML gebruiken. Met de API voor het slepen en neerzetten van HTML kunt u gegevens slepen naar en vanuit DOM-elementen in de HTML-inhoud.
Opmerking:
U kunt ook de API's NativeDragEvent en NativeDragManager van AIR gebruiken door te luisteren naar gebeurtenissen van het HTMLLoader-object dat de HTML-inhoud bevat. De API voor HTML is echter beter geïntegreerd met het HTML DOM en geeft u meer controle over het standaardgedrag.
Standaardgedrag bij slepen en neerzetten
De HTML-omgeving biedt standaardgedrag voor bewegingen die betrekking hebben op het slepen en neerzetten van tekst, afbeeldingen en URL's. Met het standaardgedrag kunt u deze typen gegevens altijd uit een element slepen. U kunt echter alleen tekst naar een element slepen en alleen naar elementen in een bewerkbaar gebied op een pagina. Wanneer u tekst sleept tussen of in bewerkbare gebieden op een pagina, wordt de tekst standaard verplaatst. Wanneer u tekst vanuit een niet-bewerkbaar gebied of van buiten de toepassing naar een bewerkbaar gebied sleept, wordt de tekst standaard gekopieerd.
U kunt het standaardgedrag overschrijven door de gebeurtenissen voor slepen en neerzetten zelf af te handelen. Als u het standaardgedrag wilt annuleren, moet u de methode
preventDefault()
oproepen van de objecten die worden verzonden voor gebeurtenissen voor slepen en neerzetten. Vervolgens kunt u gegevens in het neerzetdoel invoegen en gegevens uit het sleepdoel verwijderen om de gekozen actie uit te voeren.
Standaard kan de gebruiker elke tekst selecteren en slepen, en afbeeldingen en koppelingen slepen. Met de CSS-eigenschap
-webkit-user-select
van de WebKit kunt u bepalen hoe elk HTML-element kan worden geselecteerd. Als u bijvoorbeeld
-webkit-user-select
op
none
instelt, kan de inhoud van het element niet worden geselecteerd en dus ook niet worden gesleept. U kunt ook de CSS-eigenschap
-webkit-user-drag
gebruiken om te bepalen of een element in zijn geheel kan worden gesleept. De inhoud van het element wordt echter afzonderlijk behandeld. De gebruiker kan ook een geselecteerd gedeelte van de tekst slepen. Zie
CSS in AIR
voor meer informatie.
Gebeurtenissen voor slepen en neerzetten in HTML
Het initiatorelement van waaruit een sleepbeweging afkomstig is, verzendt de volgende gebeurtenissen:
Gebeurtenis
|
Beschrijving
|
dragstart
|
Wordt verzonden wanneer de gebruiker de sleepbeweging start. De handler voor deze gebeurtenis kan indien nodig het slepen voorkomen door de methode preventDefault() van het gebeurtenisobject op te roepen. Stel de eigenschap effectAllowed in om te bepalen of de gesleepte gegevens kunnen worden gekopieerd, gekoppeld of verplaatst. Geselecteerde tekst, afbeeldingen en koppelingen worden standaard op het klembord geplaatst, maar u kunt verschillende gegevens voor de sleepbeweging instellen met de eigenschap dataTransfer van het gebeurtenisobject.
|
drag
|
Wordt continu verzonden tijdens de sleepbeweging.
|
dragend
|
Wordt verzonden wanneer de gebruiker de muisknop loslaat om de sleepbeweging te beëindigen.
|
Een sleepdoel verzendt de volgende gebeurtenissen:
Gebeurtenis
|
Beschrijving
|
dragover
|
Wordt continu verzonden zolang de sleepbeweging plaatsvindt binnen de grenzen van het element. De handler voor deze gebeurtenis moet de eigenschap dataTransfer.dropEffect instellen om aan te geven of de neergezette gegevens worden gekopieerd, verplaatst of gekoppeld wanneer de gebruiker de muisknop loslaat.
|
dragenter
|
Wordt verzonden wanneer de sleepbeweging binnen de grenzen van het element komt.
Als u eigenschappen van een dataTransfer-object wijzigt in een handler voor de dragenter-gebeurtenis, worden die wijzigingen overschreven door de volgende dragover-gebeurtenis. Er is echter een korte vertraging tussen een dragenter-gebeurtenis en de eerste dragover-gebeurtenis, waardoor de cursor kan gaan knipperen als andere eigenschappen zijn ingesteld. In veel gevallen kunt u dezelfde gebeurtenishandler gebruiken voor beide gebeurtenissen.
|
dragleave
|
Wordt verzonden wanneer de sleepbeweging buiten de grenzen van het element komt.
|
drop
|
Wordt verzonden wanneer de gebruiker de gegevens op het element neerzet. De gesleepte gegevens zijn alleen toegankelijk in de handler voor deze gebeurtenis.
|
Het gebeurtenisobject dat wordt verzonden als reactie op deze gebeurtenissen, is vergelijkbaar met een muisgebeurtenis. Met eigenschappen van een muisgebeurtenis, zoals (
clientX
,
clientY
) en (
screenX
,
screenY
), kunt u de positie van de muis bepalen.
De belangrijkste eigenschap van een sleepgebeurtenisobject is
dataTransfer
, dat de gegevens bevat die worden gesleept. Het
dataTransfer
-object heeft de volgende eigenschappen en methoden:
Eigenschap of methode
|
Beschrijving
|
effectAllowed
|
Het effect dat is toegestaan door de bron van waaruit wordt gesleept. Gewoonlijk wordt deze waarde ingesteld door de handler voor de gebeurtenis dragstart. Zie
Sleepeffecten in HTML
.
|
dropEffect
|
Het effect dat is gekozen door het doel of door de gebruiker. Als u
dropEffect
instelt in een gebeurtenishandler voor
dragover
of
dragenter
, wordt de muiscursor door AIR bijgewerkt en geeft deze het effect aan dat optreedt als de gebruiker de muis loslaat. Als de ingestelde waarde voor
dropEffect
niet overeenkomt met een van de toegestane effecten, is neerzetten niet toegestaan en wordt de cursor voor een
niet-beschikbare
actie weergegeven. Als u geen waarde voor
dropEffect
hebt ingesteld als reactie op de laatste
dragover
- of
dragenter
-gebeurtenis, kan de gebruiker uit de toegestane effecten kiezen met de standaard aanpassingstoetsen van het besturingssysteem.
Het uiteindelijke effect wordt gerapporteerd door de eigenschap
dropEffect
van het object dat wordt verzonden voor
dragend
. Als de gebruiker het neerzetten annuleert door de muisknop los te laten buiten een geschikt doel, wordt
dropEffect
ingesteld op
none
.
|
types
|
Een array met de MIME-tekenreeksen voor elke gegevensindeling die aanwezig is in het object
dataTransfer
.
|
getData(mimeType)
|
Hiermee worden de gegevens opgehaald in de indeling die is opgegeven met de parameter
mimeType
.
De methode
getData()
kan alleen worden opgeroepen als reactie op de gebeurtenis
drop
.
|
setData(mimeType)
|
Hiermee worden gegevens aan
dataTransfer
toegevoegd in de indeling die is opgegeven met de parameter mimeType. U kunt gegevens in meerdere indelingen toevoegen door
setData()
op te roepen voor elk MIME-type. Alle gegevens die door het standaardgedrag voor neerzetten in het object
dataTransfer
worden geplaatst, worden gewist.
De methode
setData()
kan alleen worden opgeroepen als reactie op de gebeurtenis
dragstart
.
|
clearData(mimeType)
|
Hiermee worden alle gegevens gewist in de indeling die is opgegeven met de parameter
mimeType
.
|
setDragImage(image, offsetX, offsetY)
|
Hiermee stelt u een aangepaste sleepafbeelding in. De
setDragImage()
-methode kan alleen worden aangeroepen als reactie op een dragstart-gebeurtenis en alleen wanneer een volledig HTML-element wordt versleept door zijn CSS-stijl
-webkit-user-drag
op
element
in te stellen. De parameter
image
kan een JavaScript-element of Image-object zijn.
|
MIME-typen voor het slepen en neerzetten van HTML
U kunt onder andere de volgende MIME-typen gebruiken met het object
dataTransfer
van een gebeurtenis voor het slepen en neerzetten van HTML:
Gegevensindeling
|
MIME-type
|
Tekst
|
"text/plain"
|
HTML
|
"text/html"
|
URL
|
"text/uri-list"
|
Bitmap
|
"image/x-vnd.adobe.air.bitmap"
|
Bestandenlijst
|
"application/x-vnd.adobe.air.file-list"
|
U kunt ook andere MIME-tekenreeksen gebruiken, zoals tekenreeksen die door de toepassing zijn gedefinieerd. Het is echter mogelijk dat andere toepassingen de overgedragen gegevens niet herkennen of kunnen gebruiken. Het is uw verantwoordelijkheid om gegevens aan het object
dataTransfer
toe te voegen in de verwachte indeling.
Belangrijk:
Alleen code die in de toepassingssandbox wordt uitgevoerd, heeft toegang tot neergezette bestanden. Als een eigenschap van een File-object wordt gelezen of ingesteld in een externe sandbox, wordt een beveiligingsfout gegenereerd. Zie
Bestanden neerzetten in niet-toepassingssandboxen in HMTL
voor meer informatie.
Sleepeffecten in HTML
De initiator van de sleepbeweging kan de toegestane sleepeffecten beperken door de eigenschap
dataTransfer.effectAllowed
in te stellen in de handler voor de gebeurtenis
dragstart
. De volgende tekenreeken kunnen worden gebruikt:
Tekenreekswaarde
|
Beschrijving
|
"none"
|
Er zijn geen sleepbewerkingen toegestaan.
|
"copy"
|
De gegevens worden naar het doel gekopieerd terwijl de oorspronkelijke gegevens op hun plaats blijven staan.
|
"link"
|
De gegevens worden met het neerzetdoel gedeeld via een koppeling met de oorspronkelijke gegevens.
|
"move”
|
De gegevens worden naar het doel gekopieerd en van de oorspronkelijke locatie verwijderd.
|
"copyLink"
|
De gegevens kunnen worden gekopieerd of gekoppeld.
|
"copyMove"
|
De gegevens kunnen worden gekopieerd of verplaatst.
|
"linkMove"
|
De gegevens kunnen worden gekoppeld of verplaatst.
|
"all"
|
De gegevens kunnen worden gekopieerd, verplaatst of gekoppeld.
All
is het standaardeffect wanneer u het standaardgedrag uitschakelt.
|
Het doel van de sleepbeweging kan de eigenschap
dataTransfer.dropEffect
instellen om aan te geven welke actie wordt uitgevoerd als de gebruiker de gegevens heeft neergezet. Als het neerzeteffect een van de toegestane acties is, wordt de juiste cursor voor kopiëren, verplaatsen of koppelen weergegeven. Als dat niet zo is, wordt de cursor voor een
niet-beschikbare
actie weergegeven. Als door het doel geen neerzeteffect is ingesteld, kan de gebruiker een toegestane actie kiezen met de aanpassingstoetsen.
Stel de waarde van
dropEffect
in de handlers voor de gebeurtenissen
dragover
en
dragenter
in:
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";
}
Opmerking:
Hoewel u de eigenschap
dropEffect
altijd moet instellen in de handler voor
dragenter
, moet u niet vergeten dat de volgende
dragover
-gebeurtenis de standaardwaarde van de eigenschap herstelt. Stel
dropEffect
in als reactie op beide gebeurtenissen.
|
|
|