47

内に新しいオブジェクトを提供する Chrome 拡張機能を作成したいと思いますwindow。拡張機能をロードしたブラウザで Web ページを表示するときに、window.mythingJavascript 経由で利用できるようにしたいと考えています。window.mythingオブジェクトには、拡張機能で定義する関数がいくつかあります。これらの関数は、拡張機能が有効になっているブラウザーでページを表示したときに、または任意の Javascript ファイルから呼び出すことができる必要がありますconsole.log

Content Scriptを使用して、Javascript ファイルをページに正常に挿入できました。

var s = document.createElement("script"); 
s.src = chrome.extension.getURL("mything.js");
document.getElementsByTagName("head")[0].appendChild(s);

mything.js は次のようになります。

window.mything = {thing: true};
console.log(window);

ページが読み込まれるたびに、windowオブジェクト全体がコンソールに表示されると思います。ただし、window.mythingコンソールからオブジェクトを操作することはできません。挿入されたスクリプトが実際にはグローバルwindowオブジェクトを変更していないように見えます。

windowChrome 拡張機能からグローバル オブジェクトを変更するにはどうすればよいですか?

4

7 に答える 7

56

直接ではありません。コンテンツ スクリプトのドキュメントから:

ただし、コンテンツ スクリプトにはいくつかの制限があります。彼らがすることはできません:

  • chrome.* API を使用する (chrome.extension の一部を除く)
  • 拡張機能のページで定義された変数または関数を使用する
  • Web ページまたは他のコンテンツ スクリプトによって定義された変数または関数を使用する

(強調追加)

windowコンテンツ スクリプトに表示されるオブジェクトは、ページに表示されるオブジェクトと同じではありませんwindow

ただし、window.postMessageメソッドを使用して、DOM 経由でメッセージを渡すことができます。ページとコンテンツ スクリプトの両方がメッセージイベントをリッスンし、これらの場所のいずれかから呼び出すとwindow.postMessage、もう一方がそれを受け取ります。この例は、「コンテンツ スクリプト」ドキュメンテーション ページにあります。

編集: コンテンツ スクリプトからスクリプトを挿入することで、いくつかのメソッドをページに追加できる可能性があります。のようなものを使用しないと、拡張機能の残りの部分と通信することはできませpostMessageんが、少なくともページのwindow

var elt = document.createElement("script");
elt.innerHTML = "window.foo = {bar:function(){/*whatever*/}};"
document.head.appendChild(elt);
于 2012-09-12T21:08:39.803 に答える
6

私はこれで遊んでいます。javascript を window.location= 呼び出しにラップすることで、ブラウザーのウィンドウ オブジェクトを操作できることがわかりました。

var myInjectedJs = "window.foo='This exists in the \'real\' window object';"
window.location = "javascript:" + myInjectedJs;

var myInjectedJs2 = "window.bar='So does this.';"
window.location = "javascript:" + myInjectedJs2;

それは機能しますが、設定されている window.location の最後のインスタンスに対してのみです。ドキュメントの window オブジェクトにアクセスすると、変数 "bar" は含まれますが、"foo" は含まれません。

于 2016-04-12T01:40:24.830 に答える