7

わかりました。私が望むのは、タブ内に既に存在するメソッドをオーバーライドすることです。ここで使用するのは、デフォルトのアラート関数です。JS 関数内でオーバーライドするのは非常に簡単です。追加するだけ

window.alert = function(){ 
   //Do Something
}

しかし、問題は、使用しようとするchrome.tabs.executeScript("window.alert = function() { };");と機能しないことです。関数をオーバーライドしたいタブで Chrome のコンソールを使用して、これを手動で実行しようとしました。そのオーバーライド関数をログに入力して Enter キーを押したところ、アラート機能がオーバーライドされましたが、できませんでした。これはChrome拡張機能を介して。

executeScript を追加すると、タブ DOM 内に既に存在する関数の名前で関数を作成できるため、タブ DOM 内の Javascript とは別に Javascript を作成するようです。

タブ DOM 内にスクリプトを記述する executeScript を作成する方法はありますか?それにより、ページが生成した .js ファイルによって記述された関数を実際にオーバーライドできますか?

ありがとう!

4

1 に答える 1

19

関数は DOM の一部として存在しません。代わりに、DOM を含む実行環境内に存在します。コンテンツ スクリプト ( で実行されるスクリプトを含むexecuteScript) と実際の Web ページは同じ DOM を共有しますが、実行環境は異なります。そのため、実際のページの実行環境ではなく、コンテンツ スクリプトの実行環境内でwindow.alert = function() {}のみ書き換えを呼び出します。window.alert

実際のページの実行環境に到達する一般的な方法は<script>、DOM にタグを挿入することです。これにはいくつかの方法があります。1 つの方法は、スクリプトをホワイトリストに登録し、このスクリプトを参照する要素をドキュメントにweb_accessible_resource挿入することです。<script>必要な絶対 URL は、 から取得できますchrome.extension.getURL

var s = document.createElement("script");
s.src = chrome.extension.getURL("script_in_extension.js");
(document.head||document.documentElement).appendChild(s);

"run_at": "document_start"ページの関数が読み込まれる前に上書きが行われるように、スクリプトが に設定されていることを確認してください。

注: あなたのアクションはページによって簡単に元に戻すことができます:

window.alert = function(){ /*...*/ }; // Your overwrite
delete window.alert;                  // Run from the page/console/...
window.alert('Test?');                // Displays alert box.

上書きされた関数を削除できないことが重要な場合は、 を使用Object.definePropertyして不変メソッドを定義します。詳細については、Chrome 拡張機能で関数の実行を停止するを参照してください。

于 2012-08-23T16:22:40.073 に答える