Прослушиватель событий при нажатии клавиши внутри цикла запускается один раз, но не запускается снова, пока цикл не будет перезапущен. Почему?

0

Следующий jQuery находится внутри цикла for:

$(document).one('keydown',function(e) {
    if( e.which === 90 && leftPosition + 50 <= maxHeight) {
        var newLeftPosition = (leftPosition + 1) + 'px';
        $("#leftPaddle").css({top:newLeftPosition});         
    }
});

Для каждой итерации он должен срабатывать один раз, если нажать клавишу z. Он запускается в первый раз, но не запускается снова, если вы не перезапустите цикл после завершения цикла. У меня изначально было следующее, и он тоже выстрелил только один раз:

$(document).keydown(function(e){
  if(e.which === 90 && leftPosition + 50 <= maxHeight) {
        var newLeftPosition = (leftPosition + 1) + 'px';
        $("#leftPaddle").css({top:newLeftPosition});         
    }   
});   

Недостаток второго фрагмента, помимо того, что он тоже срабатывает только один раз, заключается в том, что он остановил цикл до тех пор, пока ключ больше не будет нажат.

Переменная leftPosition устанавливается внутри цикла for и должна обновлять каждую итерацию. Он объявляется и инициализируется следующим образом:

var leftPosition = $("#leftPaddle").position().top;

CSS для #leftPaddle выглядит следующим образом:

#leftPaddle {
  position:absolute;
  left:0;
  top:0;
  width:8px;
  height:48px;
  background-color:#BADA55;
  border:1px solid #000;
}

Скрипка, чтобы увидеть это в действии.

-Bonus прохладные очки. Если я создаю бесконечный цикл, jsFiddle не может загрузить и заморозить браузер. Это проблема для скрипки?

  • 0
    А бесконечный цикл не заморозит браузер? Ах браузеры в эти дни со скриптом убивают по таймаутам ...;)
  • 0
    Если я просто сделаю $ (document) .keydown (function () {console.log ("!");}); это работает нормально, даже когда я держу клавишу. Вам не нужно делать цикл for. Причина, по которой у вас, вероятно, возникла эта проблема, заключается в том, что прослушиватель событий был подключен, но событие не было запущено до тех пор, пока вы не отпустили и снова не нажали клавишу z.
Показать ещё 6 комментариев
Теги:

1 ответ

0
Лучший ответ

ShengSlogar получил это. Вместо того, чтобы обернуть слушателя в цикл for, я использовал setInterval, как показано ниже:

setInterval(function() {
    $(document).one('keydown',function(e) {
      if( e.which === 90 && leftPosition + 50 <= maxHeight) {
          var newLeftPosition = (leftPosition + 1) + 'px';
          $("#leftPaddle").css({top:newLeftPosition});         
      }
    });
}, 1);
  • 0
    Большой! Я рад, что смог помочь! (Я должен был сделать фрагмент кода вместо того, чтобы заставлять вас делать всю тяжелую работу, хотя ...)
  • 0
    Я не против работы, мне просто нужно направление. Если вы хотите опубликовать ответ, я могу принять / подтвердить его. Еще раз спасибо!
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню