Skip to content

T5.13 Capturando elementos

Carga de scripts en navegador

Curso Js - Andros Fenollosa -> 4 modos:

  • El patoso: En el head <script src="app.js"></script> (Éste falla)
  • El clásico: Al final de body (Éste te pierde)
  • El pro: con DOMContentLoaded: js document.addEventListener('DOMContentLoaded', function () { // Aqui va tu código });
  • El moderno: con defer: <script defer src="app.js"></script>

Captura por métodos clásicos

Métodos de búsqueda Descripción Si no lo encuentra...
.getElementById(id) Busca el elemento HTML por su id. Devuelve .
.getElementsByClassName(class) Busca elementos con la clase class. Devuelve [].
.getElementsByName(value) Busca elementos con el atributo name a value. Devuelve [].
.getElementsByTagName(tag) Busca etiquetas HTML tag. Devuelve [].
Fuente: DOM - Manz.dev

Captura por métodos actuales

Método de búsqueda Descripción Si no lo encuentra...
.querySelector(sel) Busca el primer elemento que coincide con el selector CSS sel. Devuelve .
.querySelectorAll(sel) Busca todos los elementos que coinciden con el selector CSS sel. Devuelve [].
Propiedades de elementos HTML Descripción Si está vacío...
.children Devuelve una lista de elementos HTML hijos. []
.parentElement Devuelve el padre del elemento.
.firstElementChild Devuelve el primer elemento hijo.
.lastElementChild Devuelve el último elemento hijo.
.previousElementSibling Devuelve el elemento hermano anterior.
.nextElementSibling Devuelve el elemento hermano siguiente.
Fuente: DOM - Manz.dev

Contenido de elementos

Captura del contenido

  1. Obtener el texto del contenido: document.querySelector(“#id”).textContent (propiedad. Obtiene incluso el texto oculto)
  2. Obtener el contenido como texto (serializado): document.querySelector(“#id”).getHTML() (método)
  3. NO Obtener el contenido como html: ...innerHTML

Captura del valor

El valor de los inputs de los formularios, mediante el atributo .value:

let nombre = document.querySelector('#nombre').value;

SEGUIDAD

Hay otras fórmulas para obtener el mismo resultado, pero NO las utilizaremos en ningún caso.

IMPORTANTE: El empleo de métodos y atributos diferentes a los aquí reflejados son peligrosos ya que permiten el XSS y por tanto su uso implicará automáticamente un cero en cualquier prueba.

Escritura del contenido

Escritura de texto en un elemento:

elemento.textContent = "Hello World!";

O para insertar algo más complejo como html deberemos hacer 2 pasos:

  1. Crear elemento a insertar
  2. Añadirlo a elemento padre
Métodos Descripción Devuelve...
.appendChild(node) Añade como hijo el nodo node. El nodo insertado.
.removeChild(node) Elimina el nodo hijo node. El nodo eliminado.
.replaceChild(new, old) Reemplaza el nodo hijo old por new. El nodo reemplazado.
.insertBefore(new, node) Inserta new antes de node y como hijo del nodo actual. El nodo insertado.
.insertBefore(new, ) Inserta new tras el último nodo hijo. Equivale a .appendChild(). El nodo insertado.
.moveBefore() Idéntico a insertBefore(), manteniendo el estado del elemento.
Fuente: Manz.dev

IMPORTANTE: El empleo de métodos y atributos diferentes a los aquí reflejados son peligrosos ya que permiten el XSS y por tanto su uso implicará automáticamente un cero en cualquier prueba.

Protección frente a XSS

XSS o cross-side scripting...

// Malo: inyección HTML directa
elemento.innerHTML = userInput;

// Bueno: usar textContent
elemento.textContent = userInput;
// o sanitizar
elemento.innerHTML = DOMPurify.sanitize(userInput);

Resumen: Seguridad y Rendimiento en Manipulación de Contenido

Conceptos Principales:

  • textContent es rápido, seguro y adecuado para el 90% de casos
  • innerText provoca reflows porque considera estilos CSS
  • innerHTML parsea HTML y elimina event listeners existentes
  • XSS no solo viene de