The HTML ondragstart event
The HTML ondragstart attribute runs JavaScript when the user starts dragging a draggable element. It is an inline handler for the dragstart event; in modern code prefer addEventListener('dragstart', …).
Overview
The ondragstart event attribute runs JavaScript when a drag begins. In JavaScript the event itself is named dragstart — drop the on prefix when you call addEventListener.
It is part of the native HTML drag-and-drop API. The handler receives a DragEvent whose dataTransfer object carries the dragged data. One rule trips everyone up: you must call event.preventDefault() in the ondragover handler of a target, or it will not accept a drop.
You can wire this up with the inline ondragstart HTML attribute, but the modern, recommended approach is element.addEventListener('dragstart', handler) in JavaScript. That keeps behavior out of your markup, lets you attach several handlers to the same event, and makes them easy to remove. The inline attribute is fine for quick demos.
Syntax
<element ondragstart="handler()">…</element>
element.addEventListener('dragstart', handler);
Best practices
- Prefer
element.addEventListener('dragstart', handler)over the inlineondragstartattribute — it separates behavior from markup and allows multiple handlers. - Call
preventDefault()in ondragover so the element can act as a drop target. - Set and read the payload through
event.dataTransfer. - Provide a keyboard-accessible alternative — native drag-and-drop is hard to use without a mouse.
Frequently asked questions
What is the ondragstart event?
dragstart.Why is my drop not working?
event.preventDefault() in the ondragover handler, otherwise the element rejects the drop.How do I pass data between dragged and dropped elements?
event.dataTransfer.setData() when the drag starts and getData() when it drops.Should I use the ondragstart attribute or addEventListener?
addEventListener('dragstart', …) in JavaScript. The inline ondragstart attribute works but mixes behavior into the markup and allows only one handler per element.