2012-01-16 26 views
0

Google Chromeが「Uncaught TypeError:プロパティ 'isDown' undefined」を設定できませんが、コードに問題がないように見えます! (エラーがスローされ、これがある)Uncaught TypeError:未定義のプロパティを設定できません

KEY = { 
    UP: 38, 
    DOWN: 40, 
    W: 87, 
    S: 83, 
    D: 68 
} 
pingpong = { 
    fps: 60, 
    pressedKeys: [], 
    complete: false, 
} 

キーリスナーの初期化:私の変数配列の

重要な部分

for (var keyCode in KEY) { 
     if (KEY.hasOwnProperty(keyCode)) { 
      pingpong.pressedKeys[KEY[keyCode]] = { 
       isDown: false, 
       wasDown: false 
      }; 
     } 
    } 
    $(document).keydown(function(e) { 
     pingpong.pressedKeys[e.which].isDown = true; 
    }); 
    $(document).keyup(function(e) { 
/* This line is the issue */ pingpong.pressedKeys[e.which].isDown = false; 
    }); 

任意のアイデア?

+0

問題が発生したら、どのボタンを押しますか?いいえ、これはおそらくこれのようなものです(より良い方法があるかもしれません。おそらく、このボタンはKEYオブジェクトに記述されていませんか? – dfsq

答えて

2

を使用しています。あなたの配列を初期化するときだけKEYオブジェクトのプロパティの要素を作成

$(document).keyup(function(e) { 
    //Pressed "a" so e.which == 65 
    pingpong.pressedKeys[e.which].isDown = false; 
}); 

::私たちは「」キーを押した場合たとえば、

for (var keyCode in KEY) { 
    //Iterating over KEY, which contains 5 properties... 
    if (KEY.hasOwnProperty(keyCode)) { 
     //Add value to pressedKeys (this happens for each of the 5 properties) 
     pingpong.pressedKeys[KEY[keyCode]] = { 
      isDown: false, 
      wasDown: false 
     }; 
    } 
} 

をそうpressedKeysはわずか5つの要素が含まれ、 KEYの特性に対応する。 TypeErrorは、と同様に、​​イベントハンドラにもスローされます。

修正するには、e.whichがイベントハンドラ機能のKEYSオブジェクトに含まれていることを確認することができます。そうでない場合は無視してください。

$(document).keydown(function(e) { 
    for(var k in KEY) { 
     if(KEY[k] == e.which) { 
      break; //Break out of loop and execute last line 
     } 
     return false; //Key not recognized, last line is not executed 
    } 
    pingpong.pressedKeys[e.which].isDown = true; 
}); 
+0

私の解決策として何を提案しますか? –

+0

@ ryansworld10 - 私の編集を参照してください。 –

+0

私が正しく理解していれば、入力がKEYであるかどうかを確認します。そうであれば、正常に実行し、そうでなければ、pressedKeysに入力しないでください。 –

1

e.whichはIEのみです。本当のブラウザでは、問題が存在しないpressedKeys配列の要素にアクセスしようとしているということですe.keyCode

jQuery Event Keypress: Which key was pressed?

+1

jQueryはイベントオブジェクトを正規化するので、 'e.which'は正常に動作します。 –

+0

+「real」という単語を使用した1人の有権者投票 –

関連する問題