👀 Live Preview
Drag the box over the drop zone. dragover calls preventDefault() so drop works:
Waiting for dragover or drop…

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.
Inline JS.
On drop target.
Required for drop.
Cursor feedback.
Preferred way.
enter/leave/drop.
ondragover AttributeThe 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.
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.
Set ondragover on a drop target or assign element.ondragover:
<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>dragover fires on the drop target, not on the draggable source.draggable="true" source with handlers on the receiver.event.preventDefault() in every dragover handler to allow drop.event.dataTransfer.dropEffect to copy, move, link, or none.element.ondragover = function(event) { … }.element.addEventListener("dragover", handler).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.zone.ondragover = (e) => { e.preventDefault(); … } assigns the handler.event.dataTransfer.dropEffect inside the handler for cursor feedback.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);
};| Event | When it fires | Handler |
|---|---|---|
dragenter | Pointer enters target boundary | ondragenter |
dragover | Repeatedly while over target | ondragover |
dragleave | Pointer leaves target boundary | ondragleave |
drop | Item released on valid target | ondrop |
preventDefault | Required in dragover to allow drop | Call on every dragover tick |
dropEffect | Set during dragover | copy, move, link, none |
| Without preventDefault | Browser blocks drop | drop event will not fire |
| Target | Supported? | Notes |
|---|---|---|
<div>, <section> | Yes | Common drop zones; call preventDefault in dragover |
<ul>, <li> | Yes | Sortable lists; dragover on each valid receiver |
<td>, <th> | Yes | Table cell drop targets |
<article>, <main> | Yes | Large layout drop areas |
| Draggable source | Separate | Set draggable="true" on source; use ondragstart there |
ondragover vs ondragenter vs ondragleave vs ondrop| Handler | When it fires | Element | Typical use |
|---|---|---|---|
ondragenter | Boundary entered (once) | Drop target | Highlight zone, show “drop here” status |
ondragover | Repeatedly while hovering | Drop target | preventDefault() to allow drop; set dropEffect |
ondragleave | Boundary left | Drop target | Remove highlight; pair with dragenter |
ondrop | Once when released on valid target | Drop target | Accept payload, move DOM node, update data |
Inline ondragover with preventDefault and drop handler, dynamic element.ondragover assignment, and a side-by-side comparison of dragover with vs without preventDefault.
Drag the box over the drop zone. dragover calls preventDefault() so drop works:
Waiting for dragover or drop…
Call preventDefault() in ondragover and handle ondrop on the same target:
<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>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.
Assign the handler with element.ondragover or addEventListener:
<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>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().
Left zone skips preventDefault() in dragover (drop blocked). Right zone calls it (drop allowed):
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.";
});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.
aria-live regions when dragover updates status text so screen reader users know the zone accepts drops.dragstart fires on draggable source.
dragenter fires once; add highlight on drop target.
dragover fires continuously; call preventDefault every tick.
drop accepts payload if preventDefault ran; dragleave removes highlight.
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.
ondragover supportAll major browsers fire the underlying event and honor the ondragover handler attribute.
Bottom line: Universal support for dragover on drop targets. Always call preventDefault() in dragover, pair with dragenter/dragleave, and use a draggable source.
ondragover.drop, not in dragover.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.
ondragoverBookmark these before wiring your next event handler.
dragover on receiver.
EventFires repeatedly.
BehaviorRequired for drop.
Use casePreferred.
ModernCursor feedback.
Comparedragover event fires on a drop target—repeatedly while a dragged item’s pointer is over that element.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.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.Practice inline ondragover, addEventListener, dropEffect, and the preventDefault comparison in the Try It editor.
5 people found this page helpful