Greasemonkey 用户脚本未正确加载

Greasemonkey userscript is not loading properly

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

// ==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 语言解释,它是从 @require 语句导入的,使用 ngn's javascript APL interpreter.

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

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

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

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

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

所需的代码