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 (requiere e.preventDefault()).

    • ondrop: Ejecuta la acción final al soltar.

Requisitos básicos

  • Elemento arrastrable: Debe tener draggable="true".

  • Zona de destino: Debe manejar ondragover con e.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 en ondragstart (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:

  1. Siempre usa e.preventDefault() en ondragover.

  2. Valida los datos recibidos en ondrop para seguridad.

  3. Combina con otros eventos del ciclo de arrastre para una experiencia completa.

¡Ahora puedes implementar sistemas de drag and drop profesionales y accesibles!