Javascript “chrome扩展抛出”;“未定义”;关于定义变量

Javascript “chrome扩展抛出”;“未定义”;关于定义变量,javascript,google-chrome-extension,Javascript,Google Chrome Extension,我正在尝试使用chrome扩展访问本地变量。 在页面脚本中尝试console.info(myVar)时,我发现myVar未定义 然而,当使用chrome开发者工具并在调试控制台中执行相同的代码段时,我得到了myVar的全部内容 尝试访问window.myVar时的行为相同,在通过chrome扩展打印时,它只是未定义 通过dev工具和页面脚本,使用下面的代码片段将脚本标记注入到主体中,会产生完全相同的行为 $("body").append($("<script />", {

我正在尝试使用chrome扩展访问本地变量。 在页面脚本中尝试
console.info(myVar)
时,我发现
myVar未定义

然而,当使用chrome开发者工具并在调试控制台中执行相同的代码段时,我得到了myVar的全部内容

尝试访问
window.myVar
时的行为相同,在通过chrome扩展打印时,它只是
未定义

通过dev工具和页面脚本,使用下面的代码片段将脚本标记注入到主体中,会产生完全相同的行为

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

变量在dev tools中执行时被打印出来,但在pagescripts中出现javascript错误,您看到的是预期行为

内容脚本在称为隔离脚本的特殊环境中执行 世界。他们可以访问他们被注入的页面的DOM, 但是,不适用于页面创建的任何JavaScript变量或函数。 对于每个内容脚本,它看起来就像没有其他JavaScript一样 在运行它的页面上执行。反之亦然: 页面上运行的JavaScript无法调用任何函数或访问任何 由内容脚本定义的变量

当您运行
console.info(myVar)时从Chrome开发工具的控制台页面或从注入的脚本,它在页面的上下文中运行,因此可以看到定义的变量

但是,当从扩展代码内部运行相同的代码时,您是在完全不同的环境中运行的,因此
myVar
是未定义的

您可以使用共享DOM解决此问题。

编辑 除非有人纠正我,
console.info(myVar)下面的代码被注入
脚本
元素,同时仍在扩展的上下文中执行:

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

myscript.js(这是将在页面上下文中运行的外部脚本)

我在一次调查中发现了问题的根源

我尝试使用以下代码段注入脚本:

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

将脚本标记注入页面正文(执行
console.info(myVar)
的结果可能与上述结果完全相同。这一定是其他原因。但是,通过chrome开发工具注入将打印变量时不会出现任何问题。“内容脚本有一些限制。它们不能:[…]使用由网页或其他内容脚本定义的变量或函数“通过直接访问,是的。将脚本直接注入页面正文应该可以很好地工作,但这并不能解释为什么注入的脚本标记无法看到pages变量,即使它是在pages上下文中执行的-通过开发工具注入也可以很好地工作。请参见上面的编辑是的。另外,页面本身附带jQuery,您确定吗这是同一个错误?不是“未捕获引用错误:$未定义”之类的错误?100%确定。另外,在通过pagescript和开发工具注入的脚本标记打印时,发现即使窗口对象也与某些属性不同。我没有想法。在我这方面,注入脚本和记录虚拟
myVar
变量(我不使用jQuery)绝对没有问题。可能您在创建
myVar
之前正在运行扩展代码?
<!DOCTYPE html>
<html>
<head>
    <script>
        window.test = 'test';
    </script>
</head>
<body>
</body>
</html>
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = chrome.extension.getURL('myscript.js');
document.getElementsByTagName('head')[0].appendChild(script);
alert(window.test);
   $("body").append($("<script />", {
      html: "console.info(myVar);"
   }));
var g = document.createElement('script'); 
var s = document.getElementsByTagName('script')[0]; 
g.text = "console.info(myVar);" 
s.parentNode.insertBefore(g, s);