Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

298
Vistas
How to remove generated node on page

I'm creating a node manually using vanilla JS. The idea is this alert appears after an input field if the maxlength limit has been reached and is removed if it returns below. This is being used on a CMS that users can use to create forms dynamically, so I won't know if the field will have a maxlength or not, or if it will have anything else after it. I'm using the following code:

document.querySelectorAll('input, textarea').forEach(element => {
    if (element.hasAttribute('maxlength')) {
        let maxChars = element.getAttribute('maxlength');
        let elID = element.getAttribute('id');
        let charWarning = document.querySelectorAll('#' + elID + ' + .char-limit');

        element.addEventListener('input', () => {
            let inputLength = element.value.length;

            console.log(inputLength);

            if (inputLength >= maxChars) {
                if (charWarning.length == 0) {
                    let divAlert = document.createElement('div');
                    let divAlertText = document.createTextNode(maxChars + ' character limit reached on input');

                    divAlert.classList.add('text-danger', 'char-limit');
                    divAlert.setAttribute('aria-live', 'polite');
                    divAlert.setAttribute('aria-labelledby', elID);
                    divAlert.appendChild(divAlertText);

                    element.insertAdjacentElement('afterend', divAlert);
                    charWarning = document.querySelectorAll('#' + elID + ' + .char-limit');
                }
            } else {
                // console.log(charWarning.length);
                if (charWarning.length > 0) {
                    charWarning.remove(); // This is not working and I have no idea why.
                }
            }
        });
    }
});

For whatever reason, the .remove() function isn't working. It's throwing an error:

charWarning.remove is not a function at HTMLTextAreaElement

I don't really understand this. I thought it might be down to the fact that the initial setting of the charWarning prior to the listener was static, so I've added it again at the end of the function creating the warning element. It all works fine, but it's not removing the warning when below the maxlength and throwing that error.

For info, the commented out console.log:

// console.log(charWarning.length);

When uncommented does return 1, when the node has been added.

Can anyone point to what I'm doing wrong?

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Ok, so after 2 days of no real responses, I took a late night stab at this again and somehow figured it out through trial and error. I thought the issue was to do with scoping but I couldn't figure out WHAT scope. In the end, I tried changing the "let" to "var" on the warning and that didn't work. So then I changed the selector from document.querySelectorAll to document.querySelector, cleaned up a little of the code and removed the else by using conditional chaining and voilà... result! Much cleaner, much better (and most importantly) functioning code...

However, on researching the properties of aria-live="polite" I discovered that creating and removing the node is the incorrect process. I can create it but when I want to update it for assistive technologies, it's the content I need to change. This kinda goes back to @ZainWilson-WCHStudent's first comment about showing and hiding the content. While I'm still not doing this as I believe it is incorrect for accessibility, it does kind of lean on that idea. I believe that this solution is much more elegant, efficient and (most importantly) accessible:

document.querySelectorAll("input, textarea").forEach((e) => {
  if (e.hasAttribute("maxlength")) {
    let maxChars = e.getAttribute("maxlength");
    let elID = e.getAttribute("id");
    
    let divAlert = document.createElement("div");
    let divAlertText = document.createTextNode(
            maxChars + " character limit reached on input"
          );

    divAlert.classList.add("text-danger", "char-limit");
    divAlert.setAttribute("aria-live", "polite");
    e.insertAdjacentElement("afterend", divAlert);
    
    e.addEventListener("input", () => {
      let charWarning = document.querySelector("#" + elID + " + .char-limit");
      let inputLength = e.value.length;
      
      if (inputLength >= maxChars) {
        charWarning.appendChild(divAlertText);
      } else {
        if(charWarning.firstChild) {
          charWarning.removeChild(charWarning.firstChild);
        }
      }
    });
  }
});

Here's a Codepen to test: https://codepen.io/tadywankenobi/pen/OJQXwwR

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda