0

私はこのコードを持っています:

function Keyboard() {

    this.log = $('#log')[0];
    this.pressedKeys = [];

    this.bindUpKeys = function() {
        $('body').keydown(function(evt) {
            this.pressedKeys.push(evt.keyCode);

            var li = this.pressedKeys[evt.keyCode];

            if (!li) {
                li = this.log.appendChild(document.createElement('li'));
                this.pressedKeys[evt.keyCode] = li;
            }

            $(li).text('Down: ' + evt.keyCode);
            $(li).removeClass('key-up');
        });
    }

    this.bindDownKeys = function() {
        $('body').keyup(function(evt) {
            this.pressedKeys.push(evt.keyCode);

            var li = this.pressedKeys[evt.keyCode];

            if (!li) {
                li = this.log.appendChild(document.createElement('li'));
            }

            $(li).text('Up: ' + evt.keyCode);
            $(li).addClass('key-up');
        });
    }

}

これらのエラーが発生します:

TypeError: 'undefined' is not an object (evaluating 'this.pressedKeys.push')

アレイで何をしたいかは関係ありません。プロトタイプ内に存在しないかのように、アクセスエラーが発生し続けます。

私は何が間違っているのですか?:(プロトタイプ内の他の値と同じように配列にアクセスしているだけです)。オブジェクト内のオブジェクトに問題はありますか?

4

2 に答える 2

2

問題は、イベントハンドラーの内部がthisあなたが思っているものではないということです。イベントハンドラー関数をメソッドにバインドできますbind(または、jQueryを使用しているように見えるため$.proxy):

this.bindUpKeys = function() {
    var that = this;
    $('body').keydown($.proxy(function(evt) {
        //Use `this` as normal inside here
    }, this));
}

thisまたは、イベントハンドラーの外部への参照を保存できます。

this.bindUpKeys = function() {
    var that = this;
    $('body').keydown(function(evt) {
        //Use `that` instead of `this` in here
    });
}
于 2012-07-03T11:19:53.093 に答える
0

プロトタイプの中には存在しないかのように。

いいえ、あります。

アレイにアクセスしているだけです

それはあなたがしないことです。イベントリスナー内のインスタンスをthis指していません。Keyboard

関数がイベントリスナーとして呼び出されると、DOM要素がコンテキストになります(jQueryもそれを行います)。thisキーワードについては、MDNの概要を参照してください。たとえばここで説明するように、クロージャスコープの変数を使用して実際のインスタンスへの参照を保持できます(これについては多くの質問があります)。

可能なクイックフィックス:

  • $('body').keydown( (function(){...}).bind(this))
  • var that=this; $('body').keydown(function(){ that.pressedKeys...; });
于 2012-07-03T11:20:31.313 に答える