2016-05-22 3 views
1

コンテンツスクリプト内のページにスクリプトを挿入しようとしています。コンテンツスクリプトからスクリプトを注入します。ウィンドウオブジェクトが利用できません

注入スクリプトでは、オブジェクトabcをオブジェクトwindowに定義する必要があります。しかし、挿入されたスクリプトがロードされた後に、コンテンツスクリプトからの読み込みを試みると、にあるコンテンツスクリプトが原因である可能性がありますか?最初の考えでは、私はコンテンツスクリプトとスクリプトが同じ環境に住むように(そして同じウィンドウオブジェクトを共有する)コンテンツスクリプトとスクリプトを動的に注入することが期待されるので、これは変わったように思えます。

背景:私はさまざまなページにコンテンツスクリプトを読み込む必要があります。拡張機能がそのページで使用されないかもしれないとしても、これらのページのすべてに対して大きなスクリプトを読み込まなければならないのは、帯域幅/パフォーマンスの完全な無駄であるようです。したがって、私はコンテンツスクリプトをできるだけ軽量にしたいと思っています。ユーザーがそのページで拡張機能を使用することを指示したら重いスクリプトを(読み込みを使用して)ロードするだけです(遅延ロード)。 (拡張子アイコンをクリックするなどのイベントをピックアップして)

答えて

-1

あなたの想定は正しいです。非常に明確にあなたも自分をリンクされていること、マニュアルに記載されている:

コンテンツのスクリプトが孤立 世界と呼ばれる特殊な環境で実行されます。彼らは、注入されたページのDOMへのアクセスを持っていますが、 JavaScript変数またはページによって作成された関数にはアクセスできません。 各コンテンツスクリプトは、実行中のページで他のJavaScript が実行されていないかのように見えます。

コンテンツスクリプトからページに挿入した場合でも、ページ上で直接実行されるスクリプトはページの環境(ウィンドウ)を使用します。

デバッグのヒント: クローム開発者ツールコンソールでは、ページのコンテキストとframe selection dropdownにおけるコンテンツスクリプトのコンテキストを切り替えることができます。ページの(おそらくtop)ウィンドウでwindow.abcが定義されているが、コンテンツスクリプトのウィンドウでは定義されていないことがわかるはずです。

正確な目的はわかりませんが、拡張機能アイコンをクリックした後にページで何かを実行する場合は、programmatic injectionでそれを達成できます。あらかじめページに何かを注入する必要はありません。


さらにSO読み:ページ上で直接実行されるスクリプトは、ページの環境(ウィンドウ)を使用しています

Contexts and methods for communication between the browser action, background scripts, and content scripts of chrome extensions?

Building a Chrome Extension - Inject code in a page using a Content script

+0

>、あなたがページにそれを注入しても、あなたのコンテンツスクリプトから。 上記は私には分かりませんでした。ありがとう –

関連する問題