2012-01-14 22 views
11

は、私は私のバックグラウンドスクリプトに次のコードを持っている:Chrome拡張機能:コンテンツスクリプトが既にタブに読み込まれていることを検出するにはどうすればよいですか?

chrome.tabs.onUpdated.addListener(function(tabId, changeinfo, tab) { 
    if (changeinfo.status !== 'complete') 
     return; 

    if (!matchesUrlFilters(tab.url)) 
     return; 

    chrome.tabs.executeScript(tabId, { file: "jquery-1.7.1.min.js" }, function() { 
     chrome.tabs.executeScript(tabId, { file: "enhance.js" }); 
    }); 
}); 

しかし、これは(enhance.jswindow.history.pushStateをしたときにそれが起こるかもしれない)いくつかのケースでは二回、私のコンテンツスクリプトを注入するようです。

タブに既にコンテンツスクリプトがあるかどうかを確認するにはどうすればよいですか? chrome.tabs.sendRequestを試しましたが、コンテンツスクリプトがまだ追加されていない場合はコールバックを呼び出さなかったことがあります。

+0

スクリプトが2回注入されると、2つの 'enhanced.js'スクリプトは共有変数を持つ1つの実行環境を共有しますか? – abraham

+0

私は分かりません(そして今、おそらく問題を完全に解決する答えによって決してチェックされません)。 –

+0

これは古い質問ですが、私もこの問題に遭遇しました。ロードされたスクリプトのチェックを追加するのではなく、私はmanifest.jsonの "content_scripts"部分からスクリプトを削除しなければなりませんでした。なぜなら、スクリプトの実行を委任して常にロードしたくないからです。 – Andrew

答えて

10

EDIT:この回答の最初のコメントごとに更新されます。

このようなものを試してみるとよいでしょう。必要なスクリプトを読み込むコールバックとして使用されるonRequestリスナを追加しますが、要求メッセージの一部として送信される値に基づいて読み込まれます。次に、executeScriptを使用して、グローバル変数の値(存在する場合)を持つメッセージを送信する "code"を直接呼び出します。

chrome.tabs.onUpdated.addListener(function(tabId, changeinfo, tab) { 
    ... 

    // execute a content script that immediately sends back a message 
    // that checks for the value of a global variable which is set when 
    // the library has been loaded 
    chrome.tabs.executeScript(tabId, { 
     code: "chrome.extension.sendRequest({ loaded: EnhanceLibIsLoaded || false });" 
    }); 

    ... 
}); 

// listen for requests 
chrome.extension.onRequest.addListener(function(req, sender, sendResponse) { 
    if (req.loaded === false) { 
     chrome.tabs.executeScript(tabId, { file: "jquery-1.7.1.min.js" }, function() { 
      chrome.tabs.executeScript(tabId, { file: "enhance.js" }, function() { 
       // set the global variable that the scripts have been loaded 
       // this could also be set as part of the enhance.js lib 
       chrome.tabs.executeScript(tabId, { code: "var EnhanceLibIsLoaded = true;" }); 
      }); 
     }); 
    } 
}); 
+0

これは天才ですが、少し修正しました(外側の 'onRequest.addListener'を動かしました)、とにかくそれは完全に機能します。ただし、 'chrome.tabs.onUpdated.addListener'ではなく' chrome.extension.onRequest.addListener'でなければなりません。 –

+0

うれしいことを聞いてうれしく思いますが、私はあなたのコメントごとに答えを編集しました(私はそれが正しいとは言えません。 –

+1

私はこれを使いたかったのですが、consolにはエラーがあります: 'Uncaught ReferenceError:EnhanceLibIsLoaded is defined' :( – Alireza

関連する問題