0

Javascriptでセッションタイムアウトを設定しようとしていますが、アラートがタイマーの開始をブロックしているようです。これが私のコードです:

var first_timer = 2 * 1000;
var second_timer = 8 * 1000;
var down = -1;

function initTimer() {
  down = setTimeout(processTimeout, first_timer)
}

function processTimeout() {
        down = setTimeout(logout, second_timer);
        alert ("Timeout of first timer, timerid:" + down );
}

function logout() {
  alert("You are logged out");
  window.location = "http://www.google.com"
}

function clearTimer() {
  if ( -1 != down )
    clearTimeout(down);
  alert("Restarting timer");
  initTimer();
}

initTimer();

上記を実行すると、最初のアラートが解除された後にのみ2番目のタイマーが開始することがわかります。アラートが解除されていない場合でも、最初のタイムアウトの直後に2番目のタイマーが開始するようにするにはどうすればよいですか?

どうも

4

2 に答える 2

1

このalert()関数は、閉じられるまで他のすべてをブロックします。モーダルダイアログと呼ばれるものを使用して、ブロックされない独自のアラートスタイルメッセージを作成できます。

jQueryUIにはこの機能があります。

于 2012-07-12T20:30:21.477 に答える
1

おそらく、使用しているブラウザによって異なります。最新のFirefoxで説明した問題は発生していません。

ただし、それでも、最初のタイマーアラートボックスが閉じられるまで、2番目のタイマーアラートボックスは表示されません。

これは、JavaScriptインタープリターがマルチスレッドではないためです。ただし、JavaScript自体は、特にタイマー、AJAX、アニメーションなどの長い遅延要求では、非常に非同期です。これは時々マルチスレッドの感覚を与えるものです。

実際、コードサンプルでは、​​2番目のタイマーが期待どおりに開始されました。最初のダイアログボックスを閉じると、たとえば、表示されてから10秒後に、2番目のダイアログボックスがすぐに表示されます。それでも、それはあなたの質問かもしれませんが、アラートは同期呼び出しであるため、最初のアラートを閉じる前に表示されることはありません。メインイベントループが閉じられるまで制御を取り戻さないようにします。

この状況の回避策は、たとえばJquery-UIによって提供されるような「HTML」ダイアログボックスを使用することです。

于 2012-07-12T20:44:02.090 に答える