41

私の拡張機能は、挿入されたページがすでに完全にロードされた後にのみ、コンテンツスクリプトsearchTopic.jsをロードすることになっています(はい、拡張機能マニフェストで「run_at」を「document_end」に設定しました)が、実際には以前にロードされていますすべてのDOMオブジェクトが作成されました(重要なオブジェクトは、ページ内のJavascriptを介して作成されます)。したがって、問題は、ページのJavascriptが実行されるまでどのように待つことができるかということです。これが私のマニフェストです:

"content_scripts": [
  {
  "run_at": "document_end",
  "matches": ["https://groups.google.com/forum/*"],
  "js": ["searchTopic.js"]
  }
],
4

3 に答える 3

64

"run_at": "document_end"と同等DOMContentLoadedです。 つまり、静的HTMLがロードされた後、遅い画像と遅い終了のjavascriptの前に発生します。

したがって、マニフェストのみを設定するだけでは、ページのJSの後に起動するようにコンテンツスクリプトを設定することはできません。これについては、コンテンツスクリプト自体でコーディングする必要があります。

コンテンツスクリプトの場合、はイベント"run_at": "document_end"の前にonload起動します(デフォルトとは異なり、document_idle予測できない時間に起動する可能性があります)。

したがって、最初のステップはload、コンテンツスクリプト(searchTopic.js)で次のようなコードを使用してイベントを待機することです。

window.addEventListener ("load", myMain, false);

function myMain (evt) {
    // DO YOUR STUFF HERE.
}


気になるスクリプトが完了するまでに時間がかかる場合は、ケースバイケースで何らかの条件をポーリングする必要があります。例えば:

window.addEventListener ("load", myMain, false);

function myMain (evt) {
    var jsInitChecktimer = setInterval (checkForJS_Finish, 111);

    function checkForJS_Finish () {
        if (    typeof SOME_GLOBAL_VAR != "undefined"
            ||  document.querySelector ("SOME_INDICATOR_NODE_css_SELECTOR")
        ) {
            clearInterval (jsInitChecktimer);
            // DO YOUR STUFF HERE.
        }
    }
}
于 2012-12-17T16:07:23.550 に答える
3

script要素は順番に実行されます。scriptにノードがある場合、ブラウザはDOMコンテンツの読み込みを停止しbodyます。これは動作することが保証されています。そうでない場合、document.write()動作を停止します。

したがって、2つの解決策があります。

  1. onloadイベントを使用してコードをロードします。
  2. ページの最後の要素(要素の最後のものbody)としてスクリプトタグを追加します。このスクリプトは、他のすべてのスクリプトが終了た後、および本体がDOMツリーに変換された後に実行されます。
于 2012-12-17T16:08:28.667 に答える
-1

window.loadメソッドを使用します。

function addLoadEvent(a) {
    var b = window.onload;
    "function" != typeof window.onload ? window.onload = a : window.onload = function () {
        b && b(),
            a()
    }
}
function init() {
    alert('init');
}
addLoadEvent(init);
于 2017-07-20T05:25:22.467 に答える