HTML ondragover Attribute

Beginner
⏱️ 5 min read
📚 Updated: Jun 2026
🎯 3 Examples
Events & Handlers

Introduction

The ondragover attribute is an inline event handler that runs JavaScript when the dragover event fires on a drop target. That happens continuously while a dragged item’s pointer is over the target element. It is part of the HTML Drag and Drop API: pair a draggable="true" source with a receiver that listens for dragenter, dragover, dragleave, and drop. The central rule: call event.preventDefault() in every dragover handler on the drop target—without it the browser blocks the drop. You can also set event.dataTransfer.dropEffect (copy, move, link, none) for cursor feedback. Pair ondragover with ondragenter/ondragleave for highlights and ondrop for completion. For production sites, prefer addEventListener("dragover", …) over inline handlers.

What You’ll Learn

01

Event handler

Inline JS.

02

dragover event

On drop target.

03

preventDefault

Required for drop.

04

dropEffect

Cursor feedback.

05

addEventListener

Preferred way.

06

Compare events

enter/leave/drop.

Purpose of ondragover Attribute

The primary purpose of ondragover is to define what happens while a dragged item hovers over a drop target. Common uses include calling event.preventDefault() to allow dropping, setting event.dataTransfer.dropEffect for visual feedback, and updating a status label while the pointer moves inside the zone. It connects continuous pointer movement over a receiver to JavaScript without a full page reload.

Do not confuse ondragover with ondragstart—that fires on the source when the drag begins. dragover fires on the target repeatedly while hovering. Unlike dragenter (once on boundary entry) or dragleave (on exit), dragover is where you must call preventDefault() to enable the subsequent drop event. Avoid alert() in handlers; update visible status text instead.

💡
preventDefault is mandatory

Without event.preventDefault() in dragover, the browser treats the target as a no-drop zone and the drop event never fires. Call it on every dragover tick while the pointer is over a valid receiver.

📝 Syntax

Set ondragover on a drop target or assign element.ondragover:

ondragover.html
<script>

  function handleDragOver(event) {

    event.preventDefault();

    event.dataTransfer.dropEffect = "move";

    document.getElementById("status").textContent = "dragover — drop allowed.";

  }

  function handleDrop(event) {

    event.preventDefault();

    document.getElementById("status").textContent = "drop — item released.";

  }

</script>



<div draggable="true">Drag me</div>

<div id="dropZone" ondragover="handleDragOver(event)" ondrop="handleDrop(event)">Drop zone</div>

<p id="status"></p>

Syntax Rules

  • Value is JavaScript code executed repeatedly while the pointer is over the drop target.
  • dragover fires on the drop target, not on the draggable source.
  • Pair a draggable="true" source with handlers on the receiver.
  • Call event.preventDefault() in every dragover handler to allow drop.
  • Optional: set event.dataTransfer.dropEffect to copy, move, link, or none.
  • JavaScript: element.ondragover = function(event) { … }.
  • Modern alternative: element.addEventListener("dragover", handler).

💎 Values

The ondragover attribute accepts a string of JavaScript code:

  • ondragover="handleDragOver(event)" — Call a named function with the event object.
  • ondragover="event.preventDefault()" — Minimal inline statement to allow drop.
  • JavaScript: zone.ondragover = (e) => { e.preventDefault(); … } assigns the handler.
  • Set event.dataTransfer.dropEffect inside the handler for cursor feedback.
ondragover-js.html
const zone = document.getElementById("dropZone");



zone.addEventListener("dragover", (event) => {

  event.preventDefault();

  event.dataTransfer.dropEffect = "move";

  document.getElementById("status").textContent =

    "dragover — preventDefault enables drop.";

});



zone.addEventListener("drop", (event) => {

  event.preventDefault();

  document.getElementById("status").textContent =

    "drop — payload accepted.";

});



document.getElementById("dropZone").ondragover = function (event) {

  event.preventDefault();

  console.log("dropEffect:", event.dataTransfer.dropEffect);

};

