manymanyuni
@manymanyuni (manymanyuni)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

beforeunload でタブが閉じられるのを阻止したい。けれども、ウィンドウが閉じられた場合には阻止したくない。

解決したいこと

beforeunload イベントの中で、タブが閉じられたのか、ウィンドウが閉じられたのかを判別したい

タブが不用意に閉じられる事を阻止しようとしています。
beforeunload イベントを使えばタブが閉じられる前に confirm を出しキャンセルする事ができますが、ブラウザ自体を閉じた場合でもこのイベントは発火されます。
タブを閉じた場合にだけ反応し、ブラウザを閉じた場合には反応しないようにしたいです。
解決方法を教えてください。

具体的なコード

window.addEventListener('beforeunload', event => {
  // この中で、
  // 1. タブが閉じられた場合はユーザーにタブを閉じるかどうか促しその結果次第でタブが閉じられる事を阻止し、
  // 2. ウィンドウを閉じることによって間接的にタブが閉じられる場合には何も促さずタブを閉じる
});

自分で試したこと

Chrome 拡張の tabs を使って実装できないかを考えた
event-onRemoved
しかしこのイベントはタブが既に閉じられた「後」で発火するものであって、タブが閉じられることを阻止する事ができない。
また、閉じられたタブがどのような URL を開いていたのかも取得することはできない。

Chrome 拡張の windows を使って実装できないかも考えた
event-onRemoved
こちらもウィンドウが既に閉じられた後で発火するイベントである為、タイミング的に手遅れ。

0

1Answer

Web標準のAPIでは、タブが閉じられたかウィンドウが閉じられたかを判別する手段は用意されていないと思います。(あくまでスクリプトは文書ベースなので)

「タブで閉じられたかウィンドウで閉じられたか」という判別でなく「そのページのタブを表示しているときに閉じられたか別のタブを表示しているときに閉じられたか」という観点で考えれば、Page Visibility APIで判別できなくはないです。

1Like

Your answer might help someone💌