v148 · Web APIs · Drag & Drop

Multi-touch Drag Demo

Tests pointer event suppression with multi-touch scenarios. Drag a tile and observe pointercancel firing for that pointer ID while other active pointers continue receiving events — the Chrome 148 spec fix made visible.

Checking pointer event + drag event support…

tile grid

Drag any tile. Watch the event log — pointercancel fires as soon as the drag starts, suppressing further pointermove events for that pointer ID. The tile turns amber when its pointer stream is suppressed.

pointer state

Active pointer IDs

No active pointers.
pointerdown count0
pointermove count0
pointercancel count0
dragstart count0
suppressed pointers0

State diagram

Idle
waiting
Pointer
pointerdown
Drag
dragstart
Done
drop/dragend
When transitioning Pointer → Drag, Chrome 148 fires pointercancel on the drag source. This suppresses further pointer events for that pointer ID — the drag API takes exclusive control.

event log

readyStart dragging a tile to see events.

the event sequence

// Chrome 148+ event sequence for a drag gesture:
// 1. pointerdown    → drag source receives pointer, pointer ID assigned
// 2. pointermove    → one or more moves before drag threshold is met
// 3. pointercancel  → ← NEW in Chrome 148: drag took over the pointer stream
//                      This pointer ID is now SUPPRESSED — no more pointer events
// 4. dragstart      → HTML Drag and Drop API takes exclusive control
// 5. drag           → fires repeatedly while dragging
// 6. dragend        → drag complete; pointer ID released
//
// Multi-touch scenario:
// - Pointer A: pointerdown → pointermove → [drag starts] → pointercancel (suppressed)
// - Pointer B: pointerdown → pointermove → pointermove → ... → pointerup (still active!)
//   Pointer B is unaffected by Pointer A's suppression

references

implementation reference

Need the exact API surface, compatibility boundaries, errors, lifecycle, and source links? Read the matching gendn reference ↗