迭代JavaScript对象以绑定键

wgmfuz8q  于 2023-01-16  发布在  Java
关注(0)|答案(3)|浏览(135)

考虑以下代码:

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怪癖。

dsekswqp

dsekswqp1#

在我看来,这可能是许多人在使用JS时遇到的基本“for循环中的闭包”问题。
解释和解决方案很容易通过谷歌找到,这里有一个例子:http://www.mennovanslooten.nl/blog/post/62

vnzz0bqm

vnzz0bqm2#

我会这么做:

$( document ).keypress( function ( e ) {
    var char = String.fromCharCode( e.keyCode );

    if ( controls[ char ] ) {
        keysPressed.push( controls[ char ] );
    }
});
hvvq6cgz

hvvq6cgz3#

你没有声明direction变量(使用var),所以它将在全局范围内,这意味着for循环将运行,然后direction将被设置为right
所有的键都是绑定的,但是所有的调用

keysPressed.push(direction);
// and that is:
keysPressed.push("right");

我还建议阅读Jani的帖子(和相关文章),因为你也可以进入这个问题。

相关问题