6

Chrome 拡張機能を使用してローカル変数にアクセスしようとしています。console.info(myVar)ページスクリプト内で試してみると、myVar is not defined

ただし、Chrome 開発者ツールを使用してデバッグ コンソールで同じスニペットを実行すると、myVar の完全なコンテンツが取得されます。

にアクセスしようとしたときと同じ動作ですwindow.myVar。これは単にundefinedクロム拡張機能を介して印刷するときです。

開発ツールとページ スクリプトを介して次のスニペットを使用してスクリプト タグを本文に挿入すると、まったく同じ動作になります。

   $("body").append($("<script />", {
      html: "console.info(myVar);"
   }));

開発ツールで実行すると変数が出力されるが、ページスクリプトで JavaScript エラーが発生する

4

2 に答える 2

5

表示されるのは、予期される動作です。

コンテンツ スクリプトは、隔離された世界と呼ばれる特別な環境で実行されます。挿入先のページの DOM にはアクセスできますが、ページによって作成された JavaScript 変数や関数にはアクセスできません。各コンテンツ スクリプトは、それが実行されているページで他の JavaScript が実行されていないかのように見えます。逆の場合も同様です。ページで実行されている JavaScript は、関数を呼び出すことも、コンテンツ スクリプトによって定義された変数にアクセスすることもできません。

http://developer.chrome.com/extensions/content_scripts.html#実行環境

console.info(myVar);ページ、Chrome 開発ツールのコンソール、または挿入されたスクリプトから実行すると、ページのコンテキストで実行されるため、定義された変数が表示されます。

ただし、拡張コード内から同じコードを実行すると、まったく異なる環境で動作するため、myVar未定義です。

おそらく共有DOMを使用してこれを回避できます。
http://developer.chrome.com/extensions/content_scripts.html#host-page-communication

編集

誰かが私を修正しない限り、拡張機能のコンテキストで実行されている間に、console.info(myVar);以下のコードが要素に挿入されます。script

$("<script />", {
    html: "console.info(myVar);" // myVar points to extension's myVar, not page's
});

オブジェクトをログに記録するか、コンテンツ スクリプト内でchrome.extension宣言することにより、簡単なテストを実行できます。myVarchrome.extensionmyVar

提案は、外部スクリプト (モジュール性にも優れています) を使用し、それを追加して、その外部スクリプトを指すプロパティを持つ要素をweb_accessible_resources作成することです。scriptsrc

以下の拡張コードの例では、拡張機能を有効にして test.html ページをロードすると、「test」と警告されます。

マニフェスト.json

{
    "name": "Test",
    "version": "0.1.0",
    "manifest_version": 2,
    "description": "Just a test.",
    "content_scripts": [{
        "matches": ["<all_urls>"],
        "js": ["contentscript.js"]
    }],
    "web_accessible_resources": [
        "myscript.js"
    ]
}

test.html (訪問したページ)

<!DOCTYPE html>
<html>
<head>
    <script>
        window.test = 'test';
    </script>
</head>
<body>
</body>
</html>

contentscript.js

var script = document.createElement('script');
script.type = 'text/javascript';
script.src = chrome.extension.getURL('myscript.js');
document.getElementsByTagName('head')[0].appendChild(script);

myscript.js (これは、ページのコンテキストで実行される外部スクリプトです)

alert(window.test);
于 2013-05-28T06:25:10.923 に答える
2

Olegと私は、チャット セッションで問題の原因を突き止めました。

次のスニペットを使用してスクリプトを挿入してみました。

   $("body").append($("<script />", {
      html: "console.info(myVar);"
   }));

Olegが回答で書いたようconsole.infoに、ページの本文に到達する前にパーツが実行され、拡張コンテキストがここにあるように見えます。ただし、非 jQuery バージョンは正常に動作します。

var g = document.createElement('script'); 
var s = document.getElementsByTagName('script')[0]; 
g.text = "console.info(myVar);" 
s.parentNode.insertBefore(g, s);
于 2013-05-28T08:28:14.897 に答える