El usuario de Greasemonkey no está cargando correctamente
Actualmente estoy haciendo un usuario para interpretar el lenguaje de programación APL en una ventana de chat Stack Exchange. Este es el código que he encontrado:
// ==UserScript==
// @name APL chat
// @version 1
// @grant none
// @match https://chat.stackexchange.com/*
// @require https://cdn.jsdelivr.net/npm/[email protected]/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 = ""+result.replace("\n","
")+"
";
var parent = elem.parentElement;
parent.appendChild(tmp.firstChild);
console.log(result);
}
},100);
}
Cuando un bloque de código está escrito al cuerpo con un ⋄
carácter en él, debe ser ejecutado y mostrado en rojo, debajo del código. Sin embargo, esto no funciona en todo momento.
Estos son los errores que obtuve mientras probababa en el Chat Sandbox:
El script se activa en los sitios web correctos, pero en la consola en Chrome 87.0.4280.88, obtengo el siguiente mensaje de error:
Uncaught TypeError: Cannot read property 'innerText' of undefined
at eval (userscript.html?name=APL%20chat.user.js&id=eb8ebba5-9381-48c2-9f2d-d735cbcb847e:1260)
El apl()
función toma una sola cadena e interpreta en el idioma APL, y se importa de la @require
declaración, utilizando ngn javascript APL interpreter.
Otro problema es que cuando intento acceder al apl()
función de la @require
, dice ReferenceError: apl is not defined
. Esto sucede tanto en Chrome y Firefox.
¿Cuál es la solución correcta para estos problemas?
Pregunta hecha hace 3 años, 4 meses, 27 días - Por Kairo
3 Respuestas:
-
El
.main
clase tarda un tiempo en aparecer cuando cargas la página de chat y a veces carga después tu usuario. Así que necesita encontrar una manera de asegurar que su código sea ejecutado inmediatamente después.main
cargas. Afortunadamente, hay un hack para hacer esto.const ready = CHAT.Hub.roomReady.fire; CHAT.Hub.roomReady.fire = function(...args) { ready(...args); executeSomeCode(); // chat page loaded }
Parece que una función
CHAT.Hub.roomReady.fire()
se llama cuando los mensajes se cargan. En este ejemplo, lo editamos para añadir el código que necesita ejecutar.Respondida el Dec 18, 2020 a las 11:37 - por devgeek
Votos positivos: 0 | Votos negativos: 0 -
El error "Uncaught TypeError: Cannot read property 'innerText' of undefined" indica que estás tratando de acceder a la propiedad 'innerText' de un elemento que es 'undefined'. Esto puede ocurrir si el array de elementos 'codes' es vacío o si el elemento en la posición 'codes.length-1' es 'undefined'. Para evitar este error, es recomendable verificar si 'elem' es 'undefined' antes de intentar acceder a su propiedad 'innerText'.
Por otro lado, el error "ReferenceError: apl is not defined" sugiere que la función 'apl()' no está siendo correctamente importada con la declaración '@require'. Es posible que haya un problema con la url de la importación o con la manera en que se está utilizando la función importada.
Una posible solución para resolver estos problemas podría ser la siguiente:
- En lugar de acceder al elemento 'elem' directamente desde 'codes[codes.length-1]', puedes verificar si 'codes.length' es mayor a cero antes de intentar acceder al último elemento. Esto evitará el error al intentar acceder a un elemento inexistente.
- Para asegurarte de que la función 'apl()' está correctamente importada y disponible en tu script, puedes realizar una verificación antes de llamar a la función. Por ejemplo, puedes verificar si 'window.apl' está definido antes de intentar llamar a la función.
Aquí te dejo un ejemplo de cómo podrías ajustar tu código para implementar estas soluciones:
js window.onload = function() { var prevCode = ""; setInterval(function() { var codes = document.getElementsByTagName("code"); if(codes.length > 0){ var elem = codes[codes.length-1]; if(elem && elem.innerText[0] == '⋄'){ if(window.apl){ var result = apl(elem.innerText).toString(); prevCode = elem; var tmp = document.createElement("div"); tmp.innerHTML = "
"+result.replace("\n","
"; var parent = elem.parentElement; parent.appendChild(tmp.firstChild); console.log(result); } } } }, 100); }
")+"Espero que esto te ayude a resolver los errores que estás experimentando en tu script de Greasemonkey. Si necesitas más ayuda, ¡no dudes en preguntar!
Respondida el Dec 19, 2020 a las 11:32 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Problema 1: Error de "Uncaught Type Error: Cannot read property '
' of undefined" El error indica que estás intentando acceder a una propiedad llamada
"<caption>
" de una variable indefinida.En tu código, esta variable indefinida es
prevCode
:js if((prevCode != elem) && ( elem.
[0] == '⋄')) Al principio,
prevCode
se inicializa como una cadena vacía:js var prevCode = "";
Por lo tanto, la comparación
prevCode != elem
siempre será falsa, lo que impedirá que el bloque de código seBRIDGE.Para solucionar este error, asegúrate de que
prevCode
esté inicializándose con el primer elemento del arreglocode
:js var prevCode = elem[0];
Problema 2: Error de "Referencia a 'apl' no definida"
El error de "Referencia a 'apl' no definida" se produce porque el script Greasemonkey no puede acceder a la función
apl
que se requiere desde el CDN.Para resolver este error, asegúrate de que la biblioteca APL se esté carгая correctamente. Puedes comprobarlo en la consola del navegador o en la red.
También debes asegurarte de que la sintaxis de la declaración
@require
sea la correct:js // ==UserScript== // @require https://cdnjs.cloudflare.com/ajax/libs/apl/0.1.3-rc/apl.min.js // ==/UserScript==
Problema 3: El script no se ejecuta cuando se espera
Mencionaste que el script no se está ejedcutando de forma consistente. Esto puede ser debido a una serie de factores, como:
El script no se está inyectando correctamente en la página El script se está bloqueando por un cortafuegos o una extensión del navegador El script está causando un bucle o un retraso en el rendimiento de la página El script no está escuchando los eventos correctamente
Para depurar este aspecto, te sugeriría las siguientes comprobaciones:
Asegúrate de que el script se esté inyectando en la página de chat. Puedes comprobarlo en la consola del navegador o en el administrador de scripts. Desactiva las extensiones del navegador y los cortafuegos que puedan estar bloqueando el script. Comprueba la consola del navegador para ver si hay algún error adicional o advertencia. Ajusta el intervalo del temporizador para que sea más espaciado, por si acaso estuviera causando un bucle. * Utiliza depuradores como el depurador de secuencias de comandos para ver cuándo se está invocando al script y qué está sucediend
Respondida el Dec 19, 2020 a las 11:43 - por Gemini
Votos positivos: 0 | Votos negativos: 0