Aller au contenu

Techniques de manipulation du DOM en JavaScript

La manipulation du DOM (Document Object Model) est un aspect crucial du développement web qui vous permet de créer des pages web dynamiques et interactives. Ce guide couvre les meilleures pratiques, les techniques d'optimisation des performances et les méthodes de clonage de nœuds pour vous aider à manipuler le DOM efficacement.

Meilleures pratiques pour la manipulation du DOM

Minimiser l'accès direct au DOM

L'accès au DOM peut être lent car il peut amener le navigateur à recalculer la mise en page et à redessiner les éléments. Pour minimiser l'accès direct au DOM :

  • Regroupez les mises à jour du DOM au lieu d'effectuer plusieurs petites mises à jour.
  • Utilisez des variables pour stocker les références aux éléments fréquemment accessibles.

Optimiser la gestion des événements

Attachez les gestionnaires d'événements de manière efficace :

  • Utilisez la délégation d'événements pour réduire le nombre d'écouteurs d'événements.
  • Évitez d'attacher trop d'écouteurs d'événements directement aux éléments.

Nettoyer les éléments inutilisés

Supprimez les éléments qui ne sont plus nécessaires pour libérer de la mémoire et améliorer les performances :

  • Utilisez les méthodes removeChild ou remove pour supprimer des éléments du DOM.

Minimiser les reflows et les repaints

Que sont les reflows et les repaints ?

  • Les reflows se produisent lorsque la mise en page d'une partie de la page change, ce qui amène le navigateur à recalculer les positions et les tailles des éléments.
  • Les repaints se produisent lorsque l'apparence visuelle des éléments change sans affecter la mise en page (par exemple, des changements de couleur).

Techniques pour minimiser les reflows et les repaints

Regrouper les modifications

Regroupez plusieurs modifications ensemble pour éviter les reflows et repaints répétés :


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>

Cet exemple montre comment regrouper les modifications d'un élément du DOM pour minimiser les reflows et les repaints. En masquant l'élément avant d'effectuer plusieurs mises à jour, puis en l'affichant par la suite, vous pouvez éviter les reflows et repaints intermédiaires.

Utiliser les classes CSS pour les modifications

Appliquez les modifications CSS à l'aide de classes plutôt que de manipuler directement les styles :


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>

Cet exemple montre comment utiliser des classes CSS pour appliquer plusieurs modifications de style à la fois, ce qui est plus efficace que de modifier des propriétés de style individuelles. Basculer une classe qui modifie plusieurs styles aide à réduire le nombre de reflows et de repaints.

Utiliser les fragments de document pour les performances

Qu'est-ce qu'un fragment de document ?

Un fragment de document est un conteneur léger utilisé pour contenir un groupe de nœuds. Il ne fait pas partie de l'arbre DOM principal, ce qui signifie que les modifications qui lui sont apportées ne déclenchent pas de reflows ni de repaints.

INFO

Lors de la réalisation de multiples manipulations du DOM, utilisez DocumentFragment pour regrouper vos modifications et les ajouter au DOM en une seule opération. Cette approche minimise les reflows et les repaints, améliorant considérablement les performances.

Exemple d'utilisation des fragments de document


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>

Cet exemple crée 25 éléments div et les ajoute à un fragment de document. Ce n'est qu'après que tous les éléments ont été ajoutés au fragment que celui-ci est ajouté au DOM en une seule opération. Cette approche minimise les reflows et les repaints en mettant à jour le DOM une seule fois.

Clonage de nœuds

La méthode cloneNode()

La méthode cloneNode() est utilisée pour créer une copie d'un nœud. Elle peut cloner le nœud lui-même ou le nœud avec ses enfants.

Cloner un nœud sans ses enfants


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>

Cet exemple montre comment cloner un nœud sans ses enfants à l'aide de la méthode cloneNode(false). Le nœud cloné copiera les attributs et le contenu textuel du nœud original, mais pas ses nœuds enfants.

Cloner un nœud avec ses enfants


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>

Cet exemple montre comment cloner un nœud avec ses enfants à l'aide de la méthode cloneNode(true). Le nœud cloné inclura le contenu du nœud original ainsi que tous ses nœuds descendants.

Conclusion

Une manipulation efficace du DOM est cruciale pour créer des applications web performantes. En suivant les meilleures pratiques, en minimisant les reflows et les repaints, en utilisant des fragments de document et en clonant efficacement les nœuds, vous pouvez optimiser vos pages web pour de meilleures performances et réactivité.

Pratique

Parmi les méthodes suivantes, lesquelles sont utilisées pour manipuler le DOM en JavaScript ?

Trouvez-vous cela utile?

Aperçu dual-run — comparez avec les routes Symfony en production.