Curso de JavaScript desde cero

¿Cómo se maneja el DOM mediante los ID?

Capítulo 50: El manejo de elementos del DOM por ID y las herramientas de desarrollo

Seguimos viendo más cosas sobre el DOM. También vamos a ver las herramientas de desarrolladores para poder manejarlo mejor. Yo estoy utilizando Chrome en las explicaciones. En la mayoría de navegadores es parecido. Si tienes dudas utilizando otro navegador, déjame un comentario.

Copia esta página HTML y cárgala en el navegador. Abre las herramientas de desarrollador del navegador.

<!doctype html>
<html>
<head>
	<meta charset="utf-8">
	<title>HTML 5 - Plantilla básica</title>
</head>
<body>

	<header>
		<h1>Página web en html5</h1>
		<h3>Esta página está escrita en html 5</h3>
	</header>

	<nav>
		<ul>
			<li><a href="#">Enlace 1</a></li>
			<li><a href="#">Enlace 2</a></li>
			<li><a href="#">Enlace 3</a></li>
		</ul>
	</nav>

	<section>
		<article>
			<header>
				<p class="date">19, enero de 2022</p>
				<h2>Título del artículo</h2>
			</header>
			<p>Este es el contenido del artículo.</p>
		</article>

		<div class="comments">
			<p><a href="#">0 comentarios.</a></p>
		</div>
	</section>

	<aside>
		<div class="related">
			<p>Contenido relacionado indirectamente.</p>
		</div>

		<div class="related">
			<p>Contenido relacionado indirectamente.</p>
		</div>
	</aside>

	<footer>
			<p>Aquí va el pie de página.</p>
	</footer>

</body>
</html>

