Manipulando Dados no Drag and Drop API com dataTransfer em JavaScript
Quando um elemento é arrastado, o manipulador de eventos associado ao arraste recebe um objeto do tipo DragEvent. Esse evento possui uma propriedade especial chamada dataTransfer, que é uma instância de DataTransfer. A propriedade dataTransfer permite acessar e manipular os dados associados ao elemento arrastado durante o evento.
Propriedades do Objeto DataTransfer
O objeto DataTransfer oferece várias propriedades para manipular dados arrastáveis:
dropEffect: Define ou obtém o tipo de operação de arraste. Os valores possíveis são:copy: Cria uma cópia dos dados e a coloca na nova posição.move: Move os dados para a nova posição.link: Cria um link para a origem dos dados.none: Impede que os dados sejam movidos.
effectAllowed: Define os tipos de operação permitidos durante o arraste. Valores possíveis:none: O elemento não pode ser arrastado.copy: Permite copiar o elemento.copyLink: Permite copiar ou criar um link para o elemento.copyMove: Permite copiar ou mover o elemento.link: Permite criar um link para o elemento.linkMove: Permite mover ou criar um link para o elemento.move: Permite mover o elemento para outro local.all: Todas as operações são permitidas.uninitialized: Valor padrão, equivalente aall.
files: Uma lista de arquivos locais disponíveis para o arraste. Se o arraste não envolver arquivos, esta propriedade será uma lista vazia.items: Um objetoDataTransferItemListque contém todos os itens de dados associados ao evento de arraste.types: Um array de strings que especifica os formatos de dados definidos no evento de arraste.
Métodos do Objeto DataTransfer
Os seguintes métodos permitem a manipulação dos dados durante o arraste:
clearData(): Remove todos os dados associados ao objetoDataTransfer.getData(format): Obtém os dados de um formato específico. Retorna uma string vazia caso os dados para o formato solicitado não estejam disponíveis.setData(format, data): Define os dados para um formato específico. Substitui os dados existentes do mesmo formato.setDragImage(imgElement, xOffset, yOffset): Define uma imagem personalizada exibida durante o arraste.imgElement: Elemento<img>usado como origem da imagem.xOffseteyOffset: Posições horizontais e verticais relativas dentro da imagem.
Os métodos setData() e getData() são especialmente úteis para transferir dados personalizados no contexto do arraste.
O exemplo abaixo demonstra como implementar elementos arrastáveis e gerenciar os dados associados ao arraste.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Exemplo de Drag & Drop</title>
<style>
#target {
width: 200px;
height: 150px;
border: 1px dashed #ccc;
}
#target.dragover {
border-color: #000;
}
.item {
width: 50px;
height: 50px;
display: inline-block;
margin: 5px;
cursor: grab;
}
</style>
</head>
<body>
<div class="item" style="background-color: red;" draggable="true"></div>
<div class="item" style="background-color: blue;" draggable="true"></div>
<div id="target"></div>
<script>
const items = document.getElementsByClassName("item");
// Configura o evento "dragstart" para os elementos arrastáveis
for (const item of items) {
item.addEventListener("dragstart", (e) => {
// Define o HTML do elemento como dado arrastável
e.dataTransfer.setData("text/html", e.target.outerHTML);
});
}
const target = document.getElementById("target");
// Permite o comportamento de "drop" na área alvo
target.addEventListener("dragover", (e) => e.preventDefault());
// Adiciona uma classe para indicar quando o item está sobre a área alvo
target.addEventListener("dragenter", (e) => e.target.classList.add("dragover"));
target.addEventListener("dragleave", (e) => e.target.classList.remove("dragover"));
// Adiciona o elemento arrastado à área alvo ao soltá-lo
target.addEventListener("drop", (e) => {
e.preventDefault();
e.target.innerHTML += e.dataTransfer.getData("text/html");
e.target.classList.remove("dragover");
});
</script>
</body>
</html>Explicação do código acima:
- Elementos Arrastáveis (
draggable): Os quadrados vermelho e azul possuem a classe item e o atributodraggable="true", o que os torna arrastáveis. Evento
dragstart: Este evento é disparado ao iniciar o arraste. O métodosetData()define o HTML do elemento como o dado a ser transferido.e.dataTransfer.setData("text/html", e.target.outerHTML);Área de Destino (
target):- O evento dragover utiliza
preventDefault()para habilitar o comportamento de soltar o elemento. - Os eventos dragenter e dragleave alternam a classe
dragover, alterando a aparência visual da área alvo.
- O evento dragover utiliza
Evento
drop: No momento em que o item é solto, os dados são obtidos comgetData()e adicionados ao conteúdo da área alvo.e.target.innerHTML += e.dataTransfer.getData("text/html");- Interatividade Visual: A classe dragover muda a borda da área de destino enquanto o elemento está sobre ela.

Documentação oficial: