2

キャンバスゲームを少し簡単にするために、自分用にスーパーソートのJavascriptライブラリを作成しようとしています。

属性として入力するのではなく、Javascriptからのキー押下のイベントリスナーを追加したいと思います。

しかし、それを行うたびにそれが正しく機能することはなく、私は本当にイライラし、学業ができるときにそれを理解しようとしてすべてのスペアを無駄にしています!

とにかく、誰かが私がどこで間違っているのか教えてくれると思いますか?このコードでは、alert()矢印キーが押されたばかりのコードが必要です

これがindex.htmlです

<html>
<head>
<script src="spencersjslibrary.js"></script>
</head>
<body>
<div id="blueblock" style="background:blue; width:100px; height:100px;"></div>
<script>addkeylisten("blueblock")</script>
</body>
</html>

そしてここにspencersjslibrary.jsがあります

//Keyboard stuff for moving and yeah

//Adding event listener
function addkeylisten(ida) {
    alert(ida)
    var ide = document.getElementById(ida)
    ide.addEventListener("keypress", keycheck(event))
}


//checking what key was pressed and assign string value to "lastkey"
function keycheck(event) {
    var bttn = (event.keyCode);
    switch (bttn) {
        case 38:
            lastkey = "up";
            break;
        case 40:
            lastkey = "down";
            break;
        case 37:
            lastkey = "left";
            break;
        case 39:
            lastkey = "right";
            alert(lastkey)
    }
}

だから私はを修正addEventListenerし、クリックイベントではうまく機能するようになりましたが、私のkeypressものではうまくいきませんでした。

それは、キャンバスまたはボディ要素で機能するような要素タイプだけですか?そして、それが画像のようなものだったとしたら、キーを押す音を聞くために焦点を合わせる必要がありますか?

4

2 に答える 2

3

構文ide.addEventListener("keypress",keycheck(event))が正しくありません。

あなたはそれをとして登録する必要があります

ide.addEventListener( "keypress"、keycheck);

コードは、関数ポインターを登録するだけでなく、実際にはハンドラーを呼び出しています。

于 2012-12-21T17:41:25.153 に答える
1

@closureの答えは正解です。

ide.addEventListener("keypress", keycheck(event))常にkeycheck(event) すぐに実行されます。eventが定義されておらず、ハンドラーが呼び出されないため、これは悪いことですkeypress

あなたが探しているのはこれです:

ide.addEventListener("keypress", function (event) {
    keycheck(event)); // binds to the input ^
});

そしてそれは次のように減らすことができます:

ide.addEventListener("keypress", keycheck);

JavaScriptの変数のような関数を実際に参照できるからです(素晴らしいです)。

于 2012-12-21T17:44:52.993 に答える