2

私はJavaScriptを初めて使用し、このスクリプトで問題が発生しています。これはWebゲームの一部であり、スクリプトは、プレーヤーが勝つか負けるまでページを更新することを想定しています。なんらかの理由で更新が止まらないので、アラート機能を入れて機能するか確認すると、アラートが表示されますが、ページの更新は継続されます。私は何が間違っているのですか?

var t;

$(document).ready(function () {
    intervals();
});
function intervals() {
    t = self.setInterval('refreshData()', 10000);
}
function youWin() {
    var f = $('#status:contains("YOU ARE THE WINNER!")');
    if (f.length > 0) {
        alert("YOU ARE THE WINNER!");
        t = clearInterval(t);
    }
}
function youlose() {
    var f = $('#status:contains("You lost!")');
    if (f.length > 0) {
        alert("You lost!");
        t = clearInterval(t);
    }
}
function refreshData() {
    $('#ajaxGame').load('RefreshCurrentPlayerServlet #ajaxGame');
    youWin();
    youlose();
}
4

1 に答える 1

4

self呼び出しを修正する必要があり.load()ます。

.load()youWin()は非同期であるため、呼び出す前とyouLose()直後に完了しません。正常に完了した後に勝ち負けを確認できるように、完了関数が必要です.load()

refreshData()次のように構成する必要があります。

function refreshData() {
    $('#ajaxGame').load('RefreshCurrentPlayerServlet #ajaxGame', function() {
        youWin();
        youlose();
    });
}

また、これを変更する必要があります。

t= self.setInterval('refreshData()',10000);

これに:

t = window.setInterval(refreshData, 10000);

それも問題の原因になっている可能性があるように定義されているとは思わないselfので、文字列に入れるのではなく、関数参照を直接使用する必要があります。

そして、クリーンアップの問題として、これの両方の発生を変更する必要があります。

t = clearInterval(t);

これに:

clearInterval(t);

これは、グローバル変数と不要な関数定義も削除する、クリーンアップされたバージョンのコードです。

$(document).ready(function() {
    var t = window.setInterval(function() {
        $('#ajaxGame').load('RefreshCurrentPlayerServlet #ajaxGame', function() {
            youWin();
            youlose();
        });
    }, 10000);

    function youWin()  {
        if ($('#status:contains("YOU ARE THE WINNER!")').length) {
            alert("YOU ARE THE WINNER!");
            clearInterval(t);
        }
    }

    function youlose() {
        if ($('#status:contains("You lost!")').length) {
            alert("You lost!");
            clearInterval(t);
        }
    }

});
于 2012-03-15T01:41:05.997 に答える