Si vas pasando el cursor por cada una de las etiquetas, verás como se va marcando el dominio de estas en el documento. Además, en la zona inferior marcada en la imagen, tenemos el árbol del DOM simplificado (se omiten #text, #comment, etc.). Puedes utilizar esto para tener una vista simplificada de nodos cuando trabajes con el DOM.

Etiquetas HTML en las devtools de Chrome

También, puedes activar esta opción:

Etiquetas en el DOM HTML

Lo que permite es que se muestren detalles sobre cada una de las etiquetas, de ese modo, podemos trabajar rápidamente viendo las secciones del documento que nos interesen.

El nodo de entrada al DOM

El nodo de entrada al DOM es document, tal y como dije en el capítulo anterior. Veamos el nodo que está por encima de todo.

let documento = document;
console.log(documento);
Nodo document DOM

A partir de aquí, podemos acceder a otros nodos inferiores.

Puedes pensar entonces, que para acceder al siguiente nivel tienes que escribir esto:

let documento = document.html;
console.log(documento);

Sin embargo, esto devuelve un valor de undefined, ya que la etiqueta html se representa como documentElement.

Palabra del lenguaje nº 71 encontrada.
documentElement() es el elemento raíz del documento. En HTML se corresponde con la etiqueta <html>.
let documento = document.documentElement;
console.log(documento);
documentElement DOM

¡Genial! Hemos conseguido bajar un nivel más.

Al body ya sabes como acceder:

let cuerpoPagina = document.body;
console.log(cuerpoPagina);
document body DOM
Cuidado si estás cargando la hoja externa con código JavaScript en la cabecera, ya que por ejemplo, el acceso al <body>, puesto que se carga después del <head> te dará un valor de null que nos indicará que el elemento no existe, (aún no se ha creado en el flujo de ejecución).

El acceso al <head> es así:

let cabeceraPagina = document.head;
console.log(cabeceraPagina);
document head DOM

Nodos e hijos en el DOM

Tal y como expliqué brevemente, los nodos pueden tener hijos, es decir los nodos que tienen dentro. A su vez, estos tienen otros hijos. En la siguiente página HTML tenemos que <head> y <body> son hijos de <html>, en <body> tenemos su hijo <ul> y este tiene sus propios hijos <li>.
Aunque cada uno tenga sus correspondientes hijos, hay que tener en cuenta los subárboles. Por ejemplo el subárbol del <body> es al que pertenecen los hijos y todos los niveles de hijos inferiores hasta el fin del </body>.

<!doctype html>
<html>
<head>
	<title>Curso de JavaScript</title>
</head>
<body>
	<ul>
		<li>Primer elemento.</li>
		<li>Segundo elemento.</li>
	</ul>
</body>
	<script src="test.js"></script>
</html>

Todo esto quedará más claro con unas pruebas. Vamos a utilizar algo nuevo para acceder a todos los hijos e hijos de hijos, etc. Se trata de childNodes.

Palabra del lenguaje nº 72 encontrada.
childNodes() es una propiedad de Node que devuelve una colección de nodos hijos a partir de un elemento dado.
console.log(document.head.childNodes);

Nos devuelve el subárbol con los objetos del DOM correspondiente solo al <head>.

Document childNodes head DOM

Si desplegamos uno de los objetos del árbol como title, veremos la cantidad de propiedades que tiene, casi todas null por defecto. Entre todas esta locura, podemos encontrar algo de "cordura" (aún es pronto para profundizar aquí):

Document childNodes propiedades DOM

Imagina el poder en tus manos cuando domines todas estas propiedades y puedas manejar el DOM a tu absoluto antojo. La sensación, al menos para mí es mágica.

¿Qué es nodeList?


Palabra del lenguaje nº 73 encontrada.
nodeList es una colección. Algo parecido a un array, pero no exactamente un array. De momento, lo trataremos igual que los array normales. Si profundizamos en sus elementos, tenemos claves y valores.
Sencillamente, un nodeList almacena en posiciones cada uno de los nodos.

Ahora, fíjate en la imagen de un poco más arriba, donde pone "NodeList(3)". ¿Te has fijado que tiene una longitud?

Aquí es donde entra una vez más nuestro infalible amigo length.

Podemos iterar fácilmente cualquier elemento de esta forma:

for (let i = 0; i < document.head.childNodes.length; i++) {
	console.log( document.head.childNodes[i] );
}

Sencillamente, así podemos iterar los objetos devueltos con childNodes y mostrar el subárbol con sus elementos de forma parecida a cuando lo mirábamos en Live DOM Viewer.

Árbol del head DOM

Para hacer lo mismo con el <body>, supongo que te imaginas como hacerlo:

for (let i = 0; i < document.body.childNodes.length; i++) {
	console.log( document.body.childNodes[i] );
}

¿Cómo controlar los elementos del DOM por ID en JavaScript?

Vayamos a cosas más interesantes. Vamos a ver el manejo de cualquier elemento HTML desde JavaScript mediante su atributo id. Aquí tienes un ejemplo:

<!doctype html>
<html>
<head>
	<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=1" />
	<title>Curso de JavaScript</title>
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css"
	rel="stylesheet"
	integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3"
	crossorigin="anonymous">
</head>
<body style="margin:1em">
	<div class="card text-white bg-danger mb-3" style="max-width: 18em;">
		<div class="card-header" onclick="muestraSpoiler()">Pulsa para desplegar</div>
		<div class="card-body" id="spoiler">
			<h5 class="card-title">¡Mostrando el contenido oculto!</h5>
			<p class="card-text">Este texto estaba oculto. Se ha mostrado gracias a JavaScript.
			<br>
			El diseño ya es cosa de BootStrap.</p>
		</div>
	</div>
</body>
	<script src="test.js"></script>
</html>
// El elemento con id "spoiler" queda oculto por defecto.
document.getElementById("spoiler").style.display = "none";

// Si se llama a esta función, se muestra el elemento con id "spoiler"
function muestraSpoiler() {
	document.getElementById("spoiler").style.display = "block";
}

Al cargar la página, aparece esto:

Mostrar texto oculto con JavaScript

Al hacer click en el <div> se muestra el contenido que he decidido ocultar.

Ocultar div con JavaScript

Puede que ya lo entiendas todo, pero hay que explicar como funciona. Sin entrar en temas propios de HTML, CSS o BootStrap.

En la línea 13 de la página HTML, se permite llamar a la función al hacer click gracias a onclick. Ya hablé de esto anteriormente.

En la siguiente línea tenemos un <div> con el id = "spoiler". Ese es el que utilizamos para vincular el elemento HTML con el código JavaScript.

No puedes repetir nombres de id en la misma página HTML, deben ser únicos. Además, cuidado con dar nombre a variables en JavaScript iguales a los id que pongas en HTML, puedes tener problemas.

En el código JavaScript, en la línea 2, llamamos del documento, al elemento con ID "spoiler" gracias a getElementById(). Al hacer esto, ya hemos puesto el foco en el <div> en concreto. Solo queda indicarle que atributo queremos utilizar en ese elemento HTML (style). Puesto que style es un atributo que permite utilizar propiedades CSS en HTML, eso es lo que hacemos, utilizar la propiedad display con un valor de "none". Esto equivale a decirle que no me muestre el elemento.

Finalmente, si llamamos a la función pulsando el <div>, se llama a la función. La función le da otro valor a lo mismo de antes, esta vez, se cambia el "none" por el "block". Lo cual, se resume en que mostramos el elemento.

La explicación de este capítulo ha sido muy extensa, pero ahora, seguro que estás pensando en un montón de posibilidades utilizando getElementById.


Ejercicios de JavaScript

  1. Almacena la rama del <body> en una variable.
  2. Para nombrar desde JavaScript al elemento <html>, lo hacemos con document.html. ¿Verdadero o falso?
  3. El sistema para mostrar el <div> en este capítulo, solo permite mostrarlo cuando se pulsa. Sin embargo, no se puede volver a ocultar. Intenta crear un sistema para que el <div> oculto se pueda ocultar nuevamente después de ser mostrado. El código que escribas es libre, no tiene porque ser exactamente como el mío. Hay muchos caminos. Con que funcione está perfecto.

La solución la encontrarás aquí: Haz click aquí.


Comentarios

Si te quedan dudas sobre el temario, sobre JavaScript o cualquier otra cosa relacionada o simplemente quieres agradecer, aquí tienes tu sitio para dejar tu granito de arena. Gracias por tus comentarios y por darle vida a este sitio web.

Twitter

Programación Fácil YouTube

Suscríbete

Si te ha gustado este curso y crees que el trabajo merece la pena, te agradeceré eternamente que te suscribas a mi canal de YouTube para apoyarme y que pueda seguir haciendo cursos gratuitos.

Además, si te encanta la programación, tienes un montón más de cursos gratuitos para ver.

No solo eso, podrás participar enviándome comentarios con tus sugerencias para temas específicos o cursos completos o incluso las dudas que tengas y las intentaré ir resolviendo en los cursos que estén todavía abiertos.