Chrome 拡張機能 - 単一ページの読み込みごとにコンテンツ スクリプトが複数回挿入される
-
27-10-2019 - |
質問
Chrome 拡張機能でコンテンツ スクリプトが同じページに複数回挿入されるという問題が発生しています。
タブ変更時に「background.html」ページからコンテンツ スクリプトを挿入しています。
chrome.tabs.onUpdated.addListener(function(tabId,changeInfo,tab){
chrome.tabs.getSelected(null,function(tab){
// Do some stuff
chrome.tabs.executeScript(null, { code: code}, function(result){
...等
コンテンツ スクリプト内には、いくつかの console.log コマンドがあります。
問題は、単一のページをロードすると、各ログがコンソールに 2 ~ 4 回表示されることです。
ページ内の iframe が原因でこれが起こっていることは明らかです。少なくとも...私の質問は、なぜですか?
ドキュメントでは、「all_frames」(マニフェスト内のコンテンツスクリプトの権限配列)がデフォルトで「false」に設定され、その結果、コンテンツスクリプトがページの上部フレームにのみ挿入される必要があると見ましたが、これは単に起こっていません!
なぜ複数回注入されるのですか?「all_frames」を物理的に false に設定する必要がありますか?
第二に:
拡張機能がコンテンツスクリプトを挿入しようとしているページが「background.html」ページ内のiframeまたはtopであるかどうかを判断する方法はありますか?
私が試してみました
if(window.top === window){ console.log('whatever'); }
そして、それは100%機能しないことがわかりました。コード ブロックの残りの部分 ( chrome.tabs.executeScript() の周囲) にその条件を設定しても、コンテンツ スクリプトが複数回挿入されています。
アイデアや提案をいただければ幸いです。:)
解決
onUpdated
タブの状態が変化するたびに起動されます。これには、次のような場合も含まれます。 読み込み中 そして ロード終わり, では、多くのログ ステートメントについて説明します。イベントが発生するたびに、何が変更されたか (URL が変更された、ロードされたなど) を確認する必要があります。