Chrome扩展:Chrome扩展中未定义的变量,即使它存在于控制台中

Chrome extensions: variable undefined in chrome extension even though it exists in console

本文关键字:Chrome 扩展 存在 控制台 变量 未定义      更新时间:2023-09-26

在我的chrome扩展的内容脚本中,一旦外部js文件加载完成,我就会将其动态加载到html页面上。我加载的这个js文件将定义一个名为rfk的变量。我有一个设置的Interval,用于定义rfk时,它将执行脚本。然而,即使在成功加载页面后,我的内容脚本也永远找不到要定义的rfk,即使我可以通过浏览器控制台检查并发现rfk存在。

"content_scripts": [
    {
        "matches": ["*://www.att.com/*"],
        "js": ["att.js"],
        "run_at":"document_end"
    }
]

这是我在att.js文件中的代码片段:

alert('hey!');
document.body.style.backgroundColor="red";
var url="//product.reflektion.com/rfk/js/11165-52846072/init.js?cv=test&q="+(new Date).getTime()
, o = document, s = o.createElement("script");
s.type="text/javascript";
s.src=url;
o.getElementsByTagName("head")[0].appendChild(s);
var cE = setInterval(function(){
    rfk && (demo="instagram",rfk.P.fs.rw.extra_args={drsp:{_v:demo}},rfk.rebuild(),clearInterval(cE))
},100);

孤立世界问题。

内容脚本在一个称为孤立世界的特殊环境中执行。他们可以访问被注入页面的DOM,但不能访问页面创建的任何JavaScript变量或函数。它查看每个内容脚本,就好像在它运行的页面上没有其他JavaScript执行一样。反过来也是如此:在页面上运行的JavaScript无法调用任何函数或访问内容脚本定义的任何变量。

您的内容脚本将永远看不到页面定义的变量。在控制台中,您(默认情况下)查看页面的上下文,而不是内容脚本的上下文。您可以(在<top frame>下拉菜单中)将其切换为测试。

您需要注入一个页面级脚本来使用页面自己的JS执行任何操作。