フォーカス監視 · 起動中

オンライン・タブフォーカス検出 — 離席時にページが記録するもの

確認中…

この文書が自身の表示状態とフォーカスについて報告する内容を読み取っています。

タブを切り替える、別のウィンドウをクリックする、最小化する——そして戻ってきてください。

このページは、Webテストや監督ページが行うのとまったく同じフォーカスと表示状態のチェックを、あなた自身のブラウザ上で実行します。タブを切り替える、別のウィンドウをクリックする、最小化する——そのたびに何が記録されるかがそのまま見えます。データは一切送信されず、下に表示される値はすべてこのタブの中だけで完結します。

イベントログ

タブを切り替える、別のウィンドウをクリックする、最小化する——そして戻ってきてください。

シグナル

#時刻イベント記録される状態離脱時間
まだ記録はありません。別のタブに移るか、別のウィンドウをクリックして戻ってきてください。

このテストが読み取るもの

どのブラウザも、独立した2つの値を公開しています。document.visibilityState はこのタブが表示中のタブかどうかを示し、document.hasFocus() はこの文書がキー入力を受け取っているかどうかを示します。どちらも許可は不要で、どちらも無効化できません。

この2つは同じものではありません。別のタブに切り替えるとページは非表示になります。一方、2つめのブラウザウィンドウやチャットアプリ、ターミナルをクリックした場合、このタブは表示されたままフォーカスだけを失います——非表示ではなくフォーカス喪失です。

テストプラットフォームは通常この両方を記録し、別々に数え、それぞれの離脱が何秒続いたかを計測します。下の表は、まさにそのとき作られる記録そのものです。

何が引き金になるか

  • 別のタブへの切り替え——visibilitychange が発火し、状態が hidden になります。スマートフォンを含め、どの環境でも記録されます。
  • ウィンドウの最小化、画面ロック、スマートフォンのスリープ——これらも非表示として扱われます。
  • 別のウィンドウやアプリのクリック——2つめのブラウザウィンドウ、エディタ、メッセージアプリ、検索パネルやランチャーなど。タブは表示されたままで、代わりにウィンドウの blur イベントが発火します。
  • 開発者ツールを別ウィンドウで開く——ウィンドウの切り替えとみなされるため blur が発火します。
  • ブラウザによるタブの凍結・破棄(メモリ節約のため)——Chromium では freeze と pagehide が発火します。
  • ページを閉じる・再読み込みする——pagehide が発火します。プラットフォームが未完了の受験を締めるのに使うのがこのイベントです。

オンライン受験の前に

「ページを離れると記録されます」と警告するテストを受けるなら、それが実際に何を意味するのかを先に知っておく価値があります。

  1. 実際に受験する予定のブラウザでこのページを開き、そのまま開いておきます。
  2. 別のタブに切り替えて、すぐ戻ってきてください。ログに hidden イベントと正確な秒数が残ることを確認します。
  3. 次はタブではなく、別のウィンドウ(チャットアプリやエディタ)をクリックしてみてください。ログには blur イベントが出て、タブは一度も非表示になっていません。
  4. ロックアウト表示をオンにすると、離席した瞬間にテストページが何を表示するかが分かります。多くのプラットフォームがまさにこれを表示します。
  5. 意図しない発火にも注意してください。通知バナー、別ウィンドウで開くパスワードマネージャー、ショートカットランチャーなども、すべて記録に残ります。

何が記録されるかを知ることと、それをかいくぐることは別の話です。このページが示すのはあくまで「どう読み取られるか」であり、それをどう解釈するかは各プラットフォームの判断です。

判定の仕組み

フォーカスあり——visibilityState が visible かつ hasFocus() が true。このタブは画面上にあり、キー入力を受け取っています。

フォーカスなし——表示はされているが、フォーカスは別のウィンドウやアプリに移っています。このタブを見ながら別の場所に入力しているか、他のウィンドウが上に重なっている状態です。

非表示——タブがそもそも描画されていません。別のタブが手前にある、ウィンドウが最小化されている、あるいは端末の画面が消えている状態です。

離脱タイマーはフォーカスを奪う最初のイベントで開始し、2つの値がともに真に戻った時点で停止します。そのため、blur から続けてタブ切り替えになった場合も、ひと続きの1回の離脱として数えられます。

見えないもの

これらの値は、あなたがどこへ行ったかを一切伝えません。ページに分かるのは、このタブがアクティブでなくなったことと、その長さだけです。どのタブか、どのアプリか、画面に何が映っていたかは分かりません。

