Drag and Drop
Introduzione
La maggior parte degli utenti di applicazioni grafiche conosce le operazioni di trascinamento (drag) e rilascio (drop) di elementi grafici, spesso associate alla esecuzione di funzioni sugli oggetti interessati (un esempio è la cancellazione di un file tramite il suo trascinamento nel cestino).
L'operazione consiste in:- posizionamento del cursore sull'oggetto mediante il mouse;
- pressione del tasto sinistro del mouse;
- spostamento dell'oggetto con il mouse mantenendo la pressione del tasto sinistro;
- rilascio del tasto sinistro del mouse quando l'oggetto trascinato si trova nella posizione desiderata.
HTML5 ha reso disponibili un insieme di funzionalità che permettono di realizzare il drag and drop degli elementi delle pagine web. Vediamo in cosa consistono.
Attributo draggable
Tutti gli elementi HTML possono essere resi "trascinabili" settando a "true" il loro attributo draggable.
L'attributo draggable ha tre stati: true, false, auto. Il valore di default è auto che setta il valore
dell'attributo a true o false a seconda del comportamento di default per esso previsto dallo user agent (browser).
Gli elementi di tipo img e di tipo a con attributo href
hanno per default stato draggable uguale a true.
Gli altri elementi possono essere resi trascinabili ponendo draggable="true". Proprio quello che ho fatto per questo paragrafo, per il quale ho anche impostato la proprietà di stile cursor:move;
Il fatto di settare a true l'attributo draggable di un elemento fa si che il contenuto visibile dell'elemento stesso possa essere selezionato per le operazioni di drag and drop, ma nulla sarà eseguito se non si gestiscono, tramite codice JavaScripts, gli eventi generati a tale scopo.
Esempio 1
Per introdurre i meccanismi con cui HTML5 implementa le funzionalità di drag and drop descriveremo come permettere alle ciliege di essere trascinate dall'area verde a quella gialla e viceversa esaminando i frammenti di codice HTML, CSS e JavaScript realizzati.
Codice HTML
<div id="esempio1">
<div id="origine" ondragover="DragOver(event)" ondrop="Drop(event)">
<img alt="foto con ciliegie" src="../photos/ciliege.jpg" id="ciliegie" ondragstart="iniziaDrag(event)" width="150"/>
</div>
<div id="destinazione" ondragover="DragOver(event)" ondrop="Drop(event)"></div>
</div>
- Non è necessario specificare l'attributo draggable per l'immagine contenente le ciliege in quanto per le immagini lo stato draggable è per default true. E' invece necessario specificare il gestore dell'evento ondragstart che nel caso specifico è una function scritta in JavaScript.
- Gli elementi destinati a ricevere l'oggetto trascinato devono gestire gli eventi ondragover e drop.
Codice CSS
#esempio1 { background-color:white; height:150px; }
#origine { position:relative; top:10px; left:50px; width:170px; height:135px; background-color:#af3;}
#destinazione { position:relative; top:-125px; left:250px; width:170px; height:135px; background-color:#ff3;}
#ciliegie { cursor:move; padding:10px;}
Limitatamente agli aspetti che riguardano le funzionalità di drag and drop l'unica cosa da notare è il valore assegnato alla property cursor dell'elemento ciliegie.
Codice JavaScript
Consiste degli handler degli eventi ondragstart, ondragover, ondrop:
var foto; /* variabile usata per memorizzare l'attributo id dell'oggetto trascinato. */
function iniziaDrag(event){
/* carica in foto l'attributo id dell'elemento trascinato */
foto=event.target.getAttribute("id");
}
function DragOver(event){
/* per default gli elementi html non accettano l'operazione di drop
preventDefault() annulla il comportamento di default.*/
event.preventDefault();
}
function Drop(event){
/* recupera dal documento corrente l'elemento il cui identificatore è stato
precedentemente caricato in foto e lo appende al contenitore di destinazione.
event.target.appendChild(document.getElementById(foto));
}
Un esempio, molto simile a questo è descritto in w3schools HTML APIs Drag/Drop