Detect ctrl/cmd/alt/shift + Click in Vanilla JavaScript, React and Vue.js
Detecting control-click, command-click, meta-click, alt-click and shift-click in JavaScript without listening to keydown events is straightforward.
The naive approach is to bind aggressively to key events (keydown, keypress, keyup) and to maintain state of what is currently pressed using JavaScript.
That’s not necessary since MouseEvents have some keypress specific properties: metaKey, ctrlKey, altKey and shiftKey
(see the corresponding pages on MDN,
metaKey,
ctrlKey,
altKey and
shiftKey).
Table of Contents
All of metaKey, ctrlKey, altKey and shiftKey are booleans, which are true when the corresponding key is pressed.
A vanilla JavaScript click listener with command, control, alt and shift detection
The pseudocode for ctrl, command/windows (meta), alt and shift click detection is the following:
element.addEventListener('click', function (e) {
console.log(e.shiftKey); // shift
console.log(e.ctrlKey); // ctrl
console.log(e.altKey); // alt
console.log(e.metaKey); // command/windows (meta) key
});
Detect alt + click
Swap out
documentfor the DOM element of your choice
document.addEventListener('click', function (e) {
if (e.altKey) {
console.log('With alt, do something...');
return;
}
});
Detect ctrl + click
Swap out
documentfor the DOM element of your choice
document.addEventListener('click', function (e) {
if (e.ctrlKey) {
console.log('With ctrl, do something...');
return;
}
});
Detect shift + click
Swap out
documentfor the DOM element of your choice
document.addEventListener('click', function (e) {
if (e.shiftKey) {
console.log('With shift, do something...');
return;
}
});
Detect ctrl or command + click
Swap out
documentfor the DOM element of your choice
document.addEventListener('click', function (e) {
if (e.ctrlKey || e.metaKey) {
console.log('With ctrl or cmd or windows, do something...');
return;
}
});
React: control + click or command + click
const CmdControlClick = ({onCmdControlClick, onClick}) => (
<button
type="button"
onClick={e => {
if (e.ctrlKey || e.metaKey) return onCmdControlClick(e);
onClick(e);
}}
>
Click me
</button>
);
Repository at github.com/HugoDF/command-control-click-react.
Vue.js: event modifiers for control/command, shift, alt + click
A ModifierClick component in Vue.js uses @click modifiers to detect regular clicks with @click.exact, alt-click with @click.alt, shift-click with @click.shift, command/control-click with @click.ctrl and @click.meta respectively.
The following works as a Single File Component.
<template>
<button
type="button"
@click.exact="$emit('click')"
@click.meta="$emit('cmdCtrl')"
@click.ctrl="$emit('cmdCtrl')"
@click.shift="$emit('shift')"
@click.alt="$emit('alt')"
>
Click with modifier keys
</button>
</template>
@click is shorthand for v-on:click so we could write the Vue.js click modifiers as v-on:click.meta, v-on:click.ctrl, v-on:click.shift, v-on:click.alt and v-on:click.exact.
Vue.component('inline-modifier-click', {
template: `<button
type="button"
v-on:click.meta="$emit('cmdCtrl')"
v-on:click.ctrl="$emit('cmdCtrl')"
v-on:click.shift="$emit('shift')"
v-on:click.alt="$emit('alt')"
v-on:click.exact="$emit('click')"
>
Click with modifier keys (inline)
</button>`
})
Repository at github.com/HugoDF/cmd-ctrl-click-vue.
Interested in Alpine.js?
Power up your debugging with the Alpine.js Devtools Extension for Chrome and Firefox. Trusted by over 15,000 developers (rated 4.5 ⭐️).
orJoin 1000s of developers learning about Enterprise-grade Node.js & JavaScript