キーボードフォーカスを動かさずにブラウザの外で起きたことは、発火するイベントが存在しないため、このAPIからは完全に見えません。2台目の実機、印刷した紙、同じ部屋にいる別の人などがこれに当たります。

回数そのものは何の証明にもなりません。フォーカスを奪う通知、スクリーンリーダーのパネル、OSの更新確認、そして意図的なタブ切り替えは、まったく同じイベントを生みます。

本格的な監督はこれだけに頼りません。カメラ、マイク、画面共有、インストール型のロックダウンブラウザは、Webページよりはるかに多くを見ています。ページが許可なしに読み取れるもう一つの値については外部モニター検出テストをご覧ください。

プライバシー

このページは静的です。アクセス解析もCookieもローカルストレージも使わず、読み込み後は一切のネットワークリクエストを行いません。

ページ上のカウンターやタイムスタンプはすべてあなたのタブ内で計算され、タブを閉じた瞬間に消えます。再読み込みですべてリセットされます。

全文を読むことができます。JavaScriptファイル1つだけで、フッターからリンクしています。

ブラウザ対応

visibilitychange と document.hasFocus() は、デスクトップ・モバイルを問わず現行のすべてのブラウザで動作します。許可も、セキュアなオリジンも必要ありません。

freeze と resume は Chromium 専用で、ブラウザがメモリ節約のためバックグラウンドタブを一時停止したときに発火します。他のブラウザはこれらを報告しません。

iOS ではアプリの切り替えがフォーカス喪失ではなく非表示として記録されます。ブラウザ全体がバックグラウンドに入るためです。両者の区別はウィンドウの概念がある環境にしか存在しません。

よくある質問

Webサイトはタブの切り替えを検出できますか?

できます。しかも許可は一切不要です。あなたのタブが表示中でなくなった瞬間に visibilitychange イベントが発火し、戻るまで document.visibilityState は hidden を返し続けます。モバイルを含む現行のすべてのブラウザが実装しており、これをページから隠す設定は存在しません。

Webテストはタブ切り替えと別アプリを開いたことを区別できますか?

できます。タブを切り替えるとページは非表示になりますが、別のウィンドウやアプリをクリックした場合はページは表示されたままキーボードフォーカスだけを失い、代わりに blur イベントが発火します。両方を記録しているプラットフォームなら区別可能で、このページも両者を別々に表示するので、違いを自分の目で確認できます。

オンラインテストは、どのタブ・どのアプリに移ったか分かりますか?

分かりません。ブラウザがページに伝えるのは「アクティブな文書ではなくなった」ことと、その継続時間だけです。移動先——別のタブ、別のプログラム、ロック画面——が公開されることはありません。それ以上の詳細には画面共有かインストール型のロックダウンブラウザが必要で、どちらも目に見える形で同意を求められます。

スクリーンショットを撮るのは離席になりますか?

撮り方によって完全に変わります。OSが自前のUIなしで処理するショートカットは、ブラウザがフォーカスを失わないため何も発火しません。一方、範囲選択やパネル、プレビューウィンドウが開く方式はフォーカスを奪うので blur として記録されます。両方をこのページで試して、ログを見比べてみてください。

タブを切り替えていないのに、なぜカウントが増えるのですか?

フォーカスは思った以上にいろいろなものに奪われます。通知バナー、パスワードマネージャーのポップアップ、OSの更新確認、キーボードショートカットのランチャー、別ウィンドウで開いた開発者ツールなどです。いずれも意図的な切り替えと区別のつかない blur イベントを発生させます。

この検出はブラウザの設定でオフにできますか?

できません。Page Visibility API は権限ではなく文書そのものの一部なので、取り消す対象がありません。これを塞ぐと、バックグラウンドタブで動画を止める、アニメーションを止める、タイマーを止めるといった正当な用途まで壊れてしまいます。

デュアルモニターにすればタブ切り替えは記録されなくなりますか?

なりません。視線を2台目の画面に移すだけなら何も変わりませんが、その画面上のウィンドウをクリックすればこのタブからキーボードフォーカスが外れ、1画面のときとまったく同じ blur イベントが発火します。2台目の画面自体がページから見えるかどうかは別の問題で、外部モニター検出テストが扱っています。

これらの情報はサーバーに送信されますか?

されません。このページは静的で、アクセス解析もCookieもなく、読み込み後にネットワークリクエストを行いません。表示されるイベントやタイマーはすべてあなたのタブ内で計算され、タブを閉じると破棄されます。