0

私は書いたスクリプトを注入してGmailにいくつかの機能を追加するGoogle Chrome拡張機能を作成しています。 「注射スクリプト」によってthis definitionを参照してください。Google Chrome拡張機能を使用してGmailにコードを挿入する - 読み込みが完了したらスクリプトを挿入する方法を教えてください。

これを行うには、私のコンテンツスクリプトは["https://mail.google.com/mail/*"]に一致します。

ただし、これはGmailが読み込まれて読み込みが完了したときと同じURLであるという問題があります。その結果、Gmailの読み込み中に参照元エラーが発生することがありますが、スクリプトが早すぎるタイミングで注入されることがあります。この問題を回避しようとする

、私は実行して負荷に私のスクリプトを実行している: window.addEventListener("load", runInjectedScript);

をそして、この条件が真であるとき(注入を行います)私のコンテンツスクリプトでは、それが唯一の注入します: if (window.self === window.top)

ただし、Gmailの読み込みが完了して受信トレイが表示されると、これらの対策では、適切なタイミングでスクリプトを挿入することが保証されていないようです。 どうすればこのようになるのですか?私が実装していない技術はありますか?

+0

gmails JS内の特定の機能を利用しようとしていますか?変数がまだ定義されているかどうかを確認するためにsetTimeoutを行うことができます。 – Dave

+0

@Daveは、ページがロードされていなければ、再度呼び出すsetTimeoutを持つ関数を提案していたと思います。 _n_ミリ秒ごとにチェックして、再度実行するか、ページが読み込まれるとコールバックを実行するだけです。 – Archer

+0

@ user5508297あなたは正しいです。または、setIntervalを使用して、要件が満たされたら間隔をクリアすることもできます。コードを答えとして書く – Dave

答えて

0

Gmailで傍受しているデータがまだ利用可能かどうかを確認するためにsetIntervalチェックを実行する可能性があります。

var gmailLoaded = setInterval(function() { 
    if (typeof GMAIL !== 'undefined') { 
     runInjectedScript(); 
     clearInterval(gmailLoaded); 
    } 
}, 100); 

あなたがGmailからの参照しようとしているものは何でもしてGMAILを交換する必要があります。上記の同じアプローチを使用して、ローディング状態がアクティブかどうかを確認することもできますが、オーバーヘッドが増える可能性があります。

0

のために、私はGmailのページを点検し、受信トレイのロード一度それらは、要素にstyle="display: none"を追加します。

あなたのアプリを変更してからブートストラップするためにポーリングを行うことができます。

function onInboxLoaded(cb) { 
    var pollInterval = setInterval(function() { 
    var elem = document.getElementById('loading'); 
    if (elem && elem.style.display === 'none') { 
     clearInterval(pollInterval); 

     cb(); 
    } 
    }, 100); 
} 

onInboxLoaded(function(){ 
    // bootstrap app 
}) 
関連する問題