2013-04-13 3 views
-2

Давайте предположим, что у меня есть такой код:Как получить последовательность нажатия клавиш в javascript?

function onKeystroke(e) 
{ 
    if (e.keyCode == 39) //Arrow Right 
    { 
     currentCell += 1; 
    } 

    if (e.keyCode == 37) //Arrow Left 
    { 
     currentCell -= 1; 
    }  

    if (e.keyCode>47 && e.keyCode<58) //Numbers 0-9 
    { 
     cells[currentCell] = e.keyCode - 48; 
    }    
} 

Но мне нужно не только получить один номер, но и две цифры номера. Программа должна вести себя следующим образом: - если пользователь перемещается в пустую ячейку и нажимает клавишу «2», в ячейке появляется цифра «2». Если он теперь нажимает «3», число становится «23». Следующее нажатие клавиши (скажем, «7») запускает его и помещает в ячейку «7». - если пользователь перемещается в ячейку, где «2» уже записано, а затем нажимает «3», появляется только «3», а последующий такт «7» делает его «37».

Таким образом, перемещение из ячейки должно «закрыть» ее аналогично тому, что происходит в MS Excel.

Я знаю, что я могу отслеживать, что ячейка находится в открытом или закрытом состоянии, но для этого потребуется привязать ячейку «закрытие» ко всем функциям движения. И это немного проблема, потому что у меня гораздо больше двух из них в моей реальной программе. Это не невозможно, но я хотел бы знать, есть ли более хороший подход, поэтому я мог бы получить ожидаемое поведение, просто написав правильный скрипт для if (e.keyCode> 47 & & e.keyCode < 58) case ..

ответ

1

Нет никакого волшебного способа отслеживать состояние приложения без написания кода, который отслеживает его = P. Вам нужно будет обновить функции движения, чтобы отслеживать, была ли ячейка только сконцентрирована. Однако, если ваши ячейки являются объективными и имеют tabindex, вы можете использовать событие focus, чтобы централизовать эту логику. Без использования события «focus» ваша текущая функция может выглядеть так:

var isNewCell = false; 

function onKeystroke(e) 
{ 
    if (e.keyCode == 39) //Arrow Right 
    { 
     currentCell += 1; 
     isNewCell = true; 

    } 

    if (e.keyCode == 37) //Arrow Left 
    { 
     currentCell -= 1; 
     isNewCell = true; 
    }  

    if (e.keyCode>47 && e.keyCode<58) //Numbers 0-9 
    { 
     if (isNewCell || typeof cells[currentCell] !== 'number' || cells[currentCell].toString().length === 2) { 
      cells[currentCell] = e.keyCode - 48; 
     } else { 
      cells[currentCell] = parseInt(cells[currentCell] + (e.keyCode - 48).toString(), 10); 
     } 

     isNewCell = false; 
    }    
} 
+0

Да, спасибо! Но могу ли я позволить избежать редактирования всех функций движения? –

+0

Что значит «все функции движения»? Вам просто нужно повторно использовать ту же функцию 'onKeystroke'. – plalx

+0

Я имею в виду «подфункции» или просто «части» в «if (e.keyCode == some movement)» случаи –