2012-03-28 12 views
47

新しいページが読み込まれるたびにChrome拡張機能でinit()機能を実行しようとしていますが、これを行う方法を理解するのに問題があります。私が理解から、私はbackground.htmlで次の手順を実行する必要があります。ページが スクリプトを実行するために使用chrome.tabs.executeScript Chrome拡張コードとコンテンツスクリプトと注入スクリプト

  • を変更したとき

    1. 使用chrome.tabs.onUpdated.addListener()をチェックします。

    このコード私が持っている:のinit()関数は、他のJSファイルにある私の他の機能にアクセスする必要があります場合、私は疑問に思っても

    //background.html 
    chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { 
        chrome.tabs.executeScript(null, {code:"init();"}); 
    }); 
    
    //script.js 
    function init() { 
        alert("It works!"); 
    } 
    

  • 答えて

    142

    次のグループに分けることができるChromeの拡張機能でのJavaScriptのコード:

    • 拡張コード - すべてへのフルアクセスがchrome.* APIを許可します。
      これには、background pageと、browser pop-upsのようなchrome.extension.getBackgroundPage()で直接アクセスできるすべてのページが含まれます。 (マニフェストファイルまたはchrome.tabs.executeScript経由)

    • Content scriptsからchromeのAPIの一部にPartialアクセス、ページのDOMへのフルアクセス(フレームを含むwindowオブジェクトのいずれかにない、)。
      コンテンツスクリプトは、内線番号とページの間のスコープ内で実行されます。コンテンツスクリプトのグローバルwindowオブジェクトは、ページ/拡張のグローバル名前空間とは異なります。

    • 注入スクリプト(コンテンツスクリプトのthis method経由) - ページ内のすべてのプロパティへのフルアクセス。 chrome.* APIのいずれにもアクセスできません。
      注入されたスクリプトは、ページ自体に含まれているかのように動作し、どのような方法でも拡張機能に接続されません。さまざまな注入方法の詳細については、this postを参照してください。

    注入スクリプトからコンテンツスクリプトにメッセージを送信するには、イベントを使用する必要があります。例については、this answerを参照してください。注:あるコンテキストから別のコンテキストに拡張機能内で転送されるメッセージは、(JSON) - シリアル化され、と解析されます。あなたのケースでは


    コンテンツスクリプトscript.jsが評価される前に、背景ページ(chrome.tabs.onUpdated)内のコードはそう呼ばれています。 initがそうでないので、あなたはReferenceErrorを得るでしょう。また

    、あなたがchrome.tabs.onUpdatedを使用し、二回イベントが発生するので、あなたはページが完全にロードされているかどうかテストすることを確認してください:ロードする前に、そしてフィニッシュには:

    //background.html 
    chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { 
        if (changeInfo.status == 'complete') { 
         // Execute some script when the page is fully (DOM) ready 
         chrome.tabs.executeScript(null, {code:"init();"}); 
        } 
    }); 
    
    +0

    はクロム 'についてのヒントをありがとう.tabs.onUpdated'が2回発射されました。ですから私の疑問は私が 'init()'をどのように注入するのかということです。 JavaScriptをすべて注入する必要がありますか? 'init()'は通常、ユーザがブラウザアクションアイコンをクリックすると呼び出され、 'init()'は他の関数をトリガします。 – Jon

    +1

    @ user1277607ページのグローバル変数のいずれかにアクセスする必要がある場合は、スクリプトを挿入します。 'function init'がページと拡張コードの両方にアクセスしなければならないときは、コンテンツスクリプトを使います。 ** [リンクされた回答](http://stackoverflow.com/a/9517879/938089?building-a-chrome-extension-inject-code-in-a-page-using-a-content-script)を参照してください* *スクリプトを挿入する方法を見るには、** [この回答](http://stackoverflow.com/a/9636008/938089?chrome-extension-retrieving-gmails-original-message)**を実装するためのガイドラインページの変数にアクセスしなければならないコンテンツスクリプト。 –

    +0

    ありがとうございます。それは美しく働いた:) – Jon

    関連する問題