考虑以下代码:
controls = {
'w': 'up',
's': 'down',
'a': 'left',
'd': 'right'
};
keysPressed = [];
for (control in controls) {
direction = controls[control];
$(document).bind('keydown', control, function() {
keysPressed.push(direction);
});
}
只有right
方向被绑定,并且它绑定到所有四个键,这显然不是有意的,但是我错过了JavaScript的什么,它阻止了所有属性被适当地绑定?
- 编辑:**
为了澄清,我使用jQuery.hotkeys来处理键名。你可以假设所有的变量都已经声明了。而且,代码在一个安全的function
Package 器中。
- 解决方案:**
我用这个修改解决了它:
controls = {
'w': 'up',
's': 'down',
'a': 'left',
'd': 'right'
};
keysPressed = [];
addToKeyPressArray = function(value) {
return function() {
keysPressed.push(value);
};
};
removeFromKeyPressArray = function(value) {
return function() {
keysPressed = keysPressed.filter(value);
};
};
for (control in controls) {
direction = controls[control];
$(document).bind('keydown', control, addToKeyPressArray(direction));
$(document).bind('keyup', control, removeFromKeyPressArray(direction));
}
这是一个奇怪的JavaScript怪癖。
3条答案
按热度按时间dsekswqp1#
在我看来,这可能是许多人在使用JS时遇到的基本“for循环中的闭包”问题。
解释和解决方案很容易通过谷歌找到,这里有一个例子:http://www.mennovanslooten.nl/blog/post/62
vnzz0bqm2#
我会这么做:
hvvq6cgz3#
你没有声明
direction
变量(使用var
),所以它将在全局范围内,这意味着for循环将运行,然后direction
将被设置为right
。所有的键都是绑定的,但是所有的调用
我还建议阅读Jani的帖子(和相关文章),因为你也可以进入这个问题。