⚡ Quick Reference

EventWhen it firesHandler
dragenterPointer enters target boundaryondragenter
dragoverRepeatedly while over targetondragover
dragleavePointer leaves target boundaryondragleave
dropItem released on valid targetondrop
preventDefaultRequired in dragover to allow dropCall on every dragover tick
dropEffectSet during dragovercopy, move, link, none
Without preventDefaultBrowser blocks dropdrop event will not fire

Applicable Elements

TargetSupported?Notes
<div>, <section>YesCommon drop zones; call preventDefault in dragover
<ul>, <li>YesSortable lists; dragover on each valid receiver
<td>, <th>YesTable cell drop targets
<article>, <main>YesLarge layout drop areas
Draggable sourceSeparateSet draggable="true" on source; use ondragstart there

ondragover vs ondragenter vs ondragleave vs ondrop

HandlerWhen it firesElementTypical use
ondragenterBoundary entered (once)Drop targetHighlight zone, show “drop here” status
ondragoverRepeatedly while hoveringDrop targetpreventDefault() to allow drop; set dropEffect
ondragleaveBoundary leftDrop targetRemove highlight; pair with dragenter
ondropOnce when released on valid targetDrop targetAccept payload, move DOM node, update data

Examples Gallery

Inline ondragover with preventDefault and drop handler, dynamic element.ondragover assignment, and a side-by-side comparison of dragover with vs without preventDefault.

👀 Live Preview

Drag the box over the drop zone. dragover calls preventDefault() so drop works:

Drag this box.
Drop zone

Waiting for dragover or drop…

Example — Inline ondragover on drop zone

Call preventDefault() in ondragover and handle ondrop on the same target:

inline-ondragover.html
<div draggable="true">Drag me</div>

<div id="dropZone" ondragover="handleDragOver(event)" ondrop="handleDrop(event)">Drop zone</div>

<p id="msg"></p>



<script>

  function handleDragOver(event) {

    event.preventDefault();

    document.getElementById("msg").textContent = "dragover — drop allowed.";

  }

  function handleDrop(event) {

    event.preventDefault();

    document.getElementById("msg").textContent = "drop — item released.";

  }

</script>
Try It Yourself

How It Works

The browser fires dragover continuously on the drop target while the dragged item is over it. The inline ondragover attribute must call event.preventDefault() to allow the subsequent drop event.

Dynamic Values with JavaScript

Assign the handler with element.ondragover or addEventListener:

dynamic-ondragover.html
<script>

  document.getElementById("dynamicDropTarget").ondragover = function (event) {

    event.preventDefault();

    event.dataTransfer.dropEffect = "move";

    document.getElementById("log").textContent =

      "Dynamic dragover — preventDefault enables drop.";

  };



  // Or preferred form:

  document.getElementById("dynamicDropTarget").addEventListener("dragover", handler);

</script>
Try It Yourself

How It Works

Register the listener once at page load. On every dragover tick while the pointer is over the target, your handler runs and must call preventDefault().

Example — With vs without preventDefault

Left zone skips preventDefault() in dragover (drop blocked). Right zone calls it (drop allowed):

dragover-prevent-compare.html
blockedZone.addEventListener("dragover", function () {

  // No preventDefault — browser blocks drop

});



allowedZone.addEventListener("dragover", function (event) {

  event.preventDefault();

  event.dataTransfer.dropEffect = "move";

});



allowedZone.addEventListener("drop", function (event) {

  event.preventDefault();

  status.textContent = "Drop succeeded.";

});
Try It Yourself

How It Works

The browser’s default dragover behavior rejects drops. Calling event.preventDefault() on every dragover tick tells the browser this target accepts drops, enabling the drop handler.

♿ Accessibility

  • Drag is pointer-heavy — Not all users can drag with a mouse. Provide keyboard or button alternatives for the same action.
  • Announce zone state — Use aria-live regions when dragover updates status text so screen reader users know the zone accepts drops.
  • Avoid alert() on dragover — Inline status text or visible UI updates are more accessible than modal alerts fired on every dragover tick.
  • Do not rely on dragover alone — Finalize important actions in accessible controls, not only after a drag gesture.
  • Visible focus — Ensure highlighted drop zones have sufficient color contrast and do not hide focus outlines on interactive elements.

