私は、JSライブラリへの呼び出しがjavascriptコードを通過するように、関数の書き換えを利用するいくつかのjavascriptコードを分析しようとしています。私のJavaScriptコードはChrome拡張機能の一部であり、Chrome拡張機能を使用してコンテンツスクリプトを使用してターゲットページのDOMにインストール/挿入します。 これは、ページの読み込み後に誘導され、ライブラリ呼び出しが自分の関数を通過するような関数でうまく動作します。しかし、実際にページがロードされている間に実行されるJavaScriptコードがあります(DOMがレンダリングされている間)。これは私のカスタムスクリプトが注入される前に起こります。こうすることで、カスタムスクリプトが挿入される前の関数呼び出しが失われたり、JS呼び出しが関数を経由したりすることはありません。 コンテンツスクリプトを使用して、実際に他のJavaScriptを挿入するには、下記のリンクに記載されているようにDOMに追加します。私はDOMの開始/終了になるようにコンテンツスクリプトのロード時間を扱うことができるが、これは私がターゲットページのDOMに追加し、私にはない別のスクリプトファイルである知っているコンテンツスクリプトがインストールされる前にjavascriptを停止する
Insert code into the page context using a content script
それを制御する方法を理解しているようです。 誰の助力も大歓迎です。ありがとうございました。
編集: Is it possible to run a script in context of a webpage, before any of the webpage's scripts run, using a chrome extension? で説明した問題はまったく同じですが、解決策が機能していないようです。私の意図は、Webページからjsコードが実行される前に、挿入されたスクリプトを実行することです。 manifest.jsonでdocument_startを指定すると、コンテンツスクリプトの実行はWebページの前で実行できますが、コンテンツスクリプトから挿入するスクリプト(最初のリンクで説明したようにスクリプトを挿入します)では実行できません。この注入されたスクリプトは、ウェブページ
EDIT 2に対する任意の特定の方法で実行されていない。
manifest.jsonをマニフェストファイルは、コンテンツスクリプトがdocument_startで添加content.js有します。そのため、content.jsはターゲットWebページ(基本ページ)が実行される前に実行されます。
"content_scripts":[
{
"matches":["<all_urls>"],
"js":["content.js"],
"run_at":"document_start",
"all_frames":false
}
],
content.js
content.js私は実際にターゲットページの環境にあるのJavaScriptと相互作用することができるしていますように、私はDOMにmain.jsを追加していると、以下のコードを持っています。私はコンテンツ・スクリプトを使ってターゲット・ページのJavaScriptと相互作用することができないため、別のファイルからこれを行い、DOMにアタッチします。なぜなら、相互に干渉しないからです。 さらに説明すると、main.jsには、JSの実行中にターゲットページでJS呼び出しをインターセプトするJavaScriptがいくつかあります。 JSのターゲットページではライブラリへの呼び出しが行われ、これらのライブラリ関数にラッパーを記述するつもりです。
var u = document.createElement('script');
u.src = chrome.extension.getURL('main.js');
(document.head||document.documentElement).appendChild(u);
u.onload = function() {
u.parentNode.removeChild(u);
};
私はdocument_startで実行されるコンテンツスクリプトを通してそれを注入するのでmain.jsは、ターゲットページのドメインと対象ページ内のスクリプトのいずれかで利用可能であることを期待しています。 私はターゲットページのhtmlでsomeJSCall()がターゲットページのドメインによって定義されているように、このようないくつかのJS関数を呼び出すと仮定します。このシナリオmain.jsで
(コードは私のクロム拡張を介して注入)すでに利用可能です。したがって、someJSCall関数からJSライブラリを呼び出すと、main.jsラッパー関数が呼び出されます。 これは正常に動作します。
問題は、ターゲットページのJSで定義されたIIFE(直ちに呼び出される関数式)がある場合です。これらのIIFEコールがライブラリ呼び出しを行う場合、これは私のmain.jsインターセプトを経由しません。 Chrome Dev Toolsを使用してブラウザに読み込まれたファイルを見ると、IIFE呼び出しの実行中にmain.jsがまだ読み込まれていないことがわかります。
私はこの問題を詳細に説明してくれることを願っています。まだ明らかでない場合は教えてください。
ありがとうございます。
トピックにする質問を編集してください:**完全な** [mcve]を含めると*問題が複製されます*。 * manifest.json *、背景/コンテンツ/ポップアップスクリプト/ HTMLの一部を含みます。デバッグの助けを求める質問(「**なぜこのコードは動作しないのですか?**」)には、以下が含まれていなければなりません:►必要な動作、►特定の問題またはエラー*、および►問題を再現するのに必要な最短コード自体**。明確な問題文がない質問は、他の読者にとって有用ではありません。参照してください: "**どのように[mcve] **を作成するか"、[ここで私はどんな話題を聞くことができますか?](http://stackoverflow.com/help/on-topic)、[ask] – Makyen
クロム拡張を使用して、ウェブページのスクリプトが実行される前に、ウェブページのコンテキストでスクリプトを実行することはできますか?](http://stackoverflow.com/questions/13540636/is-it-possible – rsanchez
これは重複していない理由について、不明瞭な説明をいくつか提出しています。これは、Webページの前にあるWebページの文脈で実行中のスクリプトです。ただし、トピックに関するデバッグの質問をするために必要なものはまだ提供していません。リストの私の最初のコメントを参照してください。ここにないものの大部分は** [mcve] **です。あなたが持っている問題を複製し、リンクされた複製の解決策があなたの問題を解決しない理由を具体的に示す[mcve]がなければ、私たちはあなたを助けることができません。私たちが助けたくないというわけではありません。私たちができるように十分な情報を提供していないということです。 – Makyen