检测Javascript中的按键序列。
我有上面的脚本,或下面的脚本检测Javascript中的按键序列。,javascript,dom,javascript-events,Javascript,Dom,Javascript Events,我有上面的脚本,或下面的脚本 <script type="text/javascript"> function check(e){ var text = e.keyCode ? e.keyCode : e.charCode; switch(text){ case 81: text = 'መ'; break; case 87:
<script type="text/javascript">
function check(e){
var text = e.keyCode ? e.keyCode : e.charCode;
switch(text){
case 81:
text = 'መ';
break;
case 87:
text = 'ሙ';
break;
case 69:
text = 'ሚ';
break;
case 82:
text = 'ማ';
break;
case 84:
text = 'ሜ';
break;
case 89:
text = 'ም';
break;
case 85:
text = 'ሞ';
break;
}
if(text == 8){
var str = document.getElementById("out").innerHTML;
var foo = str.substring(0, str.length -1);
document.getElementById("out").innerHTML = foo;
}else {
document.getElementById("out").innerHTML += text;
}
}
</script>
<input type='text' onkeyup='check(event);' id='in' />
<div id='out' ></div>
甚至对于应输出z
我把上面的论点放在里面,但它不起作用。你试过这个吗?:
if(text == 77 && text == 79){
text 'x';
}
听起来你想捕捉“异常”的按键组合。为此,我认为您需要捕获并记录
keyup
和keydown
你想要这样的东西,但不一定是这样
var keysdown = {};
var lastkey = 0;
element.onkeyup = function(evt) {
var e = evt || window.event;
keysdown[e.keyCode ? e.keyCode : e.charCode] = true;
}
element.onkeyup = function(evt) {
var e = evt || window.event;
var code = e.keyCode ? e.keyCode : e.charCode;
keysdown[code] = false;
switch (code) {
// for cases wherein you need to detect keyA + keyB
case 77:
if (keysdown[79]) {
// x
} else {
// m
}
break;
// for cases wherein you need to detect sequence A, B
case B:
if (lastkey == A) {
// do A,B
} else {
// do B
}
break;
}
lastkey = code;
}
在本例中,有两个键的组合,如ac和cd,但可以有3个或更多组合,如agk
<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
<title>Example</title>
<style type="text/css">
td{width:20px;height:20px;text-align: center;vertical-align: middle;}
</style>
<script type="text/javascript" src="jquery-1.9.0.js"></script>
</head>
<body>
<input type="text" />
<script type="text/javascript">
//IE 8 and below doesn't have addEventLisener but all other majon browser have it
if(Element.prototype.addEventListener===undefined){
Element.prototype.addEventListener=function(eventName,callback){
var me=this;
this.attachEvent("on"+eventName, function(){
callback.call(me,window.event);
});
}
}
var myApp={
multiChar:[
[65,67],//ac
[67,68] //cd
],
prefChar:[0,0], //Index of mutichar match
replacers:["مرحبا","وداعا"], //replace multichar matches (ac with مرحبا)
checkCode:function(e){
var i=0,inp;
//IE probably doesn't have shiftkey or implements it differently
if(e.shiftKey){
//check stuff with shift
console.log("with shift",e.keyCode);
//If a match found then reset prefChar
prefChar=[0,0];
return;
}
for(i=0;i<myApp.multiChar.length;i++){
if(e.keyCode!==myApp.multiChar[i][myApp.prefChar[i]]){
myApp.prefChar[i]=(e.keyCode===myApp.multiChar[i][0])?1:0
continue
}
myApp.prefChar[i]++;
if(myApp.prefChar[i]===myApp.multiChar[i].length){
// found a multichar match
console.log(myApp.replacers[i]);
inp=document.body.getElementsByTagName("input")[0];
inp.value=inp.value.substr(
0,inp.value.length-myApp.multiChar[i].length)+
myApp.replacers[i];
myApp.prefChar[i]=0;
return;
}
}
}
}
document.body.getElementsByTagName("input")[0]
.addEventListener("keyup",myApp.checkCode);
</script>
</body>
</html>
例子
td{宽度:20px;高度:20px;文本对齐:中心;垂直对齐:中间;}
//IE8及以下版本没有addEventLisener,但所有其他majon浏览器都有
if(Element.prototype.addEventListener==未定义){
Element.prototype.addEventListener=函数(eventName,回调){
var me=这个;
this.attachEvent(“on”+eventName,function(){
callback.call(me、window.event);
});
}
}
var myApp={
多卡:[
[65,67],//ac
[67,68]//cd
],
prefChar:[0,0],//多字符匹配的索引
替换:替换多字符匹配(ac与多字符匹配)
检查代码:功能(e){
var i=0,inp;
//IE可能没有shiftkey或以不同的方式实现它
如果(如换档键){
//当班检查东西
console.log(“带shift”,例如keyCode);
//如果找到匹配项,则重置prefChar
prefChar=[0,0];
返回;
}
对于(i=0;i)尝试检测一系列按键(m
按下并释放,然后o
按下=>x
)将不同于同时检测按键组合(shift
+p
)。这两个问题是非常不同的。后者似乎已经如@JDeveloper所指出的那样得到了回答;您应该分别问前者(可能也已经得到了回答).@kranzdot我会把一把小提琴放在一起……给我一分钟。@kranzdot快速提问——你需要能够检测序列和组合吗?或者,我最初的理解正确吗,77和79一起产生“x”?那将是非常棒的。是的,你是对的。但是,如果同时按下79,就不会77.别担心,我出去了一段时间。代码根本不起作用。我点击了键盘上的所有字母,但什么也没有显示。我没有同时按下两个键。只是一个接一个。因此,有一些时间问题。目前没有替换任何东西。只需控制台。记录检测。进行了更改对于aaac,ac部分也将被检测到。新的答案将替换它。使用regexp而不是此想法可能更容易谢谢你,但代码似乎非常复杂,你能告诉我一个帮助我记录按键的教程吗?它主要依赖于数组,multiChar包含数组数组,所以multiChar[0]包含2个值(a和c的字符代码或[65,67])。prefchar包含multiChar中子数组的索引,因此如果用户键入a,则prefchar为[1,0],因为charCode[0][0]中有匹配的键代码65。如果我下一步键入c,则它将匹配charCode[0][1](为67)。使用多维数组有点复杂,当您必须返回代码并进行更改时,总是很难在以后维护或更改,但它非常适合此特定问题。以下是javascript的良好参考:
<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
<title>Example</title>
<style type="text/css">
td{width:20px;height:20px;text-align: center;vertical-align: middle;}
</style>
<script type="text/javascript" src="jquery-1.9.0.js"></script>
</head>
<body>
<input type="text" />
<script type="text/javascript">
//IE 8 and below doesn't have addEventLisener but all other majon browser have it
if(Element.prototype.addEventListener===undefined){
Element.prototype.addEventListener=function(eventName,callback){
var me=this;
this.attachEvent("on"+eventName, function(){
callback.call(me,window.event);
});
}
}
var myApp={
multiChar:[
[65,67],//ac
[67,68] //cd
],
prefChar:[0,0], //Index of mutichar match
replacers:["مرحبا","وداعا"], //replace multichar matches (ac with مرحبا)
checkCode:function(e){
var i=0,inp;
//IE probably doesn't have shiftkey or implements it differently
if(e.shiftKey){
//check stuff with shift
console.log("with shift",e.keyCode);
//If a match found then reset prefChar
prefChar=[0,0];
return;
}
for(i=0;i<myApp.multiChar.length;i++){
if(e.keyCode!==myApp.multiChar[i][myApp.prefChar[i]]){
myApp.prefChar[i]=(e.keyCode===myApp.multiChar[i][0])?1:0
continue
}
myApp.prefChar[i]++;
if(myApp.prefChar[i]===myApp.multiChar[i].length){
// found a multichar match
console.log(myApp.replacers[i]);
inp=document.body.getElementsByTagName("input")[0];
inp.value=inp.value.substr(
0,inp.value.length-myApp.multiChar[i].length)+
myApp.replacers[i];
myApp.prefChar[i]=0;
return;
}
}
}
}
document.body.getElementsByTagName("input")[0]
.addEventListener("keyup",myApp.checkCode);
</script>
</body>
</html>