【问题标题】:Greasemonkey userscript is not loading properlyGreasemonkey 用户脚本未正确加载
【发布时间】:2021-03-29 01:27:07
【问题描述】:

我目前正在制作一个用户脚本来解释 Stack Exchange 聊天窗口中的 APL 编程语言。这是我想出的代码:

// ==UserScript==
// @name     APL chat
// @version  1
// @grant    none
// @match    https://chat.stackexchange.com/*
// @require  https://cdn.jsdelivr.net/npm/apl@0.1.15/lib/apl.min.js
// ==/UserScript==

window.onload = function() {
  var prevCode = "";
  setInterval(function() {
    var codes=document.getElementsByTagName("code");
      //console.log(codes);
    var elem = codes[codes.length-1];
    if((elem != prevCode) && (elem.innerText[0] == '⋄')){
        var result = apl(elem.innerText).toString();
        prevCode = elem;
        var tmp = document.createElement("div");
        tmp.innerHTML = "<pre style=\"color:red\">"+result.replace("\n","<br>")+"</pre>";
        var parent = elem.parentElement;
        parent.appendChild(tmp.firstChild);
            console.log(result);
    }
    },100);
}

当一个代码块被写入带有 字符的主体时,它应该被执行并在代码下方显示为红色。但是,这并不总是有效。

这些是我在Chat Sandbox 中测试时遇到的错误:

脚本在正确的网站中打开,但在 Chrome 87.0.4280.88 的控制台中,我收到以下错误消息:

Uncaught TypeError: Cannot read property 'innerText' of undefined
    at eval (userscript.html?name=APL%20chat.user.js&id=eb8ebba5-9381-48c2-9f2d-d735cbcb847e:1260)

apl() 函数采用单个字符串并以 APL 语言进行解释,并使用 ngn's javascript APL interpreter@require 语句导入。

另一个问题是,当我尝试从@require 访问apl() 函数时,它显示ReferenceError: apl is not defined。这在 Chrome 和 Firefox 上都会发生。

这些问题的正确解决方法是什么?

【问题讨论】:

  • 您能否提供一个最小的可重现示例 innerText 错误?什么是失败的示例聊天消息?如果您将整个代码减少到 console.log(codes[codes.length-1].innerText),它仍然会以同样的方式失败吗?排除 @require apl.min.js 后是否仍然失败?
  • 对不起,我错误地赏金了。此版本已使用更好的算法进行了修复。 This is the current problem I need help with.

标签: javascript google-chrome firefox tampermonkey


【解决方案1】:

.main 类在您加载聊天页面时需要一些时间才会出现,有时它会在您的用户脚本之后加载。因此,您需要找到一种方法来确保您的代码在.main 加载后立即执行。幸运的是,有一个 hack 可以做到这一点。

const ready = CHAT.Hub.roomReady.fire;
CHAT.Hub.roomReady.fire = function(...args) {
  ready(...args);
  executeSomeCode(); // chat page loaded
}

似乎在消息加载时调用了函数CHAT.Hub.roomReady.fire()。在此示例中,我们对其进行编辑以添加需要运行的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    相关资源
    最近更新 更多