使用以下(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也会返回true。
为什么window的这个属性还没有(还)?可用,我如何才能找到和访问它?
更新:
基于madalinivascu's answer,我尝试了以下几点:
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的函数检查被无限期地调用,但没有成功地找到它。
发布于 2021-06-17 11:11:12
解决方案是使用script injection,因为GreaseMonkey脚本在另一个上下文中运行,从而获得另一个window对象。
更确切地说,将函数doStuff附加到that answer (addJS_Node (null, null, doStuff);)中定义的addJS_Node函数中,而不是使用window.addEventListener ("load", doStuff);。
发布于 2021-06-17 07:30:34
您可以使用setInterval和承诺来测试变量
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
})
}https://stackoverflow.com/questions/68014069
复制相似问题