🧠 How ondragover Works

1

User drags source

dragstart fires on draggable source.

ondragstart
2

Pointer enters target

dragenter fires once; add highlight on drop target.

ondragenter
3

Pointer hovers (repeat)

dragover fires continuously; call preventDefault every tick.

ondragover
=

Drop or leave

drop accepts payload if preventDefault ran; dragleave removes highlight.

Browser Support

The dragover event and ondragover handler are part of the HTML Drag and Drop API and supported in all modern browsers — Chrome, Firefox, Safari, and Edge. Touch drag behavior may differ; test on your target devices.

DOM Events · Fully supported

Universal ondragover support

All major browsers fire the underlying event and honor the ondragover handler attribute.

99% Browser support
Google Chrome Fully supported
Full support
Mozilla Firefox Fully supported
Full support
Apple Safari Fully supported
Full support
Microsoft Edge Fully supported
Full support
Internet Explorer IE 9+ supported
Full support
Opera Fully supported
Full support
ondragover attribute 99% supported

Bottom line: Universal support for dragover on drop targets. Always call preventDefault() in dragover, pair with dragenter/dragleave, and use a draggable source.

💡 Best Practices

✅ Do

  • Always preventDefault in dragover — Required on the drop target to allow dropping.
  • Use addEventListener on the target — Clearer than inline ondragover.
  • Set dropEffect during dragover — Match cursor feedback to copy, move, or link intent.
  • Pair dragenter and dragleave — Add highlight on enter, remove on leave for symmetric feedback.
  • Handle drop separately — Accept payload in drop, not in dragover.

❌ Don’t

  • Do not use alert() — Update visible status text instead of blocking modal dialogs.

Conclusion

The ondragover attribute runs JavaScript repeatedly while a dragged item hovers over a drop target and the dragover event fires on the receiver. Its most important job is calling event.preventDefault() so the browser permits a subsequent drop.

Prefer addEventListener("dragover", …), set event.dataTransfer.dropEffect for cursor feedback, pair with ondragenter/ondragleave for highlights, and offer keyboard alternatives for accessibility.

Key Takeaways

Knowledge Unlocked

Five truths every developer should know about ondragover

Bookmark these before wiring your next event handler.

5
Core concepts
🌐 02

Continuous hover

Fires repeatedly.

Behavior
🔄 03

preventDefault

Required for drop.

Use case
📝 04

addEventListener

Preferred.

Modern
05

dropEffect

Cursor feedback.

Compare

❓ Frequently Asked Questions

It runs JavaScript when the dragover event fires on a drop target—repeatedly while a dragged item’s pointer is over that element.
By default the browser blocks drops on most elements. Call event.preventDefault() in every dragover handler on the drop target; without it the drop event will not fire.
ondragenter fires once when the pointer crosses into the target boundary. ondragover fires continuously while hovering and is where you must call preventDefault() to allow drop.
dropEffect controls cursor feedback during dragover. Set it to copy, move, link, or none inside your dragover handler to match the intended drop action.
Prefer element.addEventListener("dragover", …). Inline ondragover works for simple demos.
ondragover runs repeatedly while hovering and must call preventDefault to enable dropping. ondrop fires once when the user releases the item and is where you accept the payload.

Enable drops with preventDefault

Practice inline ondragover, addEventListener, dropEffect, and the preventDefault comparison in the Try It editor.

Try ondragover demo →

About the author

Mari Selvan M P
Mari Selvan M P 🔗

Developer, cloud engineer, and technical writer

  • Experience 12 years building web and cloud systems
  • Focus Full Stack Development, AWS, and Developer Education

I write practical tutorials so students and working developers can learn by doing—from databases and APIs to deployment on AWS.

5 people found this page helpful