我试图通过我的谷歌浏览器扩展程序使用content.js脚本访问网页上的全局变量(计时器)。 但是,每次返回undefined时,即使我可以通过开发人员控制台轻松访问它。
var mySocket;
console.log('content.js');
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
switch(request.task){
case "socketInjection":
window.setTimeout(
function(){ console.log(timer);}, 5000);
break;
}
});
我在那里使用了一个setTimeout例程,以确保页面已经完全加载(无论如何都应该这样)。
任何人都有解决方案吗? 提前谢谢,丹尼尔
答案 0 :(得分:1)
扩展程序和内容脚本都具有与页面不同的全局范围,因此如果页面上的扩展名或中有timer = 5
之类的内容,那么就是& #39;在内容脚本中可见。
见
https://developer.chrome.com/extensions/content_scripts
但是,内容脚本有一些限制。他们不能:
- 使用其扩展程序页面定义的变量或函数
- 使用由网页或其他内容脚本定义的变量或函数
这个答案讨论了一些选择:
Share in-memory objects in Chrome extension content scripts?
答案 1 :(得分:0)
我误解了content.js
的上下文内容脚本在称为隔离的特殊环境中执行 世界。他们可以访问他们注入的页面的DOM, 但不是页面创建的任何JavaScript变量或函数。 它将每个内容脚本视为没有其他JavaScript 在正在运行的页面上执行。反过来也是如此: 页面上运行的JavaScript无法调用任何函数或访问任何函数 由内容脚本定义的变量。
隔离世界允许每个内容脚本对其进行更改 JavaScript环境无需担心与之冲突 页面或其他内容脚本。例如,内容脚本 可能包括JQuery v1,页面可能包含JQuery v2,以及它们 不会相互冲突。
孤立世界的另一个重要好处是它们完全 将页面上的JavaScript与扩展中的JavaScript分开。 这允许我们为内容脚本提供额外的功能 不要在网页上访问,而不必担心网页 访问它的页面。