0

イベントリスナーを追加できません。基本的に、キーボード関連のすべての関数を次のようにJavaScriptクラスにカプセル化します。

function Keyboard()
{
    this.key = new Array();

    for(x=0;x<255;x++)
    {
        this.key[x] = false;
    }

    function keyDown(evt)
    {
        this.key[evt.keyCode] = true;
        console.log("Keydown bioch");
    }

    function keyUp(evt)
    {
        this.key[evt.keyCode] = false;
    }

    window.addEventListener('keydown', this.keyDown, true);
    window.addEventListener('keyup', this.keyUp, true);
}

それが機能しないことを除いて-まったく。キーボード関数を削除してすべてをグローバルにすると(key []、keyDown、keyUp、およびaddEventListener呼び出し)、すべてが機能します。

私は何が間違っているのですか?

4

2 に答える 2

4

this適切でないキーワードを使用しています。また、オブジェクトにはkeyDown/keyUpプロパティがありません。

thisリスナーがイベント受信(dom)要素を指すように配列を逆参照する必要があります-これにはkeyプロパティがありません。また、ローカル関数を参照するには、それらの名前を使用します。

function Keyboard() {
    var arr = this.key = new Array();
    for(x=0;x<255;x++)
        arr[x] = false;

    function keyDown(evt) {
        arr[evt.keyCode] = true;
        console.log("Keydown bioch");
    }
    function keyUp(evt) {
        arr[evt.keyCode] = false;
    }

    window.addEventListener('keydown', keyDown, true);
    window.addEventListener('keyup', keyUp, true);
}
于 2012-05-30T23:27:26.580 に答える
0

コールバック関数の「this」参照は、期待どおりの関数スコープではなく、ウィンドウオブジェクトを参照しています。

この回答を参照してください。

JavaScriptコールバックスコープ

于 2012-05-30T23:31:09.430 に答える