[解決済み] ブラウザのウィンドウが現在アクティブでないことを検出する方法はありますか?
2022-03-15 21:46:05
質問
定期的に活動しているJavaScriptがあります。ユーザーがサイトを見ていないとき(つまり、ウィンドウやタブにフォーカスがないとき)、実行されないといいのですが、どうしたらいいですか?
JavaScriptでこれを実現する方法はありますか?
私が参考にしたのは Gmail チャットでは、使用しているウィンドウがアクティブでない場合、サウンドが再生されます。
解決するには?
この回答を書いている間に、新しい仕様が発表されました。 推奨 W3Cのおかげでステータスが上がりました。 その ページ可視化API は MDN ) が、ページがユーザーに対して非表示であることをより正確に検出できるようになりました。
document.addEventListener("visibilitychange", onchange);
現在の対応ブラウザ。
- Chrome 13 以上
- インターネットエクスプローラ10以上
- Firefox 10 以上
- Opera 12.10 以上 [ メモを読む ]
以下のコードは、互換性のないブラウザでは、信頼性の低いblur/focusメソッドにフォールバックします。
(function() {
var hidden = "hidden";
// Standards:
if (hidden in document)
document.addEventListener("visibilitychange", onchange);
else if ((hidden = "mozHidden") in document)
document.addEventListener("mozvisibilitychange", onchange);
else if ((hidden = "webkitHidden") in document)
document.addEventListener("webkitvisibilitychange", onchange);
else if ((hidden = "msHidden") in document)
document.addEventListener("msvisibilitychange", onchange);
// IE 9 and lower:
else if ("onfocusin" in document)
document.onfocusin = document.onfocusout = onchange;
// All others:
else
window.onpageshow = window.onpagehide
= window.onfocus = window.onblur = onchange;
function onchange (evt) {
var v = "visible", h = "hidden",
evtMap = {
focus:v, focusin:v, pageshow:v, blur:h, focusout:h, pagehide:h
};
evt = evt || window.event;
if (evt.type in evtMap)
document.body.className = evtMap[evt.type];
else
document.body.className = this[hidden] ? "hidden" : "visible";
}
// set the initial state (but only if browser supports the Page Visibility API)
if( document[hidden] !== undefined )
onchange({type: document[hidden] ? "blur" : "focus"});
})();
onfocusin
と
onfocusout
は
IE9以下では必須
を使用し、それ以外のものは
onfocus
と
onblur
を使用するiOSを除く。
onpageshow
と
onpagehide
.
関連
-
vueはopenlayersを使用してスカイマップとガオードマップをロードする
-
Vueでルートネスティングを実装する例
-
Vueのフォームイベントのデータバインディングの説明
-
フロントエンド null のプロパティ 'disabled' を読み取れない 問題が解決された
-
[解決済み] URLを新しいタブで開く(新しいウィンドウではない)
-
[解決済み] 画面サイズ、現在のウェブページ、ブラウザウィンドウのサイズを取得する
-
[解決済み] モバイル端末の検出にはどのような方法がありますか?
-
[解決済み] Safari、Chrome、IE、Firefox、Operaのブラウザを検出する方法は?
-
[解決済み】WPFとイニシャルフォーカス
-
[解決済み] タブやウィンドウがアクティブでないとき、ブラウザはどのようにJavascriptを一時停止/変更するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
vueのグローバルがscss(mixin)を導入。
-
[解決済み] テスト
-
[解決済み】Node Version Manager のインストール - nvm コマンドが見つかりません。
-
[解決済み] TypeError: $.ajax(...) is not a function?
-
[解決済み】リクエストに失敗していないのに、「TypeError: failed to fetch」が表示される。
-
[解決済み】エラー。Ionic使用中にモジュール '../lib/utils/unsupported.js' が見つかりませんでした。
-
nodejs unhandledPromiseRejectionWarning メッセージ
-
フロントエンド非同期(アシンク)ソリューション(全ソリューション)
-
JavaScriptのgetElementById、getElementsByTagNam、getElementsByClassNameの違いと使い方
-
[解決済み】ブラウザ/タブがアクティブかどうかを判断する方法 [重複]。