我正在尝试在window.onLoad()
的脚本中访问窗口级变量,但它总是返回undefined
。但是当我控制台登录或尝试只在调试控制台中键入window
时,它清楚地向我显示window
对象上存在的变量并且具有值。我不清楚为什么会这样,有没有办法访问它?如果我做错了什么并请指出正确的方向,请纠正我。非常感谢任何帮助。
更新:window._vp
变量在某个实时网站的脚本中声明,我尝试使用我的chrome扩展程序访问该特定变量。
我的剧本:
window.onload = _ => {
console.log("window._vp is:", window._vp);
}
网站脚本:
var _vp = {};
_vp['IsDashAvailable'] = false;
//...
谢谢。
答案 0 :(得分:2)
我认为这是您的扩展程序隔离上下文的问题,详见另一个SO post about Context isolation同样面临相同问题的人。
您应该尝试从其他答案引用的以下方法:
对于大量代码,引用字符串是不可行的。可以使用函数,而不是使用数组,并使用字符串化:
var actualCode = '(' + function() {
// All code is executed in a local scope.
// For example, the following does NOT overwrite the global `alert` method
var alert = null;
// To overwrite a global variable, prefix `window`:
window.alert = null;
} + ')();';
var script = document.createElement('script');
script.textContent = actualCode;
(document.head||document.documentElement).appendChild(script);
script.remove();
此方法有效,因为字符串上的+运算符和函数会将所有对象转换为字符串。如果您打算不止一次使用代码,那么创建一个函数以避免代码重复是明智的。实现可能如下所示:
function injectScript(func) {
var actualCode = '(' + func + ')();'
...
}
injectScript(function() {
alert("Injected script");
});
注意:由于函数是序列化的,原始范围和所有绑定属性都将丢失!
var scriptToInject = function() {
console.log(typeof scriptToInject);
};
injectScript(scriptToInject);
// Console output: "undefined"