-2

假设我有这样的代码:

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) 案例编写正确的脚本来获得预期的行为......

4

1 回答 1

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;
    }             
}
于 2013-04-13T16:19:20.257 回答