いつJQueryのキーダウンイベントがスローされますか?

私はサードパーティのコントロール(Aspose.Cells.GridWeb)を使用しています。それは基本的にWebベースのExcelコントロールです。ユーザーがセルを選択すると、コントロールによってonCellSelectedイベントが発生します。

つまり、このイベントを発生させるためにどのキーが押されたのかを知る必要があります。私はこの情報をイベントの処理方法を決定するために必要とします。

JQueryのkeydownイベントを使用して、クリックされたボタンをキャプチャしています。

    $(document).keydown(function(event) {
        isKeyLastClicked = true;
        keyLastClickedId = event.which;
        isMouseButtonLastClicked = false;
        mouseButtonLastClickedId = null;
    });

問題は、keydownイベントが発生する前にコントロールのonCellSelectedイベントが発生していることです。これは予想される動作ですか?

コントロールのイベントが発生する前に、キーのIDを取得する方法はありますか?

前もって感謝します。

0

3 答え

After a long discussion at the SO chat...
Since binding the keydown event does not produce the desired results, you have to alter the onCellSelected function. It should follow the next pattern:

  1. When onCellSelected is triggered for the first time, the first argument (cell) is assigned to a (temporary) variable.
  2. Then, when a keydown event occurs, the key code is checked:
    • If the pressed key (ev.which or ev.keyCode) equals a certain key, the onCellSelected function is called again, passing the value of the temporary variable as a first argument.
    • Else, the temporary variable is cleared, since it makes no sense to remember it.

コードは次の構造を持ちます。アプリケーションに合わせて変更してください:

var lastCell = null;
function onCellSelected (cell) {
    if(lastCell == null) {
        lastCell = cell;
        return; //Wait for the next listener
    }
    ... //Rest of code
}

$(document).keydown(function(e){
    if(lastCell == null) return; //No need to do unnecessary calculations
    //Whatever you want, example:
    if(e.keyCode == 32) {
        onCellSelected(lastCell);
        lastCell = null; //Reset
    }
    ... //Rest of code
});

Note: keyCode, charCode and which, see also: http://asquare.net/javascript/tests/KeyCode.html

1
追加された

keydown イベントを最初に起動させる方法(またはそれが可能な場合でも)を得る方法についてはまだ分かりません。しかし、私はあなたがいつでも最後のウィンドウズイベントにアクセスできることを発見しました。だから、上記の私の元の質問に示されているように変数を設定するイベントに頼るのではなく、単に window.event.type にアクセスするだけです。

次に、いくつかのサンプルコードを示します: window.event の使い方を示す:

if (window.event.type == "keydown") { //keyboard click
    if (IsKeyNextType(window.event.which)) { //checks which key was pressed. In this case a key qualifying as "Next" (ie: Enter, Tab, etc)
            //PERFORM NEXT ACTIONS
    }
    else { //"Previous" keys (ie: Up arrow, Left arrow)
            //PERFORM PREVIOUS ACTIONS
    }
}
else if (window.event.type == "click") { //mouse click
    //PERFORM MOUSE CLICK ACTIONS
}
0
追加された
@ロブ:あなたは本当ですか? Chromeでは問題なく動作します。他のブラウザの同等のイベントは何ですか?
追加された 著者 Shai Cohen,
@RobW:FFの window.event.type に相当する方法はありますか?もしそうでなければ、私はおそらく keydown イベントが遅すぎる、正方形に戻ります。
追加された 著者 Shai Cohen,
@RobW:Argh :) Nealが答えたのは本当ですか?秩序が問題なの?私がそれを購読している場所に応じて、そのイベントは早くも遅く発射されますか?私に間違っているようだ。しかし、何かを試して喜んで。
追加された 著者 Shai Cohen,
window.event は非標準のIE専用の機能です。
追加された 著者 Rob W,
イベントオブジェクトは、イベントリスナーのコンテキストで意味を持ちます。イベントリスナーがトリガーされると、その関数の最初の引数はイベントオブジェクトです。 window.event は少なくともFirefoxではサポートされていません。
追加された 著者 Rob W,
ようこそ正方形に戻って:/
追加された 著者 Rob W,
Shai、あなたのコードがデモされているソースを私に渡すことはできますか?そうでない場合は、イベントハンドラを $(function(){...})にラップして、サードパーティのコードの前にこのコードを 定義してください。
追加された 著者 Rob W,

それはあなたのコードの順序に依存します。

コード内の最初のものが最初に実行されます。

また、2つの別々の関数(揮発性の可能性があります)の代わりにコールバックを使用する方が良いです。

0
追加された