首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用( JavaScript )用户脚本查找和访问“GreaseMonkey”的“窗口”属性(“Blazor”)?

如何使用( JavaScript )用户脚本查找和访问“GreaseMonkey”的“窗口”属性(“Blazor”)?
EN

Stack Overflow用户
提问于 2021-06-17 06:30:33
回答 2查看 229关注 0票数 0

使用以下(GreaseMonkey)用户脚本,我试图查找(以及稍后访问)一个JavaScript对象(即'Blazor'):

代码语言:javascript
复制
// ==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,我尝试了以下几点:

代码语言:javascript
复制
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的函数检查被无限期地调用,但没有成功地找到它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-17 11:11:12

解决方案是使用script injection,因为GreaseMonkey脚本在另一个上下文中运行,从而获得另一个window对象。

更确切地说,将函数doStuff附加到that answer (addJS_Node (null, null, doStuff);)中定义的addJS_Node函数中,而不是使用window.addEventListener ("load", doStuff);

票数 1
EN

Stack Overflow用户

发布于 2021-06-17 07:30:34

您可以使用setInterval和承诺来测试变量

代码语言:javascript
复制
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
    })    
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68014069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档