HtmlProgettazione Web

Drag&Drop

L’operazione inizia con un evento mousedown seguito da una serie di mousemove. Per rendere un elemento spostabile sono necessarie le seguenti operazioni:

  • aggiungere all’elemento l’attributo draggable;
  • associare un event listener per l’evento dragstart;

Tutti gli elementi HTML possono avere un attributo draggable:

  • true, è trascinabile;
  • false, non è trascinabile;
  • auto, utilizza il comportamento di default dell’user-agent;

Tutti gli elementi HTML possono rappresentare una dropzone:

  • copy, il drop di un elemento risulterà in una copya del draggable;
  • move, il drop di un elemento risulterà in una move del draggable;
  • link, il drop di un elemento risulterà in un collegamento ai dati originali;
  • una keyword di lunghezza >= ad 8 caratteri che inizia con “string:”;
  • una keyword di lunghezza >= a 6 caratteri che inizia con “file:”;

I dati che viaggiano nel contesto di una operazione Drag&Drop consistono in una collezione d’informazioni “drag data store”

  • un “drag data item kind”;
  • un “drag data item type”;
  • il dato vero e proprio;
  • informazione del feedback di default dello user-agent;
  • una lista di uno o più elementi definiti “drag data store elements list”;
  • opzionalmente una immagine bitmap e le coordinate di un punto dell’immagine stessa;
  • una “drag data store mode”:
    • Read/write;
    • Read-only;
    • Protected;
  • “drag data store allowed effects state”

DataTrasfer

interface DataTrasfer {
attribute DOMString dropEffect;
attribute DOMString effectAllowed;readonly attribute DataTrasferItemList items;void setDragImage(Element image, long x, long y);
void addElement(Element element);/* old interface */
readonly attribute DOMStringList types;
DOMString getData(DOMString format);
void setData(DOMString format, DOMString data);
void clearData(optional DOMString format);
readonly attribute FileList files;
};

Sono utilizzati dagli eventi Drag&Drop, analizziamo in dettaglio:

  • dataTransfer.dropEffect[= value], i valori possono essere none, copy, link, move;
  • dataTransfer.effectAllowed[ = value], i valori possono essere none, copy, copyLink, copyMove, link, linkMove, move, all, uninitialized;
  • dataTransfer.items, getter per lista di item;
  • dataTrasfer.setDragImage(element, x, y), utilizza element per effettuare un update del drag feedback, rimpiazzando il feedback precedenti;
  • dataTransfer.addElement(element), aggiunge element alla lista;
  • dataTransfer.types, ritorna un elenco dei formati impostati nell’evento dragstart;
  • data = dataTransfer.getData(format),ritorna il dato specificato;
  • dataTransfer.setData(format, data), aggiunge i dati specificati;
  • dataTransfer.files, ritorna un oggetto FileList contenente i file trascinati;

DataTransferItemList

interface DataTransferItemList {
readonly attribute unsigned long lenght;
getter DataTrasferItem (unsigned long index);
deleter void (unsigned long index);
void clear();DataTrasferItem? add(DOMString data, DOMString type);
DataTrasferItem? add(File data);
};

analizziamo in dettaglio:

  • item.lenght,restituisce il numero di item nel drag data store;
  • items[index], restituisce l’item specificato la cui posizione è descritta da index;
  • delete items[index], rimuove l’item all’interno del drag data store;
  • items.clear(), rimuove tutti gli items;
  • items.add(data, [type]), aggiunge una nuova entry;

DataTransferItem

interface DataTransferItem {
readonly attribute DOMString kind;
readonly attribute DOMString type;
void getAsString(FunctionStringCallback? callback);
File? getAsFile();
};[Callback, NoInterfaceObject]
interface FunctionStringCallback {
void handleEvent(DOMString data);
};

analizziamo nel dettaglio:

  • item.kind,getter  per il drag data item kind;
  • item.type, getter per il drag data item type;
  • item.getAsString(callback),invoca il callback con la stringa come argomento;
  • file = item.getAsFile(), ritorna in oggetto file;

DragEvent

[Constructor(DOMString type, optional DragEventInit eventInitDict)]
interface DragEvent : MouseEvent {
readonly attribute DataTransfer? dataTransfer;
};dictionary DragEventInit : MouseEventInit {
DataTransfer? dataTransfer;
};

dataTransfer è accessibile tramite event.dataTransfer. Ogni evento può essere intercettato e gestito con un listener.