我们假设我有这样的代码:
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)案例编写正确的脚本来获得预期的行为...
答案 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;
}
}