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 arreglo code:

    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