ポップアップと背景ページを備えた Google Chrome 拡張機能を作成しています。ポップアップは、バックグラウンドが生成する特定のイベントをサブスクライブします。ポップアップが消えたら、これらのイベントのサブスクライブを解除したいと思います。ただし、ポップアップから生成される onbeforeunload または onunload イベントのいずれも表示されません。これらのイベントは発生しますか? そうでない場合、ポップアップを閉じる方法に関するアイデアはありますか?
4 に答える
「beforeunload」は、ブラウザー アクション ポップアップに対して起動されません。私を信じてください、私は試しました。ただし、「アンロード」は正しく起動されるはずなので、それを聞いてください。
実際、私は addEventListener を使用してイベントをアタッチできる同様のシステムを用意しており、アンロード イベントが発生すると自動的にクリーンアップされます。
console.log
ここにちょっとしたヒントがあります: unload イベントが発火する頃には既に手遅れなので、明らかに を使用することはできません。しかし、これを行うことができます:
var background = chrome.extension.getBackgroundPage();
addEventListener("unload", function (event) {
background.console.log(event.type);
}, true);
上記のコードを使用すると、バックグラウンド ページのコンソールを開くことができ、unload イベントが正しく発生したことが示されます。
私はある種の同様の問題を抱えていました。私の場合、ポップアップページにあった要素にフォーカスを設定しました。したがって、ポップアップを閉じると、要素はフォーカスを失い、ぼかしイベントをキャッチできます。
拡張機能でバックグラウンド ページの代わりにイベント ページを使用するように切り替えた場合、それにアクセスするための推奨される方法はchrome.runtime.getBackgroundPage()
、バックグラウンド ページ参照でコールバックされる関数を使用して呼び出すことです。
ただし、onbeforeunload
ハンドラーで背景ページを取得しようとすると、次のようになります。
document.addEventListener("beforeunload", function() {
chrome.runtime.getBackgroundPage(function(backgroundPage) {
backgroundPage.log("unloading");
});
});
ページがアンロードされる前にコールバックが起動しないように見えるため、そのlog()
呼び出しは行われません。
上記のコメントで、Pauanchrome.extension.getBackgroundPage()
はページを取得するために使用することを提案しました。それを機能させる唯一の方法は、でハンドラーを作成しないことでしたaddEventListener()
。代わりに、古い学校に行き、ハンドラーを直接設定する必要がありましたwindow
。
window.onbeforeunload = function() {
chrome.extension.getBackgroundPage().log("unloading");
};
それは最終的に背景ページに到達しました。