2012-02-06 2 views
0
$("html").keydown(function(event){ 

     if(event.which == "37") 
      $("#hero").animate({"left" : "-=30px"}); 

     if(event.which == "39") 
      $("#hero").animate({"left" : "+=30px"}); 

     if(event.which == "38") 
      $("#hero").animate({"top" : "-=30px"}); 

     if(event.which == "40") 
      $("#hero").animate({"top" : "+=30px"}); 
}); 

Кажется, что очередь всех нажатых клавиш , и мне нужно, чтобы эта очередь была пустой при изменении направления. Потому что, если я удерживаю левую клавишу нажатой в течение нескольких секунд, а затем нажимаю вправо, «#hero» будет уходить влево в течение длительного времени, а затем идти вправо.(JQuery) Перемещение элемента при нажатии клавиш?

ответ

2

Вы должны остановить текущую анимацию, чтобы избежать этого. Попробуй это.

$("html").keydown(function(event){ 

     if(event.which == "37") 
      $("#hero").stop(true).animate({"left" : "-=30px"}); 

     if(event.which == "39") 
      $("#hero").stop(true).animate({"left" : "+=30px"}); 

     if(event.which == "38") 
      $("#hero").stop(true).animate({"top" : "-=30px"}); 

     if(event.which == "40") 
      $("#hero").stop(true).animate({"top" : "+=30px"}); 
}); 

.stop([clearQueue] [, jumpToEnd]) ссылка: http://api.jquery.com/stop/

clearQueue - Логическое значение, указывающее, следует ли удалить анимацию из очереди , а также. По умолчанию false. jumpToEndA - Boolean, указывающий, следует ли выполнить текущую анимацию сразу. По умолчанию false.

+0

Это работает, но что, если я хочу идти по диагонали? – user1091856

+0

Для движущегося элемента диагонально изменить значения 'left' и' top' вместе. – ShankarSangoli

+0

Как? Каждый раз, когда вызывается функция события, свойство keyCode содержит только одно значение, как я могу проверить, нажаты ли обе клавиши (вверху и слева)? – user1091856

1
$("#hero").stop().animate(...); 

Должно быть достаточно

0

Если вы не в очереди анимации, то вы можете позволить элемент анимации по диагонали:

$("html").keydown(function(event){ 
    if(event.which == "37") $("#hero").animate({"left" : "-=30px"}, { queue : false }); 

    if(event.which == "39") $("#hero").animate({"left" : "+=30px"}, { queue : false }); 

    if(event.which == "38") $("#hero").animate({"top" : "-=30px"}, { queue : false }); 

    if(event.which == "40") $("#hero").animate({"top" : "+=30px"}, { queue : false }); 
}); 

Вот демо: http://jsfiddle.net/x5Tn4/

0

Проверьте мой demo, в котором я использую максимум из 2 ключевые штрихи для плавного перехода.

Смежные вопросы