2010-03-08 3 views
3

Я создаю веб-интерфейс для управления маленьким роботом. Ajax-вызовы будут выполняться при подключении ключей, запуске робота и приведении в действие, чтобы остановить его.Как избежать многократного нажатия клавиш вверх/вниз/нажатия клавиши при удерживании клавиши?

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

-edit: Я забыл упомянуть об этом изначально, но я попытался сохранить состояние кнопки. Проблема заключается в том, что события keydown, keypress и keyup срабатывают снова и снова, когда я держу клавишу нажатой.

+0

Какой браузер (ы) вы используете, когда получаете такое поведение? –

+0

Я пробовал это как в Chrome, так и в Firefox – Rammay

ответ

0

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

0

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

Когда срабатывает событие keyup, остановите робота и добавьте обработчик нажатия клавиш назад.

EDIT: фактически удалив обработчик событий из вашего события keydown. Вы захотите использовать события keydown и keyup ... не нажатие клавиши.

Так в основном:

  1. назначить KeyDown обработчик события
  2. правопреемником обработчик KeyUp событие
  3. на KeyDown, удалите KeyDown обработчик событий и начать свой робот
  4. на KeyUp, переназначить KeyDown обработчик событий
+0

Как вы можете видеть из редактирования, проблема в том, что события просто циклически повторяются. Очень скоро после того, как keydown запущен, срабатывает при срабатывании клавиатуры, даже если физический ключ удерживается нажатой. – Rammay

+0

Используете ли вы какую-либо библиотеку (dojo, jQuery и т. Д.) Для обработки этих событий? Не могли бы вы поделиться своим кодом? – smencer

2

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

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

Предупреждение вызывается только при нажатии клавиши.

var A=[], who=// I used a textarea, substititute your own target 
who.onkeydown= who.onkeyup= function(e){ 
e=window.event || e; 
var t= e.type, target= e.target || e.srcElement; 
A.push(t); 
if(t== 'keydown'){ 
    // start robot and stop listening to keydown 
    target.onkeydown= ''; 
} 
else if(t== 'keyup'){ 
    // stop robot and listen for keydown 
    target.onkeydown= arguments.callee; 
    alert(A) 
} 
}