Il drag and drop è un'interazione che l'utente svolge trascinando e rilasciando gli elementi della pagina. Storicamente questo tipo di interazione era già disponibile in Internet Explorer 6, ma solo con HTML5 le API per il drag and drop sono state standardizzate.

Rendere gli elementi trascinabili

In HTML5 gli elementi che useranno il drag and drop vengono definiti come tali tramite l'attributo draggable:


<div id="test" draggable="true">Draggable Div</div>

Eventi del drag and drop

Ci sono diversi eventi DOM che gestiscono il drag and drop:

Esempio:


var draggableElement = document.getElementById('test');
draggableElement.addEventListener('dragstart', function(e) { 
	console.log('Drag Interaction Started!');
});

L'oggetto DataTransfer

Quando viene inizializzata un'azione di trascinamento l'oggetto DataTransfer viene creato e associato a tale azione. Questo oggetto conserva sia dati che informazioni sull'evento di trascinamento.

Esempio: trascinamento di file

Partiamo dalla seguente marcatura:


<div id="files">Drop a .txt file here</div> 
<pre id="file-content"></pre>

Scriveremo il seguente codice:


var dropZone = document.getElementById('files'),
	fileContainer = document.getElementById('file-content');

dropZone.addEventListener('dragover', function(e) {
	e.preventDefault();
	e.dataTransfer.dropEffect = 'copy';
}, false);

dropZone.addEventListener('dragenter', function(e) {
	this.className = 'over';
}, false);

dropZone.addEventListener('dragleave', function(e) {
	this.className = '';
}, false);

dropZone.addEventListener('drop', function(e) {
	e.preventDefault();
	this.className = '';
	var fileList = e.dataTransfer.files;
	if (fileList.length > 0) { 
		readTextFile(fileList[0]);
	} 
}, false);

A questo punto utilizziamo le API FileReader per leggere il contenuto del file:


var readTextFile = function(file) {
	var reader = new FileReader();
	reader.onloadend = function(e) {
		if (e.target.readyState == FileReader.DONE) {
			var content = reader.result;
			fileContainer.innerHTML = "File: " + file.name + "\n\n" + content; 
		}
	};
	reader.readAsBinaryString(file); 
};

Supporto nei browser