Regístrate para acceder a más de 15 cursos gratuitos de programación con un simulador

Búsqueda declarativa en el árbol DOM JS: API del DOM

Por lo general, en las tareas prácticas de frontend es común necesitar manipular conjuntos de elementos que están profundamente anidados en el árbol DOM. Muchas veces, estos elementos están dispersos por diferentes partes del mismo árbol. Por ejemplo, podríamos querer marcar una lista de archivos para eliminar y luego realizar esa acción. Desde el punto de vista de modificar el árbol DOM, esto implica seleccionar todos los elementos que representan archivos en términos visuales y proceder a eliminarlos.

En estas situaciones, hacer un recorrido manual del árbol sería una tarea extremadamente tediosa. El DOM ofrece varias maneras de abordar este tipo de tarea, las cuales vamos a explorar en esta lección.

Búsqueda por identificador

Esta es la forma más sencilla de búsqueda:

<p id="content">Este es un párrafo</p>
const el = document.getElementById('content');

Según la especificación, el id debe ser único en la página, por lo que el método getElementById() siempre devuelve un solo elemento. Por otro lado, por casualidad puede haber varias etiquetas con el mismo id en el HTML. En tal caso, el navegador devolverá el primer elemento encontrado.

Búsqueda por clase

Si se necesita procesar varios elementos a la vez, la búsqueda por clase es más adecuada:

// Búsqueda en todo el árbol
// Devuelve todos los elementos con esa clase, que pueden ser completamente diferentes
const collection = document.getElementsByClassName('row');

// Este método permite buscar no solo en todo el documento,
// sino también entre los descendientes de cualquier elemento
el.getElementsByClassName('row');

Búsqueda por etiqueta

Si es necesario, también se puede buscar por etiqueta. En la práctica, esto no ocurre con frecuencia, pero es útil conocer este método:

document.getElementsByTagName('span');

// Buscar todos los elementos
document.getElementsByTagName('*');

// Buscar entre los descendientes de el
el.getElementsByTagName('span');

Búsqueda por selector

Esta es la forma más versátil de búsqueda. Recordemos que un selector es una regla que permite describir un conjunto de elementos en el árbol DOM:

<ul id="menu">
  <li class="odd"><span>Primero</span> elemento</li>
  <li>Segundo</li>
  <li class="odd"><span>Tercero</span> elemento</li>
</ul>
// Este código devuelve el primer elemento encontrado según el selector especificado
// Buscamos el elemento con id=menu
const ul = document.querySelector('#menu');

// Todos los spans, anidados en etiquetas con la clase .odd
const spans = ul.querySelectorAll('.odd > span');

Los métodos querySelector() y querySelectorAll() se pueden aplicar tanto a todo el documento como a un elemento específico. Como de costumbre, buscaremos entre todos los descendientes.

Otros métodos útiles

Predicado matches

El predicado el.matches(css) verifica si el cumple con el selector css:

<p class="font-weight">¡Esto es Códica!</p>
const el = document.querySelector('p');
el.matches('.unknown-class'); // false
el.matches('.font-weight'); // true

Método closest

El método el.closest(css) busca el elemento más cercano hacia arriba en la jerarquía que cumple con el selector. El propio elemento también se analiza. Si se encuentra dicho elemento, se devuelve, de lo contrario se devuelve null:

<div class="row" id="one">
</div>
<div class="row" id="two">
  <div class="row" id="three">
    <span>¿Dónde está el más cercano?</span>
  </div>
</div>
const el = document.querySelector('span');
const ancestor = el.closest('.row');
ancestor.id; // 'three'

Lenguaje XPath

Este es un lenguaje de consultas originalmente diseñado para navegar por el DOM en XML. Es compatible con los navegadores.

<html>
 <body>
    <div>Primera capa
      <span>Bloque de texto en la primera capa</span>
    </div>
    <div>Segunda capa</div>
    <div>Tercera capa
      <span class="text">primer bloque en la tercera capa</span>
      <span class="text">segundo bloque en la tercera capa</span>
      <span>tercer bloque en la tercera capa</span>
    </div>
    <span>cuarta capa</span>
    <img />
 </body>
</html>

La ruta XPath /html/body/*/span/@class coincidirá con dos elementos del documento original:

  • <span class="text">primer bloque en la tercera capa</span>
  • <span class="text">segundo bloque en la tercera capa</span>.

En la práctica diaria, casi no se utiliza al trabajar con el DOM, lo hemos revisado solo para tener una imagen completa. Sin embargo, al trabajar con documentos XML, XPath es el principal método de navegación por el documento.


Materiales adicionales

  1. Documentación sobre selectores / MDN Web Docs

Para acceder completo a curso necesitas un plan básico

El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.

Obtener acceso
130
cursos
1000
ejercicios
2000+
horas de teoría
3200
test

Obtén acceso

Cursos de programación para principiantes y desarrolladores experimentados. Comienza tu aprendizaje de forma gratuita

  • 130 cursos, 2000+ horas de teoría
  • 1000 ejercicios prácticos en el navegador
  • 360 000 estudiantes
Al enviar el formulario, aceptas el «Política de privacidad» y los términos de la «Oferta», y también aceptas los «Términos y condiciones de uso»

Nuestros graduados trabajan en empresas como:

Bookmate
Health Samurai
Dualboot
ABBYY