你看到的是预期行为。
内容脚本在一个称为隔离世界的特殊环境中执行。它们可以访问注入页面的DOM,但不能访问页面创建的任何JavaScript变量或函数。对于每个内容脚本来说,它运行的页面上似乎没有其他JavaScript在执行。反过来也是一样:在页面上运行的JavaScript不能调用任何由内容脚本定义的函数或访问任何变量。
http://developer.chrome.com/extensions/content_scripts.html#execution-environment
当你在页面、Chrome开发工具控制台或注入的脚本运行
console.info(myVar);
时,它在页面上下文中运行,因此可以看到定义的变量。
然而,当从扩展程序代码内部运行相同的代码时,您正在操作完全不同的环境,因此
myVar
未定义。
您可以尝试使用共享DOM解决此问题。
http://developer.chrome.com/extensions/content_scripts.html#host-page-communication
编辑:
除非有人纠正我,否则下面的
console.info(myVar);
代码被注入到
script
元素中,同时仍在扩展程序的上下文中执行。
$("<script />", {
html: "console.info(myVar);"
});
一个简单的测试可以通过记录chrome.extension
对象或在contentscript中声明myVar
来运行- chrome.extension
将可用,并且myVar
将被记录为contentscript中定义的内容。
建议使用外部脚本(这也更好地实现了模块化),将其添加到web_accessible_resources
并创建一个带有指向该外部脚本的src
属性的script
元素。
下面是示例扩展代码,在启用扩展的情况下加载test.html页面时会弹出“test”。
manifest.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);
console.info(myVar)
与上述陈述完全相同。这一定是其他原因。 - patchrailscript
元素可以访问页面的变量。但它将在页面的上下文中运行,而不是你的扩展中。 - Oleg