back to top

Drag&Drop – Gli eventi associati

Ogni evento che partecipa al processo di click, trascinamento e deposito può essere intercettato e gestito con un listener, gli eventi intercettabili sono:

  • dragstart
  • drag
  • dragenter
  • dragleave
  • dragover
  • drop
  • dragend

Iniziamo con un esempio semplice: intercettiamo il dragstart, l’inizio del trascinamento:

<!doctype html>
<html>
<head>
  <title>Drag&Drop - il dragstart</title>
  <style>
  #divdrag {
    width: 300px; 
    height: 100px; 
    background-color: #333;
    color: #fff;
    cursor: move;
    padding: 10px;
  }
  p {
    margin-top: 40px;
    text-align: center;
  }
  </style>
  <script>
    function dragStart(e) {
	
      // # event (e).target è il nostro div "sorgente"
      var target = e.target;

      // # Inserisco nell'oggetto DataTransfer un testo
      e.dataTransfer.setData("Text", "Te lo avevo detto");
      
      // # consento il move
      e.dataTransfer.effectAllowed = "move"; 
  
      // # cambio il colore del div
      target.style.backgroundColor = "#cc0000";
      
      // # e ne modifico il testo prendendolo dall'oggetto DataTransfer
      target.innerHTML = "<p>" + e.dataTransfer.getData("Text") + "</p>";
    }
  </script>
<body>
  <div id="divdrag" ondragstart="dragStart(event)" draggable="true">
    <p>Se mi trascini divento rosso!</p>
  </div>
</body>
</html>

L’esempio utilizza DataTransfer per incapsulare una stringa che poi utilizza per cambiare il testo dell’elemento trascinato.

Il div prima del trascinamento:

dragstart

e durante:

dragstart 2

Affrontiamo ora un caso leggermente più complesso, un drag finalizzato ad un drop. Utilizzeremo l’evento ondrop sull’area di deposito (un div) e cancelleremo gli eventi dragenter e dragover in modo da far capire allo user-agent che il div con id = "divdrop" è la nostra area di deposito.

Il meccanismo di "cancellazione" avviene aggiungendo agli handlers dragOver e dragEntered un event.preventDefault() (return false per IE).

<!doctype html>
<html>
<head>
<title>Drag & Drop, dragEnded, dragEnter, dragEnded, drop</title>
<style>
  #divdrag {
    width: 200px; 
    height: 100px; 
    background-color: #333;
    color: #fff;
    cursor: move;
    padding: 10px;
  }
  
  #divdrop {
    width: 300px; 
    height: 150px; 
    background-color: #ccc;
    color: #333;
    padding: 10px;
    margin-top: 10px;
  }
  
  p {
    margin-top: 40px;
    text-align: center;
  }
</style>
<script>

// # Definisco il type
var format = "Text";

// # Gestione del dragstart
function dragStart(e) {
	
  // # event (e).target è il nostro div "sorgente"
  var target = e.target;
  
  e.dataTransfer.setData(format, "Riccardo");
  
  // # consento solo il move
  e.dataTransfer.effectAllowed = "move"; 
  
  target.style.backgroundColor = '#cc0000';
}

// # Gestione del dragenter (cancel)
function dragEnter(e) 

  if(event.preventDefault) {
    event.preventDefault();
  }
  
  return false; 
}

// # Gestione del dragover (cancel)
function dragOver(e) {

  if(event.preventDefault) {
    event.preventDefault();
  }
  
  return false; 	
}

// # Gestione del dragend 
function dragEnd(e) {
  e.target.parentNode.removeChild(e.target);
}

//# Gestione del drop
function drop(e) {
	
  // # event (e).target qui è il nostro "drop" div
  var target = e.target;
	
  // # Recupero la stringa "Riccardo"
  var data = e.dataTransfer.getData(format);
  target.innerHTML = "<p>Benvenuto...</p>";
   
  // # Creo un elemento p
  var p = document.createElement("p");
   
  // # Gli assegno "Riccardo" come testo
  p.textContent = data;
   
  // # Appendo p al div
  target.appendChild(p);
  
}
</script>
<body>

  <div id="divdrag" ondragstart="dragStart(event)" ondragend="dragEnd(event)" draggable="true">
    <p>Arrivo!</p>
  </div>
  <div id="divdrop" ondragenter="dragEnter(event)" ondragover="dragOver(event)" ondrop="drop(event)">
    <p>Ti aspetto!</p>
  </div>
  
</body>
</html>

Notate l’handler per l’evento dragend; al termine del’operazione l’elemento trascinato viene eliminato.

Nelle immagini che seguono, l’intero processo di Drag&Drop su Chrome:

Tempo 0:

dragenter

Drag:

dragIn

Drop:

dragEnded
Pubblicitร 

In questa guida...