1

私はJavaスクリプトでゲームを書いていますが、動作している間に複数のクリックに応答するのが遅いです。以下は、クリックを処理するために使用しているコードの非常に単純化されたバージョンです。十分長く待たなければ2の2回目のクリックに応答できません。これは私がただ受け入れる必要があるか、または次のクリックのために準備するより速い方法がありますか?javascript onclickハンドラのパフォーマンスに関する問題

私はquirksmodeレコーディングコンテストのAddEventを使用してこの関数をアタッチします。

var selected = false; 
var z = null; 
function handleClicks(evt) { 
    evt = (evt)?evt:((window.event)?window.event:null); 
    if (selected) { 
     z.innerHTML = '<div class="rowbox a">a</div>'; 
     selected = false; 
    } else { 
     z.innerHTML = '<div class="rowbox selecteda">a</div>'; 
     selected = true; 
    } 
} 

ライブのコードでは、私はあなたの問題は、巨大なパフォーマンスの問題であるDOMを変更innerHTMLの変化であると考えていhttp://www.omega-link.com/index.php?content=testgame

答えて

2

:よう

何か。変更はすぐに行われますが、2回目のクリックは待たなければ無視されます。 mousedownイベントまたはmouseupイベントのいずれかに変更することをお勧めします。

+0

マウスを上げると、そのトリックが完了したようです。ありがとう。もちろん、クロスプラットフォームの方法でハンドラを削除する方法を調べる必要がありますが、それは軽微です。 – Tom

1

で見ることができます。

+0

私は実際にinnerHTMLメソッドとDOMメソッドの両方でこれを試しました。どちらも同じスピードで反応するようです。最初のクリックは遅れて少し遅れて応答し(ブロックがハイライジドになります)、2回目のクリックは最初のクリックからあまりにも早く発生しない場合はうまく動作します(私はここのタイミングで推測していますが、約1/4秒)。 通常のゲームでは、ユーザーはブロックをクリックして強調表示し、もう一度クリックしてブロックを削除します。 – Tom

3

DOMにdivを追加/削除するのではなく、innerHTMLプロパティと同じように、クラス名を変更することができます。私はあなたの問題は第二のクリックでDBLCLICKイベントとしてではなく、クリックイベントとして登録されていることだと思います

var selected = false; 
var z = null; 

function handleClicks(evt) 
{ 
    var tmp; 

    if(z == null) 
     return; 

    evt = (evt)?evt:((window.event)?window.event:null); 
    tmp = z.firstChild; 
    while((tmp != null) && (tmp.tagName != 'DIV')) 
     tmp = tmp.firstChild; 
    if(tmp != null) 
    { 
     if (selected) 
     { 
     tmp.className = "rowbox a"; 
     selected = false; 
     } else 
     { 
     tmp.className = "rowbox selecteda"; 
     selected = true; 
     } 
    } 
} 
+0

それは私が持っていた問題に対処していませんが、私がする必要がない場合、あなたは削除したり再作成しないことについて優れた点を作っています。 +1 – Tom

1

うん、あなたも(のdocument.createElementに対してinnerHTMLプロパティのパフォーマンスを比較したい)、または可能性があります

+0

一般的に良いアイデアだから、+1。しかし、私は両方の方法を試していたし、少しでも違いがあった。 – Tom