8

私は現在 Chrome 拡張機能に取り組んでおり、ソース コードはGithub で入手できます。目標は、カスタム Javascript を Web ページに挿入することです。

現在、各カスタム Javascript InjectをlocalStorageに保存し、コンテンツ sciptsから呼び出します。run_atdocument_startに設定しました。

これを使用して、バックグラウンド スクリプトから保存された注入を取得します。

chrome.extension.sendMessage({method:"get_injects"},function(injects){
    for(index in injects){
        if(/^items\./.test(index)){
            itemJSON = injects[index];
            //if(window.location.host.toString().indexOf(itemJSON.url)){
            if(window.location.host.toString().match(itemJSON.url + '$')){
                var js = itemJSON.js.toString();
                eval(js);
            }
        }
    }
});

問題

ドキュメントが読み込まれる直前にInjectスクリプト を実行したいと考えています。しかし、提示された方法を使用すると、制御は渡され、応答を待つことはありません。そのため、ページ読み込みの途中で実行されます。ページの読み込み前に注入できるようにするには、どうすればこれを解決できますか?chrome.extension.sendMessageinjectseval(js);

4

2 に答える 2

4

Chrome では、各タブが独自のプロセスで実行されます。バックグラウンド ページは、フックしているタブのプロセスとは異なる拡張プロセスで実行されます。したがって、本当に同期的なソリューションはあり得ないのではないかと心配しています。

chrome.storage (オリジンの制限がないため、バックグラウンド ページは必要ありません) を使用しても非同期になります。

ただし、ほとんどのページで機能するソリューションは次のとおりです。

  1. 必要なデータがページの localStorage にある場合は、6 に進みます。
  2. ページからすべてを削除する
  3. データの非同期リクエストを実行します
  4. データを取得したら、ページの localStorage に保存します (バックグラウンドではありません)。
  5. 同じ URL でページを更新する
  6. 利益
于 2013-03-28T09:18:18.017 に答える
2

バックグラウンド ページから現在のコンテンツ スクリプトに任意の量のデータを同期的に取得する方法があります。拡張機能でコードを同期的にブロックすることは避けてください。そのため、サンプル コードは提供しません。これを実稼働コードでコピー アンド ペーストすることを思いとどまらせるためです。

フローは次のとおりです。

  1. XMLHttpRequestこれらの手順を開始するには、コンテンツ スクリプトで (偽の URL への)同期を使用します。
  2. バックグラウンド ページで、chrome.webRequest.onBeforeRequestイベントを使用してこのリクエストをインターセプトします。
  3. またはバックグラウンド ページのローカル変数などからデータを同期的に取得し、localStorageそれを blob に変換してから、 を使用して URL に変換しますvar url = URL.createObjectURL(new Blob([ 'data chunks here' ]));
  4. イベントで使用return {redirectUrl: url};してonBeforeRequest、データを送り返します。
  5. 最終的にはURL.revokeObjectURL(url);、データが使用するリソースを解放するために必ず使用してください。

そして最後に、可能であれば、同期、ブロックコードを避けてください!!

于 2014-06-10T21:01:10.010 に答える