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()
。在此示例中,我们对其进行编辑以添加 运行.
所需的代码
我目前正在制作一个用户脚本来解释 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()
。在此示例中,我们对其进行编辑以添加 运行.