Manipulando Dados de Elementos Arrastados com DataTransfer - Drag and Drop API - JavaScript
Quando um elemento é arrastado, o manipulador de eventos associado ao arraste recebe um objeto do tipo DragEvent
dataTransfer
DataTransfer
dataTransfer
Propriedades do Objeto DataTransfer
O objeto DataTransfer
: Define ou obtém o tipo de operação de arraste. Os valores possíveis são:dropEffect
: Cria uma cópia dos dados e a coloca na nova posição.copy
: Move os dados para a nova posição.move
: Cria um link para a origem dos dados.link
: Impede que os dados sejam movidos.none
: Define os tipos de operação permitidos durante o arraste. Valores possíveis:effectAllowed
: O elemento não pode ser arrastado.none
: Permite copiar o elemento.copy
: Permite copiar ou criar um link para o elemento.copyLink
: Permite copiar ou mover o elemento.copyMove
: Permite criar um link para o elemento.link
: Permite mover ou criar um link para o elemento.linkMove
: Permite mover o elemento para outro local.move
: Todas as operações são permitidas.all
: Valor padrão, equivalente auninitialized
.all
: Uma lista de arquivos locais disponíveis para o arraste. Se o arraste não envolver arquivos, esta propriedade será uma lista vazia.files
: Um objetoitems
que contém todos os itens de dados associados ao evento de arraste.DataTransferItemList
: Um array de strings que especifica os formatos de dados definidos no evento de arraste.types
Métodos do Objeto DataTransfer
Os seguintes métodos permitem a manipulação dos dados durante o arraste:
: Remove todos os dados associados ao objeto DataTransfer.clearData()
: 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.getData(format)
: Define os dados para um formato específico. Substitui os dados existentes do mesmo formato.setData(format, data)
: Define uma imagem personalizada exibida durante o arraste.setDragImage(imgElement, xOffset, yOffset)
: ElementoimgElement
usado como origem da imagem.<img>
exOffset
: Posições horizontais e verticais relativas dentro da imagem.yOffset
Os métodos setData()
getData()
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 (
): Os quadrados vermelho e azul possuem a classe item e o atributodraggable
, o que os torna arrastáveis.draggable="true"
Evento
: Este evento é disparado ao iniciar o arraste. O métododragstart
define o HTML do elemento como o dado a ser transferido.setData()
e.dataTransfer.setData("text/html", e.target.outerHTML);
Área de Destino (
):target
O evento dragover utiliza
para habilitar o comportamento de soltar o elemento.preventDefault()
Os eventos dragenter e dragleave alternam a classe
, alterando a aparência visual da área alvo.dragover
Evento
: No momento em que o item é solto, os dados são obtidos comdrop
e adicionados ao conteúdo da área alvo.getData()
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.