Подтвердить что ты не робот

Как отключить повторное keydown в jQuery

Когда пользователь удерживает нажатой клавишу, я хочу, чтобы событие keydown() вызывалось только один раз, но его вызывали до тех пор, пока пользователь не перестанет нажимать клавишу.

Вот что я пытаюсь сделать:

   $(document).keydown(function(event){
     var keycode = (event.keyCode ? event.keyCode : event.which);
     if(keycode == '39'){
              $("#box").animate({"left": "+=30px"}, "fast");
     } 
   });  

Итак, когда пользователь нажимает клавишу со стрелкой вправо, я хочу, чтобы поле div # переместило 30 пикселей вправо. Он перемещается, но если пользователь удерживает нажатой клавишу, он улетает.

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

4b9b3361

Ответ 1

Следите за тем, какие клавиши опущены, и игнорируйте код клавиатуры до тех пор, пока клавиатура не очистит его.

var down = {};

$(document).keydown(function(event){
     var keycode = (event.keyCode ? event.keyCode : event.which);
     if(keycode == '39'){
          if (down['39'] == null) { // first press
              $("#box").animate({"left": "+=30px"}, "fast");
              down['39'] = true; // record that the key down
          }
     } 
   });

$(document).keyup(function(event) {
     var keycode = (event.keyCode ? event.keyCode : event.which);
     down[keycode] = null;
});

Ответ 2

сохранить флаг и повернуть его зеленым на keydown, я бы предложил keyup, хотя

$(document).keydown(function(event){
     $flag=false;
     var keycode = (event.keyCode ? event.keyCode : event.which);

      if(keycode == '39'){
           if(!$flag){
              $flag=true;
              $("#box").animate({"left": "+=30px"}, "fast");
      }
     } 
   });