Manipulacion del DOM
La manipulacion del DOM ocurre cuando utilizamos un lenguaje de programacion para interactuar de forma dinamica con un documento de HTML mediante el WEB API que ofrecen los navegadores.
Utilizando JavaScript existen muchas formas de manipularlo. Aqui algunas de ellas.
# Seleccionar elementos
Hay una forma especial de seleccionar todo el documento
# documentElement
Es un elemento especial del objeto document que sirve para seleccionar todo el documento HTML.
# document.head
Te permite seleccionar el head del HTML
# document.body
Te permite seleccionar el body del HTML
# querySelector()
Primeramente debemos obtener el objeto del documento html, y posteriormente llamar al metodo especial querySelector().
En el parametro del metodo querySelector debemos colocar un selector de la misma forma que lo hacemos en CSS. Un .nombre para clases un #nombre para los IDs, etc etc.
| |
# Propiedades de un Elemento
Recordemos que se maneja en estructura de arbol, por tanto, debemos especificar que parte del objeto con clase ’texto’ queremos, en este caso, veamos su contenido textual:
# .textContent
| |
Aparte de poder leerla, tambien podemos sobreescribirla como si fuera una variable:
| |
# Funciones de un Elemento
Como sabemos ahora, los elementos de un objeto no solo son propiedades, si no que tambien pueden ser metodos!. Por eso, tras seleccionar una etiqueta del documento podemos agregarle cosas como un escuchador de eventos para reaccionar a lo que hace el usuario.
# querySelectorAll()
Tiene las mismas funciones y propiedades que querySelector solo que, en vez de seleccionar al primero, selecciona todos los elementos con el selector especificado y devuelve un NodeList (que funciona como un Arrays en JavaScript) con ellos dentro.
# getElementById
Recibe un id de un elemento del documento y lo devuelve. Tiene que ser un id especificamente
# getElementsByTagName
Recibe una etiqueta y te devuelve un HTMLCollection con todos los elementos que sean de esa etiqueta.
Un HTML Collection es afectada en tiempo real por cambios en el DOM
# getElementsByClassName
Recibe una clase y devuelve un HTMLCollection con todos los elementos que contengan ese nombre de clase.
# Crear e Insertar elementos
# insertAdjacentHtml()
Sirve para insertar html antes, dentro, antes de terminar y despues de la etiqueta de cierre de un elemento html, de esta forma, podemos agregar de manera dinamica elementos al DOM.
| |
# createElement()
Recibe el nombre de una etiqueta y retorna el elemento que peude ser agregado al DOM en cualquier punto.
La ventaja esque podemos modificar e ir agregando elementos conforme nos vaya pareciendo. Agregar clases, agregar otros elementos, agregar HTML, agregar estilos y todo lo que se puede modificar de un elemento HTML
# prepend()
Agrega un elemento HTML al inicio de la etiqueta (tras solo realizarla)
# append()
Agrega un elemento HTML como ultimo elemento de un contenedor
# cloneNode
Se puede aplicar con un elemento HTML y sirve para realizar una shallow y deep copy de un elemento. Necesario debido a la inmutabilidad de los elementos.
# before()
Inserta un elemento HTML antes de otro elemento HTML sobre el que se especifica el elemento
# after()
Inserta un elemento HTML despues de otro elemento HTML sobre el que se especifica el elemento
# Remover elementos
# remove()
Sirve para remover un elemento del DOM de HTML. Lo borra completamente
# Estilos
Para poder asignar los estilos tenemos que tener seleccionado un elemento utilizando cualquiera de los selectores disponibles.
# Inline
Tambien podemos cambiar los estilos de cualquier elemento de forma dinamica, esto se hace accediendo a la propiedad .style. Una vez hecho esto solo nos queda especificar una propiedad de CSS por cambiar:
| |
# Clases
Otra forma (y la mas utilizada) de modificiar los estilos de una pagina web es agregar, remover y modificar las clases de un elemento, de esta forma, podemos agregar y remover un grupo de caracteristicas del elemento que busquemos.
Para esto, cada elemento del documento cuenta con un objeto especial llamado classList que sirve para referirse al atributo de clases de la etiqueta HTML.
| |
En este caso, si en el archivo CSS existen propiedades para la clase ‘hidden’ se aplicaran al elemento de forma dinamica.
# getComputedStyle
Es una funcion integrada que sirve para obtener los estilos computados de un elemento
| |
# CSS Variables
Tambien es posible cambiar las variables CSS que son definidas en un archivo es estilos.
| |
Para hacerlo, debemos acceder al documento root y cambiar esa propiedad. En JavaScript se haria utilizando la funcion setProperty.
| |
# Atributos
Para cambiar los atributos de una etiqueta de HTML, primero se necesita elegirla utilizando cualquiera de los selectores.
# Como propiedades
Estos se encuentran definidos como propiedades de cualquier elemento HTML, por tanto, pueden ser accedidas utilizando la sintaxis del .
| |
Sin embargo, esto solo nos permite leer las propiedades que son esperadas de un elemento, por tanto, todos los atributos que no sean respectivos a un elemento no funcionaran de esta forma.
Esta sintaxis nos permite sobreescribir los valores de los atributos.
| |
# Metodos getAttribute y setAttribute
Existe un metodo especial de cualquier elemento HTML que nos sirve para obtener un atributo aun cuando este no es parte estandar de los elementos definidos para esa etiqueta en particular.
| |
Como es logico, el metodo setAttribute nos permite colocar valores y atributos a un elemento
| |
# dataSet
Esta propiedad solo es aplicable para los data attributes que se pueden definir en un documento HTML.
| |
| |
# Eventos
Un evento señaliza la ocurrencia de algo en el UI, el ejemplo mas comun es una interaccion con el usuario
Un EventListener nos sirve para escuchar un elemento y hacer algo con el. No cambia la ocurrencia de un evento, solo cambia la respuesta que tiene el codigo respecto a el.
# addEventListener
Veamos un boton que al ser presionado actualiza el valor de nuestra etiqueta texto mediante el metodo .addEventListener:
| |
El primer parametro de este metodo es el tipo de evento al que esta escuchando y el segundo la expresion funcional (funcion anonima) que ejecutara cuando sea detectado. En este caso utilice una arrow function.
# Informacion sobre el Evento
Es posible obtener informacion detallada sobre el evento en forma de un objeto, esto se hace poniendo un parametro dentro de la expresion funcional del eventListener:
| |
# Eventos en el Teclado
Una de las funcionalidades mas basicas es interactuar con el usuario mediante el teclado, en una pagina web, se puede hacer mediante un eventListener.
Al tratarse del teclado, se debe declarar como un event global. Es decir, que ocurriran sin importar en que parte o momento de la pagina nos encontremos porque se encuentra embebido dentro del documento.
Veamos un ejemplo:
| |
# onEvent
Existe una propiedad especial para cada uno de los eventos disponibles en un elemento de HTML. Este recibe la sintaxis especial ‘onX’ donde X es el nombre del evento, ejemplos:
| |
Es una forma legacy de setear un evento, solo permite a una funcion ejecutarse por propiedad
# removeEventListener
Sirve para remover un event listener de ocurrir. Nos sirve para remover un comportamiento basado en otro evento.
# DOM Traversing
Es una tecnica que sirve para viajar en el DOM de forma dinamica basado en los elementos de una pagina web.
# querySelector
Esta funcion tambien puede ser ejecutada sobre un elemento (Nodo) para buscar dentro de sus hijos
# childNodes
Te sirve para visualizar una lista de nodos (elementos) que estan contenidos dentro de otro elemento.
# children
Cumple la misma funcion que childNodes pero esta te devuelve un HTMLCollection (mutable), es decir que todos los cambios realizados a estos elementos mantendran la lista actualizada en tiempo real.
Esta solo funciona para hijos directos, no a ningun anidado
# firstElementCild
# lastElementChild
# parentNode
Sirve para obtener el padre inmediato del elemento
# parentElement
Sirve para obtener tambien el padre in mediato del elemento
# closest
Sirve para buscar un elemento entre los padres de un elemento
# previousElementSibling
# nextElementSibling
# previousElement
# nextElement
# Intersection Observer API
Es una API que sirve para que el codigo reaccione a los cambios cuando un contenedor o elemento intercepte con otro ocon el viewport
Esta API sigue el paradigma orientado a objetos. Por tanto, debemos instanciar un nuevo IntersectionObserver
| |
Mediante el metodo observe podemos especificar al elemento que tiene que observar
Al constructor se le puede pasar una funcion de callback y unas opciones.
Las opciones disponibles son:
- root. Elemento con el que se debe interseptar (Puede ser null, esto significa que va a interceptar el viewport)
- threshold. Cuanto % del elemento debe estar dentro del root para que se active la callback function.
# Eventos Interesantes
# DOMContentLoaded
Se trigerea por el documento cuando el HTML es completamente cargado, es decir, descargado y convertido en el dom tree.
# Load
Se trigerea por el window no solo cuando el HTML carga sino cuando carga trodan las imagenes, los scripts, y todos los elementos de la pagina.
# Beforeunload
Se trigerea por ewl window tambien y representa al evento que ocurre cuando el usuario esta a punto de dejar la pagina.
" estas seguro que quieres dejar la pagina?"
# Integrar JS Code
Para integrar un script de JS tenemos multiples opciones. Ponerla en el head o en el body. Adicionalmente tenemos dos etiquetas especiales las cuales modifican el comportamiento que este tiene

- Async se utiliza para grandes scripts
- Defer se utiliza casi siempre, para cargar de forma asincrona un script y ejecutarlo hasta que se termine de descargar
- Forma normal para soportar navegadores viejos
