Перебор объекта JavaScript для привязки ключей - PullRequest
2 голосов
/ 26 сентября 2011

Учитывая следующий код:

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 оболочке.

РЕШЕНИЕ:

Я решил это с помощью этой модификации:

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 ]

2 голосов
/ 26 сентября 2011

Мне кажется, что это, вероятно, основная проблема "замыкания в цикле", с которой многие сталкиваются с JS.

Объяснение и решение легко найти через Google, вот, например, http://www.mennovanslooten.nl/blog/post/62

1 голос
/ 26 сентября 2011

Вот как бы я это сделал:

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

    if ( controls[ char ] ) {
        keysPressed.push( controls[ char ] );
    }
});
0 голосов
/ 26 сентября 2011

Вы не объявили переменную direction (используя var), поэтому она будет в глобальной области видимости.Это означает, что цикл for будет запущен, а затем direction будет установлен на right.

Все ключи связаны, но все вызовы

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

Также я рекомендую прочитать Яниpost (и соответствующую статью), как вы могли бы также затронуть эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...