我想将所有当前按下的密钥代码存储在单个变量中,方法是在按下该键时以及释放该密钥时使用按位操作。
我不确定如何正确使用按位操作,但我知道这对于那些做某事的人来说非常简单。
完成后,通过询问“变量中的密钥是否为代码?”来查看当前哪个密钥应该很简单。
提前致谢!
答案 0 :(得分:5)
这在单个变量中是不可能的,javascript中没有数据类型可以存储保持位掩码所需的256位(支持按位操作),你需要使用数组。
此外,除非你有一个文本到语音软件,你已经宏,为你神奇地执行js函数,问你的计算机:“这个键的代码在变量中吗?”不会蹲下来。
你要这样做的方法是初始化一个包含256个索引的数组,然后当按下一个键时,你会找到相关的索引并将其设置为true
,当一个键被释放时,你设置它到false
这是唯一的方法。实际上没有任何其他。
答案 1 :(得分:3)
我认为你想要的方式不可能。 Have a look at the available keycodes。在那里,你看,例如, backspace
为8
,tab
为9
。
在二进制文件中,这将是1000
和1001
。使用二元运算符,您可以使用OR |
来“组合”这些值,这将导致1001
。
您可以检查是否通过AND &
设置了值,例如1001
&如果按下退格键,1000
可以查看。不幸的是,如果仅按Tab键(因为其值为true
),这也将评估为1001
。
那就是说,你只能使用这种按位比较技术,如果要测试的不同值是2 仅的幂,即1,2,4,8,16,32等等on,因为它代表二进制1
,10
,100
,1000
,...
例如,如果我们可以有一个status
变量,可能的状态为OPEN = 2
,LIGHT ON = 4
和ALARM ON = 8
。
假设它是OPEN
和LIGHT ON
,即
0010
| 0100
-------
0110
在这里,我们可以轻松检查ALARM
是否已开启,使用AND:0110 & 1000 = 0
。但是,如果我们使用ALARM ON
对6 = 0110
进行编码,则无法检查此内容。
您可以做的是,将键码映射到2值的某个幂并在那里应用二进制运算。 The Wikipedia article about bitmasks might be worth reading.
我希望我的解释有点清楚。
答案 2 :(得分:0)
对于前31位,javascript位操作通常是可靠的,并且事情从那里开始走下坡路。因此,您可以使用31个不同的键给出一个值作为标志。例如,如果你想跟踪四个箭头和A和B,你会做这样的事情。
var KEYS = {
LEFT: 1 << 0,
UP: 1 << 1,
RIGHT: 1 << 2,
DOWN: 1 << 3,
A: 1 << 4,
B: 1 << 5
}
var flags = 0;
myElement.addEventListener ('keydown', function (e) {
switch (e.keyCode) {
case 37: // left
flags = flags | KEYS.LEFT;
break;
case 38: // up
flags = flags | KEYS.UP;
break;
... etc ...
}
}
} , false);
function checkKeys () {
if ( (flags & KEYS.LEFT) === KEYS.LEFT)
alert('LEFT key pressed');
}
if ( (flags & KEYS.UP) === KEYS.UP )
alert('UP key pressed');
}
... etc ...
}
答案 3 :(得分:0)
我不确定在JavaScript中是否存在像ByteArray这样的东西,但如果是这样的话,你可以做得很像这个人在ActionScript3中的逻辑。虽然我是bitflags&amp;的忠实粉丝。按位操作,我没有得到他正在做的位移,他的大部分代码都在我脑海中。我只知道它适用于我所参与的as3项目。
此外,如果您想了解更多关于bitflags&amp; amp;按位操作(除了位移)请查看本文 - http://jwopitz.wordpress.com/2012/02/13/using-bitflags-and-bitwise-math/
//init the bytearray
_states = new ByteArray();
_states.writeUnsignedInt( 0 );
_states.writeUnsignedInt( 0 );
_states.writeUnsignedInt( 0 );
_states.writeUnsignedInt( 0 );
_states.writeUnsignedInt( 0 );
_states.writeUnsignedInt( 0 );
_states.writeUnsignedInt( 0 );
_states.writeUnsignedInt( 0 );
//on a keydown listener (note the bitwise OR for adding
_states[ event.keyCode >>> 3 ] |= 1 << ( event.keyCode & 7 );
//on a keyup listener (note the bitwise AND plus bitwise NOT
states[ ev.keyCode >>> 3 ] &= ~(1 << (ev.keyCode & 7));
//check for keydown
return ( states[ keyCode >>> 3 ] & (1 << (keyCode & 7)) ) != 0;
//check for keyup
return ( states[ keyCode >>> 3 ] & (1 << (keyCode & 7)) ) == 0;