如何使用 (GreaseMonkey) 用户脚本查找和访问 'window' 的 JavaScript 属性 ('Blazor')?
How can I find and access a JavaScript property ('Blazor') of 'window' with a (GreaseMonkey) user script?
使用以下 (GreaseMonkey) 用户脚本,我试图找到(并稍后访问)一个 JavaScript 对象(即 'Blazor'):
// ==UserScript==
// @name Test
// @version 1
// @grant none
// @run-at document-end
// ==/UserScript==
window.addEventListener ("load", doStuff);
function doStuff() {
setTimeout(function() {
console.log("window.hasProperty('Blazor'): " + window.hasOwnProperty("Blazor"));
console.log("'Blazor' in window: " + ('Blazor' in window));
console.log(window);
}, 2000);
}
当我 运行 脚本(即重新加载页面)时,我在 Firefox 的控制台中得到以下输出:
所以window.Blazor
找不到。但是,当我检查(单击)window
对象时,我可以看到 Blazor
属性:
也在控制台中调用 'Blazor' in window
returns true
.
为什么 window
的 属性 还不可用?我该如何找到和访问它?
更新:
基于 我尝试了以下方法:
function doStuff() {
console.log("<doStuff>");
var promise = new Promise(function(resolve, reject) {
var interval = setInterval(function() {
console.log("checking for Blazor");
if ('Blazor' in window) {
console.log("Blazor found");
clearInterval(interval);
resolve(window.Blazor);
}
}, 1000);
});
promise.then(successCallback, failureCallback);
console.log("</doStuff>");
}
function failureCallback(error) {
console.log("failure: " + error);
}
function successCallback(result) {
console.log("success: " + result);
}
结果如下:
因此无限期地调用了 Blazor 的函数检查,但没有成功找到它。
您可以使用 setInterval 和 promise 测试变量
function doStuff() {
var promise = new Promise(function(resolve, reject) {
var interval = setInterval(function() {
if(window.Blazor || window.hasOwnProperty('Blazor')) {
clearInterval(interval);
resolve(window.Blazor);//rezolve promise with the balzor variable
}
}, 200);//check every 200ms for the blazor variable
})
promise.then(function(blazor) {
console.log(blazor);//do other stuf with the blazor variable
})
}
解决方案是使用 script injection,因为 GreaseMonkey 脚本在另一个上下文中运行,因此获得另一个 window
对象。
更准确地说,将函数 doStuff
附加到 that answer (addJS_Node (null, null, doStuff);
) 中定义的 addJS_Node
,而不是使用 window.addEventListener ("load", doStuff);
。
使用以下 (GreaseMonkey) 用户脚本,我试图找到(并稍后访问)一个 JavaScript 对象(即 'Blazor'):
// ==UserScript==
// @name Test
// @version 1
// @grant none
// @run-at document-end
// ==/UserScript==
window.addEventListener ("load", doStuff);
function doStuff() {
setTimeout(function() {
console.log("window.hasProperty('Blazor'): " + window.hasOwnProperty("Blazor"));
console.log("'Blazor' in window: " + ('Blazor' in window));
console.log(window);
}, 2000);
}
当我 运行 脚本(即重新加载页面)时,我在 Firefox 的控制台中得到以下输出:
所以window.Blazor
找不到。但是,当我检查(单击)window
对象时,我可以看到 Blazor
属性:
也在控制台中调用 'Blazor' in window
returns true
.
为什么 window
的 属性 还不可用?我该如何找到和访问它?
更新:
基于
function doStuff() {
console.log("<doStuff>");
var promise = new Promise(function(resolve, reject) {
var interval = setInterval(function() {
console.log("checking for Blazor");
if ('Blazor' in window) {
console.log("Blazor found");
clearInterval(interval);
resolve(window.Blazor);
}
}, 1000);
});
promise.then(successCallback, failureCallback);
console.log("</doStuff>");
}
function failureCallback(error) {
console.log("failure: " + error);
}
function successCallback(result) {
console.log("success: " + result);
}
结果如下:
因此无限期地调用了 Blazor 的函数检查,但没有成功找到它。
您可以使用 setInterval 和 promise 测试变量
function doStuff() {
var promise = new Promise(function(resolve, reject) {
var interval = setInterval(function() {
if(window.Blazor || window.hasOwnProperty('Blazor')) {
clearInterval(interval);
resolve(window.Blazor);//rezolve promise with the balzor variable
}
}, 200);//check every 200ms for the blazor variable
})
promise.then(function(blazor) {
console.log(blazor);//do other stuf with the blazor variable
})
}
解决方案是使用 script injection,因为 GreaseMonkey 脚本在另一个上下文中运行,因此获得另一个 window
对象。
更准确地说,将函数 doStuff
附加到 that answer (addJS_Node (null, null, doStuff);
) 中定义的 addJS_Node
,而不是使用 window.addEventListener ("load", doStuff);
。