表示されるのは、予期される動作です。
コンテンツ スクリプトは、隔離された世界と呼ばれる特別な環境で実行されます。挿入先のページの 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
宣言することにより、簡単なテストを実行できます。myVar
chrome.extension
myVar
提案は、外部スクリプト (モジュール性にも優れています) を使用し、それを追加して、その外部スクリプトを指すプロパティを持つ要素をweb_accessible_resources
作成することです。script
src
以下の拡張コードの例では、拡張機能を有効にして 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);