如何在javascript中获取击键序列?

时间:2013-04-13 16:00:47

标签: 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&gt; 47&amp;&amp; e.keyCode&lt; 58)案例编写正确的脚本来获得预期的行为...

1 个答案:

答案 0 :(得分:1)

没有编写跟踪它的代码= P,没有神奇的方法可以跟踪应用程序状态。您必须更新移动功能以跟踪单元格是否聚焦。但是,如果您的单元格是可聚焦的并且具有tabindex,则可以使用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;
    }             
}