- From: Brenton Simpson <notifications@github.com>
- Date: Thu, 05 Oct 2023 19:20:25 -0700
- To: w3c/uievents <uievents@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <w3c/uievents/issues/84/1749895697@github.com>
Stumbled upon this trying to figure out how to implement dragging a file into a web page.
The problem is that the drag-and-drop API is very finicky. There is a firehose of events that fire during a drag, a mix of `dragenter`, `dragover`, and `dragleave`s. Even though you have to call `event.preventDefault()` inside a `dragover` to claim responsibility for a drag, the events are all dispatched from children. The naive implementation - setting a style inside `dragover` and removing it in `dragleave` - causes flickering, where the style is present in odd numbered frames and removed in even numbered frames, because the children are being entered/left even though the drag is still hovering over the drop target.
The current best practice is to count the number of `dragenter` and `dragleave` events, using the balance to determine whether or not the drop target is being hovered over. It's a hack to paper over an unfortunate API.
`fromElement` provides an opportunity to detect whether the `dragleave` event is actually escaping the drop target:
```typescript
onDragOver(event) {
// this e.pD() is important to register for the other events
event.preventDefault();
setInDrag(true);
},
onDragLeave(event) {
let fromAncestor = event.fromElement;
while (fromAncestor = fromAncestor.parentNode) {
if (fromAncestor === dropTarget) {
return;
}
}
setInDrag(false);
},
onDrop(event) {
event.preventDefault();
setInDrag(false);
const fileList = event.dataTransfer.files;
//…
},
```
Standardizing `fromElement` would improve the drag-and-drop API.
--
Reply to this email directly or view it on GitHub:
https://github.com/w3c/uievents/issues/84#issuecomment-1749895697
You are receiving this because you are subscribed to this thread.
Message ID: <w3c/uievents/issues/84/1749895697@github.com>
Received on Friday, 6 October 2023 02:20:31 UTC