Saltar al contenido

Guía completa de técnicas de manipulación del DOM

DOM (Modelo de Objetos del Documento) es un aspecto crítico del desarrollo web que te permite crear páginas web dinámicas e interactivas. Esta guía cubre las mejores prácticas, técnicas de optimización del rendimiento y métodos para clonar nodos, con el fin de ayudarte a manipular el DOM de manera eficiente.

Mejores prácticas para la manipulación del DOM

Minimiza el acceso directo al DOM

Acceder al DOM puede ser lento porque puede hacer que el navegador vuelva a calcular el diseño y vuelva a pintar los elementos. Para minimizar el acceso directo al DOM:

  • Agrupa las actualizaciones del DOM en lugar de realizar múltiples actualizaciones pequeñas.
  • Utiliza variables para almacenar referencias a los elementos a los que se accede con frecuencia.

Optimiza el manejo de eventos

Adjunta controladores de eventos de manera eficiente:

  • Utiliza la delegación de eventos para reducir la cantidad de oyentes de eventos.
  • Evita adjuntar demasiados oyentes de eventos directamente a los elementos.

Limpia los elementos no utilizados

Elimina los elementos que ya no son necesarios para liberar memoria y mejorar el rendimiento:

  • Utiliza los métodos removeChild o remove para eliminar elementos del DOM.

Minimizar los reflows y repaints

¿Qué son los reflows y repaints?

  • Reflows: ocurren cuando cambia el diseño de una parte de la página, lo que hace que el navegador vuelva a calcular las posiciones y tamaños de los elementos.
  • Repaints: ocurren cuando cambia la apariencia visual de los elementos sin afectar el diseño (por ejemplo, cambios de color).

Técnicas para minimizar reflows y repaints

Agrupar cambios

Agrupa múltiples cambios para evitar reflows y repaints repetidos:


html
<!DOCTYPE html>
<html>
<head>
    <title>Batching Changes</title>
</head>
<body>
    <div id="content">Original Content</div>
    <button id="update">Update Content</button>

    <script>
        document.getElementById('update').addEventListener('click', () => {
            const content = document.getElementById('content');
            content.style.display = 'none'; // Hide element to batch changes
            content.innerHTML = 'Updated Content';
            content.style.display = 'block'; // Show element after updates
        });
    </script>
</body>
</html>

Este ejemplo muestra cómo agrupar cambios en un elemento del DOM para minimizar reflows y repaints. Al ocultar el elemento antes de realizar múltiples actualizaciones y volver a mostrarlo después, puedes evitar reflows y repaints intermedios.

Utiliza clases CSS para los cambios

Aplica cambios CSS utilizando clases en lugar de manipular estilos directamente:


html
<!DOCTYPE html>
<html>
<head>
    <title>Use CSS Classes</title>
    <style>
        .hidden { display: none; }
        .highlight { color: red; font-weight: bold; }
    </style>
</head>
<body>
    <div id="content">Hello World</div>
    <button id="toggle">Toggle Highlight</button>

    <script>
        document.getElementById('toggle').addEventListener('click', () => {
            const content = document.getElementById('content');
            content.classList.toggle('highlight');
        });
    </script>
</body>
</html>

Este ejemplo demuestra cómo utilizar clases CSS para aplicar múltiples cambios de estilo a la vez, lo cual es más eficiente que modificar propiedades de estilo individuales. Alternar una clase que cambia varios estilos ayuda a reducir la cantidad de reflows y repaints.

Uso de fragmentos de documento para mejorar el rendimiento

¿Qué es un fragmento de documento?

Un fragmento de documento es un contenedor ligero utilizado para almacenar un grupo de nodos. No forma parte del árbol principal del DOM, lo que significa que los cambios en él no desencadenan reflows ni repaints.

INFO

Al realizar múltiples manipulaciones del DOM, utiliza DocumentFragment para agrupar tus cambios y agregarlos al DOM en una sola operación. Este enfoque minimiza los reflows y repaints, mejorando significativamente el rendimiento.

Ejemplo de uso de fragmentos de documento


html
<!DOCTYPE html>
<html>
<head>
    <title>Document Fragments</title>
</head>
<body>
    <div id="list"></div>
    <button id="populate">Populate List</button>

    <script>
        document.getElementById('populate').addEventListener('click', (event) => {
            const fragment = document.createDocumentFragment();
            for (let i = 1; i <= 25; i++) {
                const item = document.createElement('div');
                item.textContent = `Item ${i}`;
                fragment.appendChild(item);
            }
            document.getElementById('list').appendChild(fragment);
            event.target.disabled = true; // Disable the button
        });
    </script>
</body>
</html>

Este ejemplo crea 25 elementos div y los agrega a un fragmento de documento. Solo después de que todos los elementos se añaden al fragmento, este se agrega al DOM en una sola operación. Este enfoque minimiza los reflows y repaints al actualizar el DOM solo una vez.

Clonación de nodos

El método cloneNode()

El método cloneNode() se utiliza para crear una copia de un nodo. Puede clonar el nodo en sí o el nodo junto con sus hijos.

Clonar un nodo sin hijos


html
<!DOCTYPE html>
<html>
<head>
    <title>Cloning Nodes</title>
</head>
<body>
    <div id="original">Original Node</div>
    <button id="clone">Clone Node</button>

    <script>
        document.getElementById('clone').addEventListener('click', () => {
            const original = document.getElementById('original');
            const clone = original.cloneNode(false); // Clone without children
            clone.id = 'clone';
            clone.textContent = 'Cloned Node';
            document.body.appendChild(clone);
        });
    </script>
</body>
</html>

Este ejemplo demuestra cómo clonar un nodo sin sus hijos utilizando el método cloneNode(false). El nodo clonado copiará los atributos y el contenido de texto del nodo original, pero no sus nodos hijos.

Clonar un nodo con hijos


html
<!DOCTYPE html>
<html>
<head>
    <title>Cloning Nodes with Children</title>
</head>
<body>
    <div id="original">
        Original Node
        <span>Child Node</span>
    </div>
    <button id="clone">Clone Node with Children</button>

    <script>
        document.getElementById('clone').addEventListener('click', () => {
            const original = document.getElementById('original');
            const clone = original.cloneNode(true); // Clone with children
            clone.id = 'clone';
            document.body.appendChild(clone);
        });
    </script>
</body>
</html>

Este ejemplo demuestra cómo clonar un nodo junto con sus hijos utilizando el método cloneNode(true). El nodo clonado incluirá el contenido del nodo original y todos sus nodos descendientes.

Conclusión

La manipulación eficiente del DOM es crucial para crear aplicaciones web con un buen rendimiento. Al seguir las mejores prácticas, minimizar reflows y repaints, utilizar fragmentos de documento y clonar nodos de manera efectiva, puedes optimizar tus páginas web para lograr un mejor rendimiento y capacidad de respuesta.

Práctica

¿Cuáles de los siguientes métodos se utilizan para manipular el DOM en JavaScript?

¿Te resulta útil?

Vista previa dual-run — compárala con las rutas Symfony en producción.