Difference between dragenter and dragover event in HTML5

HTML5 drag and drop API provides several events to handle dragging operations. Two commonly confused events are dragenter and dragover. While both are essential for drag and drop functionality, they serve different purposes.

dragenter Event

The dragenter event fires when a dragged element enters a valid drop target. This event is used to determine whether the drop target will accept the drop operation. To accept the drop, you must prevent the default behavior by calling preventDefault().

<!DOCTYPE html>
<html>
<body>

<div id="dragItem" draggable="true" style="width:100px; height:50px; background:lightblue; margin:10px;">
    Drag me
</div>

<div id="dropZone" style="width:200px; height:100px; border:2px dashed #ccc; margin:10px; padding:20px;">
    Drop zone
</div>

<script>
const dropZone = document.getElementById('dropZone');

dropZone.addEventListener('dragenter', function(e) {
    e.preventDefault();  // Accept the drop
    console.log('dragenter: Element entered drop zone');
    this.style.backgroundColor = 'lightgreen';
});

dropZone.addEventListener('dragleave', function(e) {
    console.log('dragleave: Element left drop zone');
    this.style.backgroundColor = '';
});
</script>

</body>
</html>

dragover Event

The dragover event fires continuously while a dragged element is over a valid drop target. This event is used to provide visual feedback to the user and determine the type of drag operation. Like dragenter, it must be canceled to allow dropping.

<!DOCTYPE html>
<html>
<body>

<div id="dragItem2" draggable="true" style="width:100px; height:50px; background:lightcoral; margin:10px;">
    Drag me
</div>

<div id="dropZone2" style="width:200px; height:100px; border:2px dashed #ccc; margin:10px; padding:20px;">
    Drop zone
</div>

<script>
const dropZone2 = document.getElementById('dropZone2');
let dragoverCount = 0;

dropZone2.addEventListener('dragover', function(e) {
    e.preventDefault();  // Allow drop
    dragoverCount++;
    console.log('dragover fired: ' + dragoverCount + ' times');
    
    // Change cursor based on drag effect
    e.dataTransfer.dropEffect = 'copy';
});

dropZone2.addEventListener('drop', function(e) {
    e.preventDefault();
    console.log('Drop completed after ' + dragoverCount + ' dragover events');
    this.style.backgroundColor = 'lightblue';
    dragoverCount = 0;
});
</script>

</body>
</html>

Key Differences

Aspect dragenter dragover
Frequency Fires once when entering Fires continuously while hovering
Purpose Determine if drop is acceptable Provide visual feedback
Performance Better (fires once) Can impact performance (fires repeatedly)
Use Case Initial validation, styling Cursor changes, continuous feedback

Complete Example

<!DOCTYPE html>
<html>
<body>

<div id="source" draggable="true" style="width:80px; height:40px; background:gold; margin:10px; text-align:center; line-height:40px;">
    Item
</div>

<div id="target" style="width:200px; height:100px; border:2px solid #333; margin:10px; text-align:center; line-height:100px;">
    Drop Here
</div>

<p id="status">Status: Ready</p>

<script>
const source = document.getElementById('source');
const target = document.getElementById('target');
const status = document.getElementById('status');

source.addEventListener('dragstart', function(e) {
    e.dataTransfer.setData('text/plain', 'dragged-item');
    status.textContent = 'Status: Dragging started';
});

target.addEventListener('dragenter', function(e) {
    e.preventDefault();
    status.textContent = 'Status: Entered drop zone';
    this.style.borderColor = 'green';
});

target.addEventListener('dragover', function(e) {
    e.preventDefault();
    e.dataTransfer.dropEffect = 'move';
});

target.addEventListener('dragleave', function(e) {
    status.textContent = 'Status: Left drop zone';
    this.style.borderColor = '#333';
});

target.addEventListener('drop', function(e) {
    e.preventDefault();
    status.textContent = 'Status: Drop completed!';
    this.style.backgroundColor = 'lightgreen';
    this.textContent = 'Dropped!';
});
</script>

</body>
</html>

Conclusion

Use dragenter for one-time actions like validation and initial styling. Use dragover for continuous feedback like cursor changes. Both events require preventDefault() to enable dropping.

Updated on: 2026-03-15T23:18:59+05:30

508 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements