-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;
    }             
}

しかし、1 つの数字だけでなく、2 桁の数字も取得する必要があります。プログラムは次のように動作する必要があります。 - ユーザーが空のセルに移動して「2」キーを押すと、セルに数字「2」が表示されます。ここで「3」を押すと、数字は「23」になります。次にキーを押すと (「7」としましょう)、最初からやり直して、セルに「7」を入力します。- ユーザーが「2」が既に書かれているセルに移動してから「3」を押すと、「3」のみが表示され、その後の「7」のストロークによって「37」になります。

そのため、セルの外に移動すると、MS Excel で発生するのと同じようにセルを「閉じる」必要があります。

開いた状態または閉じた状態のセルを追跡できることはわかっていますが、それにはすべての移動関数に「閉じている」セルをアタッチする必要があります。これは少し問題です。私の実際のプログラムには、これらが 2 つ以上あるからです。不可能ではありませんが、if (e.keyCode>47 && e.keyCode<58) の場合に適切なスクリプトを記述するだけで期待される動作を得ることができるように、より良いアプローチがあるかどうかを知りたいです...

4

1 に答える 1

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