在Vim
中,您可以按gg
转到文档的开头,或按dd
go 删除当前行。如何在网页中实现类似的行为?我的意思是,在网页环境中,如何捕获两个连续的按键事件来触发事件?
谢谢。
在Vim
中,您可以按gg
转到文档的开头,或按dd
go 删除当前行。如何在网页中实现类似的行为?我的意思是,在网页环境中,如何捕获两个连续的按键事件来触发事件?
谢谢。
您需要监控所有按键事件,当您找到可能是多次按键组合中的第一个按键时,启动计时器。如果在计时器处于活动状态时按下组合中的第二个键,请执行一些操作。
例如(伪代码)
//for gg
var inCombo = false;
function KeyPress(Key) {
if(Key=='g') {
if(!inCombo) {
inCombo = true;
setTimeout('inCombo=false;', 100);
} else {
//Do the action here
}
}
}
,只有在 100 毫秒内按下两次//Do the action here
才会触发g
你不能。只需注册正常的按键事件并将按键推送到数组即可。
现在您可以调用一个检查命令的函数:
// More or less pseudo code
function deleteLine(){};
function copyLine(){};
var commands = {'dd': deleteLine, 'yy': copyLine};
function onKeyPress(e) {
keyList.push(e.key);
// in this example keyList = ['d', 'y', 'i', 'd', 'd']
var result = handleEvent();
}
function handleEvent(keyList) {
// more pseudo code follows
var cmds = commands.keyValue.sortByLengthDescending();
for(var c in cmds) {
// match the keys
var ckey = c.split('');
for(var i = keyList.length; i >= 0; i--) {
if (keyList[i] !== ckey.shift()) {
break;
}
if (ckey.length === 0) {
return commands[c]();
}
}
}
}
这很简单,干净(取决于您编写它的方式)和可扩展性,添加更多命令非常容易,当然您可以更改它以便可以将参数传递给命令函数等。