1

私は Jquery を初めて使用しますが、この問題の原因を見つけることができないようです。

関数 GameStart() が実行されるたびに新しい値を取得する変数があります。この関数に対して、一時停止関数を作成しようとしています。一時停止関数には、変数の値を表示するアラートがあります (テストとして)今のところ)。

問題は、一時停止クリック イベントが現在の値だけでなく、以前の値もすべて警告することです。

これの原因は何ですか?そして、それを修正するにはどうすればよいですか?

フィドルの例では、[スタート] を押し、[一時停止] を時々押して、すべての値を表示します。

JSFIDDLE: http://jsfiddle.net/Limitedmoves/SrWJP/

$(document).ready(function () {
    $('.butResize').click(function () {
        alert("hello"); 
            GameStart();    
    });

    function GameStart(){
        //Set needed random variables below
        var vSetTimer = 1000 * Math.floor(Math.random() * 10);
        var vBarWood = 1 + Math.floor(Math.random() * 400); 

        setTimeout(function () {
        //alert(vSetTimer);
            $('.div').animate({height: vBarWood }, 500);
        GameStart();    
    }, vSetTimer); //Time lenght set from vSetTime variable

    $('.pause').click(function () { //Start pause function
        var vTempTimer= vSetTimer;
        console.log(vTempTimer);    
    });
}
});

私はここでstackoverflowを見回し、「リターン」を使用して同様の動作が解決されていることを発見しましたが、私が試したところ、それは役に立ちませんでした.

よろしくお願いします!:)

4

3 に答える 3

1

@ju-kの説明は正しく、有効な解決策を提供します。ただし、別の解決策は次のようになります。

$(document).ready(function () {

    $('.butResize').click(function () {
        alert("hello");
        GameStart();
    });

    var vSetTimer;
    var vBarWood;

    function GameStart(){
    //Set needed random variables below
        vSetTimer = 1000 * Math.floor(Math.random() * 10);
        vBarWood = 1 + Math.floor(Math.random() * 400);

        setTimeout(function () {

            //alert(vSetTimer);

            $('.div').animate({height: vBarWood }, 500);

            GameStart();    

        }, vSetTimer); //Time lenght set from vSetTime variable
    }

    $('.pause').click(function () { //Start pause function
        console.log(vSetTimer);
    });

});

つまり、変数を外側のスコープに移動します。これにより、毎回アンバインド/バインドする必要なく解決できます。

編集 コメントで指摘されているように、この回答でのように動作した理由についての説明はありません。ここに行きます:

質問の動作の理由は、他の回答で述べたように、GameStart が呼び出されるたびに、セレクター「.pause」に一致する要素にクリック ハンドラーが追加されたためです。つまり、GameStart の初回実行時に、クロージャ var (vSetTimer) を持つハンドラが「.pause」ボタンに追加されました。次回 GameStart が実行されるときも、同じことが行われます。このクロージャーは変更されません。そのため、最初に表示された同じ数値が 2 回目に表示され、その後に次のクロージャー変数が続きます。

于 2013-08-20T09:42:33.723 に答える
0

更新されたfiddleを見てください。 cleartimeout を追加して問題を解決しました。

clearTimeout(timer);

randNumberまた、外側のreSize()スコープを入れました。

于 2013-08-20T09:37:55.317 に答える