← Chrome 148 reference

v148 · web api · shipped

Correctly set dropEffect for dragEnter, dragLeave and dragOver events

A spec-compliance fix: Chrome 148 now sets the correct dataTransfer.dropEffect value on dragenter, dragleave, and dragover events. dragenter and dragover get the value derived from effectAllowed; dragleave always gets "none". Pages that read dropEffect in these handlers can now rely on the specified values.

at a glance

What changedBehaviour fix — no new APIs. dataTransfer.dropEffect now reflects the correct spec-defined value on three drag events.
Shipped inChrome 148 (desktop + Android)
ChromeStatus6325617459068928 — Correctly set "dropEffect" for dragEnter, dragLeave and dragOver events
SpecHTML Living Standard — DataTransfer interface
Source: chromestatus, blink-dev ITS, and HTML spec, May 2026.

what changed and why

The HTML specification requires:

EventSpec-required dropEffectPrior Chrome behaviour
dragenter Derived from effectAllowed (e.g. "copy", "move") Often wrong or inconsistent
dragover Derived from effectAllowed Often wrong or inconsistent
dragleave Always "none" Not consistently "none"

Drag-and-drop flows that read dropEffect on entry or hover to update a visual drop-target indicator could get unreliable values. Chrome 148 aligns with the spec so that cross-browser behaviour is now consistent.

Source: blink-dev Intent to Ship — Correctly set "dropEffect", May 2026.

example

dropZone.addEventListener('dragenter', (e) => {
  // Chrome 148+: dropEffect is now set correctly based on effectAllowed
  console.log(e.dataTransfer.dropEffect); // e.g. "copy" or "move"
  dropZone.classList.add('active');
});

dropZone.addEventListener('dragleave', (e) => {
  // Chrome 148+: dropEffect is always "none" on dragleave (per spec)
  console.log(e.dataTransfer.dropEffect); // "none"
  dropZone.classList.remove('active');
});
Source: HTML Living Standard, May 2026.

see also