El Atributo ONDROP

Es parte de la API de Drag and Drop de HTML5 y se activa cuando un elemento arrastrable se suelta sobre una zona de destino válida.
El atributo ondrop es parte de la API de Drag and Drop de HTML5 y se activa cuando un elemento arrastrable se suelta sobre una zona de destino válida. Es esencial para completar operaciones de arrastre y soltar (drag and drop), como mover elementos, subir archivos o actualizar datos.
¿Qué hace ondrop?
-
Disparador: Cuando el usuario suelta un elemento arrastrado sobre una zona de destino.
-
Propósito principal:
-
Procesar datos transferidos durante el arrastre.
-
Actualizar la interfaz o realizar acciones específicas (ej: mover elementos, subir archivos).
-
-
Relación con otros eventos:
-
ondragstart: Configura los datos a transferir. -
ondragover: Permite soltar el elemento en la zona (requieree.preventDefault()). -
ondrop: Ejecuta la acción final al soltar.
-
Requisitos básicos
-
Elemento arrastrable: Debe tener
draggable="true". -
Zona de destino: Debe manejar
ondragovercone.preventDefault()para aceptar el drop.
Sintaxis básica
Como atributo HTML:
<div id="zonaDestino" ondragover="event.preventDefault()" ondrop="manejarDrop(event)" > Suelta aquí </div>
Con JavaScript (recomendado):
const zona = document.getElementById("zonaDestino");
zona.addEventListener("dragover", (e) => {
e.preventDefault(); // Obligatorio para permitir el drop
});
zona.addEventListener("drop", (e) => {
// Acciones al soltar el elemento
});
Ejemplos prácticos
Ejemplo 1: Mover elementos entre contenedores
<div class="item" draggable="true" ondragstart="event.dataTransfer.setData('text/plain', 'item1')">
???? Elemento 1
</div>
<div
id="contenedor"
ondragover="event.preventDefault()"
ondrop="moverElemento(event)"
style="border: 2px dashed #ccc; padding: 20px;"
>
Zona de destino
</div>
<script>
function moverElemento(e) {
e.preventDefault();
const id = e.dataTransfer.getData("text/plain");
const elemento = document.querySelector(`[ondragstart*="${id}"]`);
e.target.appendChild(elemento);
}
</script>
Ejemplo 2: Subir archivos arrastrados
<div
id="dropZone"
ondragover="event.preventDefault()"
ondrop="subirArchivos(event)"
style="border: 2px dashed #666; padding: 30px;"
>
???? Arrastra archivos aquí
</div>
<ul id="listaArchivos"></ul>
<script>
function subirArchivos(e) {
e.preventDefault();
const archivos = e.dataTransfer.files;
const lista = document.getElementById("listaArchivos");
for (const archivo of archivos) {
const li = document.createElement("li");
li.textContent = `${archivo.name} (${(archivo.size / 1024).toFixed(2)} KB)`;
lista.appendChild(li);
}
}
</script>
Ejemplo 3: Sistema de tareas (Kanban)
<div class="columna" ondragover="event.preventDefault()" ondrop="moverTarea(event)">
<div class="tarea" draggable="true" ondragstart="event.dataTransfer.setData('text/plain', 'tarea1')">
Tarea: Diseñar interfaz
</div>
</div>
<div class="columna" ondragover="event.preventDefault()" ondrop="moverTarea(event)">
???? En progreso
</div>
<script>
function moverTarea(e) {
e.preventDefault();
const id = e.dataTransfer.getData("text/plain");
const tarea = document.querySelector(`[ondragstart*="${id}"]`);
e.target.appendChild(tarea);
}
</script>
Propiedades clave del evento ondrop
Accede a datos útiles desde el objeto event:
-
dataTransfer: Contiene datos configurados enondragstart(ej: texto, archivos). -
clientX/clientY: Coordenadas donde se soltó el elemento. -
target: Elemento sobre el que se soltó el elemento arrastrado.
Pasos para implementar Drag and Drop
Habilitar arrastre:
<div draggable="true" ondragstart="...">...</div>
Configurar datos en ondragstart:
elemento.addEventListener("dragstart", (e) => {
e.dataTransfer.setData("text/plain", "mi-dato");
});
Permitir drop en la zona destino:
zona.addEventListener("dragover", (e) => e.preventDefault());
Manejar ondrop:
zona.addEventListener("drop", (e) => {
const datos = e.dataTransfer.getData("text/plain");
// Lógica de procesamiento...
});
Mejores prácticas
Validar datos antes de procesar:
if (e.dataTransfer.types.includes("text/plain")) {
// Procesar solo si el tipo de datos es correcto
}
Proporcionar feedback visual:
Usar clases CSS para resaltar zonas durante ondragenter y ondragover.
Accesibilidad:
- Incluir alternativas (ej: botones para subir archivos).
- Usar roles ARIA (
aria-dropeffect,aria-grabbed).
Errores comunes
<!-- MAL: Olvidar draggable="true" -->
<div ondragstart="...">No se puede arrastrar</div>
<!-- CONFUSIÓN: No prevenir el comportamiento predeterminado en ondragover -->
<div ondrop="..."> <!-- ¡Falta ondragover con e.preventDefault()! --> </div>
<!-- SEGURIDAD: No validar datos -->
<script>
zona.addEventListener("drop", (e) => {
const datos = e.dataTransfer.getData("text/plain");
// ¡Podría ser cualquier dato malicioso!
});
</script>
Compatibilidad
| Navegador | Soporte | Notas |
|---|---|---|
| Chrome | ✅ Todas versiones | |
| Firefox | ✅ Todas versiones | |
| Safari | ✅ v12+ | |
| Edge | ✅ Todas versiones | |
| Móviles | ⚠️ Limitado | Requiere manejo de eventos táctiles |
Conclusión
El atributo ondrop es esencial para:
-
Completar operaciones de arrastre y soltar.
-
Crear interfaces interactivas (ej: gestores de archivos, tableros Kanban).
-
Mejorar la experiencia del usuario con funcionalidades intuitivas.
Recuerda:
-
Siempre usa
e.preventDefault()enondragover. -
Valida los datos recibidos en
ondroppara seguridad. -
Combina con otros eventos del ciclo de arrastre para una experiencia completa.
¡Ahora puedes implementar sistemas de drag and drop profesionales y accesibles!