Il logo del sito

Appunti su JavaScript

Drag and drop

Introduzione a drag and drop

Per introdurre i meccanismi con cui HTML5 implementa le funzionalità di drag and drop descriviamo come permettere all'immagine contenente le ciliegie possa essere trascinata dall'area verde a quella gialla e viceversa.

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:
  1. posizionamento del cursore sull'oggetto mediante il mouse;
  2. pressione del tasto sinistro del mouse;
  3. spostamento dell'oggetto con il mouse mantenendo la pressione del tasto sinistro;
  4. 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.

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. In questo esempio sono gestiti gli eventi: dragstart, dragover e drop che permettono all'immagine delle ciliegie di poter trascinata dall'area verde a quella gialla e viceversa.

Al solo scopo di facilitare l'utente nella individuazione di elementi trascinabili ho impostato per essi la proprietà di stile cursor:move;

Ciliegie

Ecco il codice necessario per spostare le ciliegie dall'area verde a quella gialla e viceversa:

HTML

<div id="origine" ondragover="DragOver(event)" 
		ondrop="Drop(event)">
	<img src="../images/ciliege.jpg" id="ciliegia" 
		ondragstart="iniziaDrag(event)"  width="150px"/>
</div >
<div id="destinazione" ondragover="DragOver(event)" 
		ondrop="Drop(event)">
</div>
  • Alla immagine delle ciliegie è associato la funzione iniziaDrag per la gestione dell'evento dragstart.
  • I contenitori "origine" e "destinazione" sono gli unici elementi in grado di rilevare che un qualche oggetto è stato trascinato sopra di loro, evento dragover, e che sono stati predisposti per gestire l'evento drop (rilascio dell'oggetto trascinato)
Notare come il cursore durante l'operazione di trascinamento cambi forma:
  • quattro frecce quando sopra l'oggetto draggabile prima di iniziare il trascinamento
  • un cerchietto barrato durante il trascinamento, quando non è intercettato l'evento ondragover
  • un rettangolino quando è intercettato l'evento dragover

CSS

  
#origine {
	width:170px; height:135px;
	position:absolute; top:0px;
	background-color:#af3;
}
	#destinazione {
	width:170px; height:135px;
	position:absolute; top:210px;
	background-color:#ff3;
}
img {
	cursor:move;
	padding:10px;
}
  • Il posizionamento assoluto delle due div "origine" e "destinazione" è scelto per evitare il ridimensionamento delle aree verde e gialla in seguito allo spostamento dell'immagine.
  • la proprietà cursor:move; fa si che il cursore assuma un aspetto speciale che evidenzia la "trascinabilità" di img.

JS

  
var foto;
function iniziaDrag(event){
	foto=event.target.getAttribute("id");
}
function DragOver(event){
	event.preventDefault();
}
function Drop(event){
	event.target.appendChild(document.getElementById(foto));
} 
Funzione iniziaDrag(event) - Handler di dragstart
Ottiene l'identificatore dell'elemento trascinato, in questo caso l'immagine delle ciliegie, e lo carica nella variabile globale foto.
Funzione DragOver(event) - Handler di dragover
L'evento dragover si verifica quando un elemento trascinabile è trascinato in una posizione valida per il rilascio. Per default elementi html non possono essere rilasciati su altri elementi html. Per evitare il comportamento di default si deve invocare il metodo preventDefault() dell'evento dragover.
Funzione Drop(event) - Handler di drop
L'evento drop si verifica quando un elemento trascinato è rilasciato in una posizione. Il metodo appendChild(elemento) appende l'elemento trascinato nell'elemento di destinazione e lo cancella dall'elemento di provenienza.