使用
轻松检测while (c != '\n' && c != EOF) c = fgetc(file);
关键事件
control
问题是,document.addEventListener('keyup', handler, false);
...
function handler(e) {
var key = e.which || e.keyCode;
if (key == 17) { // Control key
...
}
}
和control-c
等任何组合键也会触发事件,而事件处理程序似乎无法区分单个control-v
和{{ 1}}在control
。
我想要的是只允许一键按下并释放,而不是按键组合来触发事件。
答案 0 :(得分:2)
这个怎么样:
var controlConsidered = false;
function ctrlPressed() {
console.log("Control was pressed.");
}
function keydownhandler(e) {
var key = e.which || e.keyCode;
controlConsidered = (key == 17);
}
function keyuphandler(e) {
var key = e.which || e.keyCode;
if (key == 17 && controlConsidered) {
ctrlPressed();
}
}
document.addEventListener('keydown', keydownhandler, false);
document.addEventListener('keyup', keyuphandler, false);
答案 1 :(得分:0)
您实际上可以使用e.ctrlKey
和e.altKey
,根据是否按下这些键,该值将为true或false。
在您的活动中,它将类似于:
if (e.ctrlKey || e.altKey) {
return;
}
编辑
供参考,您可以查看https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/ctrlKey。
此属性实际上是一个布尔值,返回触发事件时是否按下了ctrl键。
然后,你可以看到,如果用户决定按下ctrl键而没有其他键,则此方法将不会返回并且e.ctrlKey将为false,因为当keyUp事件被触发时,用户已经释放钥匙。
答案 2 :(得分:0)
这并不是完全被问到的,但是对于好奇,下面的代码可以处理按下单个控制键和双击控制按键。它的工作原理如下:
ctrlPressed
,其中:threshold
值的超时(以毫秒为单位),并且,
var lastControlTime = 0,
newControlTime, timeout,
threshold = 200;
function ctrlPressed() {
newControlTime = new Date();
var bool = newControlTime - lastControlTime <= threshold;
if (!bool)
timeout = setTimeout(function() {
if (timeout) {
alert("Single control key pressed");
timeout = undefined;
}
}, threshold);
if (bool) {
alert("Double control key pressed");
clearTimeout(timeout);
timeout = undefined;
}
lastControlTime = newControlTime;
}
function keydownhandler(e) {
var key = e.which || e.keyCode;
controlConsidered = (key == 17);
}
function keyuphandler(e) {
var key = e.which || e.keyCode;
if (key == 17 && controlConsidered) {
ctrlPressed();
}
}
document.addEventListener('keydown', keydownhandler, false);
document.addEventListener('keyup', keyuphandler, false);