← Back to HTML5 APIs Chapter
API Types

🤏 Drag and Drop API — Uthao Aur Rakh Do

draggable="true" ondragstart / ondrop

Drag and Drop API se users elements ko utha kar doosri jagah rakh sakte hain. Jaise physical to-do list mein item move karna — "Buy onions" card uthao aur "Pending" se "Done" column mein rakh do.

Do taraf hain: drag source (draggable="true") aur drop target (dragover aur drop events sunta hai). Drag ke dauraan 7 events fire hote hain: dragstart → drag → dragend (source pe) aur dragenter → dragover → dragleave → drop (target pe). dragover mein event.preventDefault() ZAROOR call karo — warna drop kaam nahi karega.

🛺
Physical Card Analogy: IT office mein Kanban board socho — "To Do", "In Progress", "Done" columns. Sticky note uthao (dragstart), column ke upar le jao (dragover), "Done" mein rakh do (drop). HTML5 Drag & Drop yahi process digital mein karta hai.

Code Example

HTML — Drag and Drop API — Uthao Aur Rakh Do
<!-- Draggable item -->
<div
  id="item1"
  draggable="true"
  ondragstart="handleDragStart(event)"
  style="padding: 12px; background: #f0f0f0; margin: 8px 0; cursor: grab;"
>
  🧅 Biryani Ingredients Khareedo
</div>

<!-- Drop zone -->
<div
  id="dropZone"
  ondragover="handleDragOver(event)"
  ondragleave="handleDragLeave(event)"
  ondrop="handleDrop(event)"
  style="padding: 24px; border: 2px dashed #ccc; min-height: 100px;"
>
  Items yahan drop karo
</div>

<script>
let draggedItem = null;

function handleDragStart(e) {
  draggedItem = e.target;
  e.dataTransfer.effectAllowed = "move";
  e.dataTransfer.setData("text/plain", e.target.id);
  e.target.style.opacity = "0.5";
}

function handleDragOver(e) {
  e.preventDefault(); // ZAROORI — bina iske drop nahi hoga!
  e.dataTransfer.dropEffect = "move";
  e.currentTarget.style.borderColor = "#10b981";
  e.currentTarget.style.background = "#f0fdf4";
}

function handleDragLeave(e) {
  e.currentTarget.style.borderColor = "#ccc";
  e.currentTarget.style.background = "transparent";
}

function handleDrop(e) {
  e.preventDefault();
  e.currentTarget.style.borderColor = "#ccc";
  e.currentTarget.style.background = "transparent";

  if (draggedItem) {
    e.currentTarget.appendChild(draggedItem);
    draggedItem.style.opacity = "1";
    draggedItem = null;
  }
}
</script>
draggable="true"Element ko draggable banao — default false hai
ondragstartDrag shuru hone pe — data store karo, opacity change karo
ondragoverTarget ke upar drag karne pe — MUST preventDefault() karo
ondropItem drop hone pe — element ko yahan move karo
ondragleaveTarget se drag bahar jane pe — styles reset karo
e.preventDefault() in dragoverZAROORI — bina iske browser drop block karta hai by default!
dataTransfer.setData()Drag ke dauran data store karo — ID, text, ya custom data
dataTransfer.filesDropped files access karo — file upload drag & drop ke liye

✅ When to Use

  • Kanban boards (Trello jaisa)
  • Reorderable lists (items ko drag se sort karo)
  • File upload areas (files ko zone mein drag karo)
  • Shopping cart (items cart mein drag karo)
  • Image galleries (photos reorder karo)

❌ When NOT to Use

  • Mobile apps (touch drag ke liye alag handling chahiye — touch events ya libraries use karo)
  • Simple click interactions (drag overkill hai move/click ke liye)
  • Complex sorting chahiye (SortableJS jaisi library use karo)
💡
Sabse bada bug: dragover mein e.preventDefault() bhoolna. Browser ka default behavior drop ko block karna hai. Tumhe preventDefault zaroor karna hai. Aur drag & drop mobile pe achhe se kaam nahi karta — touch devices ke liye SortableJS jaisi library use karo.