3 回答
TA贡献1946条经验 获得超3个赞
在处理事件时添加事件处理程序通常是解决问题的错误方法。想象一下您将如何累积添加处理程序……在您的情况下,最终将有许多绑定到同一个点击处理程序。
这是更好地绑定处理程序,你需要立即,然后用保持对究竟需要工作状态,同时处理的事件发生。
在这些键处理程序 ( keydown, keyup) 中,跟踪是否按下了 Shift/Control 键。
此外,不推荐使用e.keyas e.keyCode。
这是如何工作的:
let keys = {
"Shift": false,
"Control": false
};
function keyToggle(e) {
if (!(e.key in keys)) return; // not ctrl or shift
let isKeyDown = e.type === "keydown";
if (isKeyDown === keys[e.key]) return; // key position did not change
keys[e.key] = isKeyDown;
console.log(e.key + (isKeyDown ? " pressed" : " released"));
}
document.addEventListener("keydown", keyToggle, false);
document.addEventListener("keyup", keyToggle, false);
document.addEventListener('click', function (e) {
if (keys["Control"]) console.log(event.target.className);
}, false);
<main class="main">Main</main>
<aside class="aside">Aside</aside>
TA贡献1111条经验 获得超0个赞
你addEventListener也可以removeEventListener。
为此,您需要对事件处理程序的引用,因此您不能使用匿名函数,而是使用命名函数或存储在变量中的函数。
编辑 这是使用 CTRL+单击的示例:
// CTRL + CLICK implementation
let hasCtrl = false;
// Store the handler in a constant or variable
const handleClick = function(event) {
console.log(event.target.className);
}
// Use named function
function handleKeyDown(e) {
if (e.keyCode === 16) {
console.log('Yap! Shift works...');
}
}
const setCtrlInactive = (e) => {
if (!hasCtrl && e.keyCode === 17) {
console.log('Nope! Ctrl does not work...');
document.removeEventListener('click', handleClick);
hasCtrl = true;
}
}
const setCtrlActive = (e) => {
if (hasCtrl && e.keyCode === 17) {
console.log('Yap! Ctrl works...');
document.addEventListener('click', handleClick);
hasCtrl = false;
}
}
document.addEventListener("keyup", setCtrlInactive);
document.addEventListener("keydown", setCtrlActive);
document.addEventListener("keydown", handleKeyDown);
<main class="main">Main</main>
<aside class="aside">Aside</aside>
TA贡献1789条经验 获得超10个赞
那是因为您调用addEventListener('click')了 keydown 事件处理程序。
let ctrl = false;
window.addEventListener("keydown", function(e) {
if (e.keyCode === 16) {
console.log('Yap! Shift works...');
}
if (e.keyCode === 17 && ctrl === false) {
console.log('Yap! Ctrl works...');
ctrl = true;
}
});
window.addEventListener("keyup", function(e) {
if (e.keyCode === 17) {
ctrl = false;
}
});
document.addEventListener('click', function(event) {
if (ctrl) {
console.log(event.target.className);
}
}, false);
相反,您应该使用 keyup 事件和标志变量。
添加回答
举报