v146 · Web APIs · Modifier Key Effects
Modifier Key Effects
Hold Ctrl while dragging to request copy, or Alt for link. The dragover handler can read which keys are held and set dropEffect accordingly. In Chrome 146, the drop handler receives the same effect — enabling correct copy vs move vs link behaviour.
Modifier key conventions vary by platform. On macOS, Option requests copy; on Windows/Linux, Ctrl requests copy, Alt requests link. This demo uses the Ctrl/Alt convention. The
dragover event's ctrlKey, altKey, and shiftKey let you detect which modifier is held.
modifier key → dropEffect mapping
| Held during drag | dropEffect set | Meaning |
|---|---|---|
| (none) | 'move' | Move item to drop target, remove from source |
| Ctrl | 'copy' | Copy item — source keeps original |
| Alt | 'link' | Create a link/reference to the source |
try it
Source
Document.pdf
effectAllowed: all
—
drop here (hold Ctrl or Alt)
Drag the item above while holding Ctrl or Alt…
code
draggable.addEventListener('dragstart', event => {
event.dataTransfer.effectAllowed = 'all'; // allow any operation
event.dataTransfer.setData('text/plain', 'payload');
});
dropTarget.addEventListener('dragover', event => {
event.preventDefault();
// Map modifier keys to drop operations
if (event.ctrlKey) {
event.dataTransfer.dropEffect = 'copy';
} else if (event.altKey) {
event.dataTransfer.dropEffect = 'link';
} else {
event.dataTransfer.dropEffect = 'move';
}
});
dropTarget.addEventListener('drop', event => {
event.preventDefault();
// Chrome 146: dropEffect matches what dragover set
const effect = event.dataTransfer.dropEffect; // 'copy' | 'move' | 'link'
switch (effect) {
case 'copy': copyItem(); break;
case 'move': moveItem(); break; // also remove from source
case 'link': linkItem(); break;
}
});