js实现按住ctrl实现多选
实现按住 Ctrl 键多选的逻辑
监听键盘事件和鼠标点击事件,通过判断 Ctrl 键是否按下来实现多选功能。以下是一个完整的实现示例:
document.addEventListener('keydown', function(e) {
if (e.key === 'Control') {
document.body.classList.add('ctrl-pressed');
}
});
document.addEventListener('keyup', function(e) {
if (e.key === 'Control') {
document.body.classList.remove('ctrl-pressed');
}
});
const items = document.querySelectorAll('.selectable-item');
items.forEach(item => {
item.addEventListener('click', function(e) {
const isCtrlPressed = document.body.classList.contains('ctrl-pressed');
if (isCtrlPressed) {
this.classList.toggle('selected');
} else {
items.forEach(i => i.classList.remove('selected'));
this.classList.add('selected');
}
});
});
HTML 结构示例
配合 JavaScript 代码的 HTML 结构:
<div class="selectable-item">Item 1</div>
<div class="selectable-item">Item 2</div>
<div class="selectable-item">Item 3</div>
<div class="selectable-item">Item 4</div>
CSS 样式示例
为选中状态添加视觉反馈:
.selectable-item {
padding: 10px;
margin: 5px;
border: 1px solid #ccc;
cursor: pointer;
}
.selectable-item.selected {
background-color: #007bff;
color: white;
}
使用事件对象的改进版本
可以直接利用事件对象的 ctrlKey 属性,无需单独监听 Ctrl 键:
const items = document.querySelectorAll('.selectable-item');
items.forEach(item => {
item.addEventListener('click', function(e) {
if (e.ctrlKey) {
this.classList.toggle('selected');
} else {
items.forEach(i => i.classList.remove('selected'));
this.classList.add('selected');
}
});
});
实现 Shift 键连续选择
扩展功能,增加 Shift 键连续选择的支持:
let lastSelected = null;
const items = document.querySelectorAll('.selectable-item');
items.forEach(item => {
item.addEventListener('click', function(e) {
if (e.ctrlKey) {
this.classList.toggle('selected');
lastSelected = this;
} else if (e.shiftKey && lastSelected) {
const currentIndex = Array.from(items).indexOf(this);
const lastIndex = Array.from(items).indexOf(lastSelected);
const start = Math.min(currentIndex, lastIndex);
const end = Math.max(currentIndex, lastIndex);
for (let i = start; i <= end; i++) {
items[i].classList.add('selected');
}
} else {
items.forEach(i => i.classList.remove('selected'));
this.classList.add('selected');
lastSelected = this;
}
});
});
注意事项
事件委托方式可以提高性能,特别是对于大量可选项的情况:

document.addEventListener('click', function(e) {
if (e.target.classList.contains('selectable-item')) {
const items = document.querySelectorAll('.selectable-item');
if (e.ctrlKey) {
e.target.classList.toggle('selected');
} else {
items.forEach(i => i.classList.remove('selected'));
e.target.classList.add('selected');
}
}
});
以上实现方式可以根据具体需求进行调整,如添加对 macOS 的 Command 键支持,或与其他键盘组合键配合使用。






