-2

こんにちは私はjavascriptの初心者で、今日これに一生懸命取り組みましたが、解決策を見つけることができませんでした。私を助けてください。

<script>
    if (/*@cc_on!@*/false) {
        document.onfocusin = startB;
        document.onfocusout = stopB;
    } else {
        window.onfocus = startB;
        window.onblur = stopB;
    }

var x = 1000;
var y = 1;

function startB() {
    if (x !== 'ok') {
        x = x - y;
        document.form.num.value = x;
        timeoutID=setTimeout("startB()", 1000);
    } 
    if (x == 0) {
        x = 'ok';
        document.form.num.value = x;
    }
}

function stopB() {
clearTimeout(timeoutID);
}
</script>
<body onLoad="startB()">
<form name="form">
<input name="num" size="10" readonly="readonly" type="text"> 
</form>

このページを開くと、通常は1 /秒の値でカウントダウンし、ウィンドウ/タブを変更すると停止し、再び1 /秒継続します。これは私が望むことですが、大きな問題があります->いつこのリンクに移動してウィンドウ/タブをすばやく変更します。これはまだアンロードされており、onblurステータスでカウントダウンを開始し、onfocusステータスに戻ると、関数が2回読み取られ、1/0.5秒でカウントダウンが開始されます。 。ダブル。

誰かがこれを手伝ってくれますか?前もって感謝します。

4

1 に答える 1

0

タイムアウトを設定する前に、 startB がstopBを呼び出すようにします。stopBを次のように変更します。

  if (timeoutID) clearTimeout(timeoutID);

timeoutID がすでにクリアされている (またはまだ設定されていない) 場合、エラーは発生しません。

編集

load イベントが発生する前にページから移動すると、ページがフォーカスされずにタイマーが開始されます。タイムアウトを設定する前にキャンセルした場合 (つまり、setTimeout を呼び出す前にstartBが常にstopB を呼び出した場合)、2 つのタイマーを実行することはできません。

于 2011-06-19T00:18:34.660 に答える