2017-01-26 4 views
0

ウェブサイトを更新するには、データベースのステータスフィールドを定期的に追跡する必要があります。これを達成するために、このようなタイマーをセットアップしてください。HTML:beforeunloadイベントは常に起動されますか

var id = window.setInterval("getState()", 1000); 

getState()AJAX毎秒のデータベースを介して通話や特定のステータスフィールドの値を返します。ブラウザウィンドウが開いている間、タイマーが実行されています。ユーザーがそのブラウザウィンドウを閉じたとき、私は、私はこのコードを実行するタイマをクリアする必要があります。

window.addEventListener('beforeunload', function(event) { 
    setState(0); 
    clearInterval(id); 
}); 

今、私の質問は:このeventは常にトリガを取得していますか?これは最新のブラウザでは信頼できる方法ですか、それとも例外がありますか?

EDIT:

私は、ウィンドウが閉じているDBを更新するために、イベントbeforeunloadsetState()を追加します。これを前に忘れてしまいました...ごめんなさい...

+2

非常に信頼性が高く、例外については何も聞いていません。インターバルハンドラを文字列として渡すのはなぜですか?単に 'setInterval(getState、1000)'を使うことができます。実際には、素早く読み上げると、本質的に「eval」なので、文字列アプローチを使用することは推奨されません。 – somethinghere

+3

ウィンドウが閉じているときにタイマーが自動的にクリアされるので、 'beforeunload'イベントは必要ないと思います。 –

+0

それは良い点ですが、私はDBの状態を更新する必要があることを忘れてしまいました。上記の私の編集を参照してください。 – Ben

答えて

0
  1. beforeunloadイベントは、ユーザがブラウザウィンドウを閉じると常にトリガされます。
  2. beforeunloadイベントは、デバイスが正常に再起動すると常にトリガされます。
  3. beforeunloadイベントが電源(抜く、バッテリープル)デバイスから切断された場合にトリガされませ

サイドノートます:ブラウザのウィンドウが閉じている場合は、あなたのAJAX呼び出しとタイマーは次のようになります自動的に停止しました。

+0

サイドノートの参照:setState()は 'beforeunload'と呼ばれます。次に、setState()はAJAXリクエストを開始します。ウィンドウを閉じる前に処理されますか? (私はその要求でコールバックを期待していません) – Ben

+0

'setState'が起動され、リクエストがサーバーに送られます。したがって、サーバー側で実行されたアクションはすべて実行されます。ただし、クライアント側ではサーバーからの応答を処理するものはありませんので、UIは更新されません。とにかくその時までにあなたのUIは閉鎖されます。 –

関連する問題