Aller au contenu

Nœuds DOM JavaScript

Comprendre les nœuds DOM

Le Document Object Model (DOM) est un concept fondamental du développement web, servant d’interface entre les documents HTML et JavaScript. Lorsqu’une page web est chargée, le navigateur crée un DOM, transformant le contenu statique en une interface dynamique pouvant être manipulée par programmation. Ce guide se concentre sur les nœuds DOM, les unités de base de cette structure, afin de vous donner les compétences nécessaires pour améliorer des applications web dynamiques.

Qu’est-ce qu’un nœud DOM ?

Chaque composant d’un document, comme les éléments, le texte, les attributs ou les commentaires, est représenté comme un nœud dans le DOM. Chaque nœud est un objet héritant de la classe Node, essentielle à la manipulation des documents.


javascript
<!DOCTYPE html>
<html>
<head>
    <title>DOM Nodes Example</title>
</head>
<body>
    <div id="example">
        <!-- This is a comment node -->
        <p>This is a text node within an element node.</p>
    </div>
    <script>
        let exampleDiv = document.getElementById('example');
        exampleDiv.style.border = '2px solid blue'; // Highlight the div element
        exampleDiv.style.padding = '10px';
    </script>
</body>
</html>

Explication : Dans cet exemple, nous accédons au div dont l’ID est example et lui appliquons des styles CSS pour le distinguer visuellement. Cela montre comment manipuler directement les propriétés de style d’un nœud élément, afin de le rendre plus visible sur la page.

Les différents types de nœuds DOM

Les nœuds du DOM sont classés pour faciliter les manipulations du document :

  • Nœuds élément : définissent les composants structurels des documents HTML.
  • Nœuds texte : contiennent le texte à l’intérieur des éléments.
  • Nœuds attribut : associés aux attributs des éléments.
  • Nœuds commentaire : contiennent des commentaires dans votre HTML.

javascript
<!DOCTYPE html>
<html>
<head>
    <title>Node Types Interactive Example</title>
    <style>
        #info {
            border: 1px solid #ccc;
            padding: 10px;
            margin-bottom: 10px;
        }
        #output {
            border: 1px solid #ccc;
            padding: 10px;
        }
        button {
            cursor: pointer;
            margin-bottom: 10px;
        }
    </style>
</head>
<body>
    <div id="info">
        <!-- This is a comment node -->
        <p>Element node with a <span>child element node</span> and some text.</p>
    </div>
    <button onclick="displayNodeTypes()">Show Node Types</button>
    <div id="output">Node types will be displayed here.</div>
    <script>
        function displayNodeTypes() {
            const infoDiv = document.getElementById('info');
            const outputDiv = document.getElementById('output');
            outputDiv.innerHTML = '';  // Clear previous output
            const nodeTypes = [];

            // Iterate over all child nodes of the div
            infoDiv.childNodes.forEach(node => {
                let typeDescription = '';
                switch(node.nodeType) {
                    case Node.ELEMENT_NODE:
                        typeDescription = 'Element node: ' + node.tagName;
                        break;
                    case Node.TEXT_NODE:
                        // Trim text content and check if it's not empty
                        let textContent = node.textContent.trim();
                        if (textContent) {
                            typeDescription = 'Text node: "' + textContent + '"';
                        }
                        break;
                    case Node.COMMENT_NODE:
                        typeDescription = 'Comment node: "' + node.textContent.trim() + '"';
                        break;
                }

                // Only add non-empty descriptions
                if (typeDescription) {
                    nodeTypes.push(typeDescription);
                    const p = document.createElement('p');
                    p.textContent = typeDescription;
                    outputDiv.appendChild(p);
                }
            });

            // If no nodes are visible or found
            if (nodeTypes.length === 0) {
                outputDiv.textContent = 'No visible nodes found.';
            }
        }
    </script>
</body>
</html>

Le document HTML montre comment identifier et afficher différents types de nœuds DOM (comme les nœuds élément, texte et commentaire). Il comprend une section stylisée pour afficher ces nœuds, un bouton qui déclenche une fonction JavaScript pour analyser et lister ces nœuds, ainsi qu’une zone pour afficher les résultats. La fonction JavaScript inspecte chaque nœud dans une partie désignée du document, le catégorise et affiche son type et ses détails.

Manipuler les nœuds DOM

Améliorer l’interactivité des sites web nécessite une bonne maîtrise de la manipulation du DOM. Voici comment modifier vos pages web de manière dynamique.

Créer et ajouter des nœuds

Ajouter de nouveaux éléments de façon dynamique est essentiel pour les sites web interactifs :


javascript
<!DOCTYPE html>
<html>
<head>
    <title>Add Node Example</title>
</head>
<body>
    <button onclick="addNewParagraph()">Add Paragraph</button>
    <script>
        function addNewParagraph() {
            let newNode = document.createElement('p');
            newNode.textContent = 'This is a new paragraph.';
            document.body.appendChild(newNode);
        }
    </script>
</body>
</html>

Explication : Cet exemple inclut un bouton qui, lorsqu’on clique dessus, déclenche une fonction créant un nouvel élément de paragraphe (<p>) et l’ajoutant au corps du document. Il montre comment JavaScript peut être utilisé pour ajouter dynamiquement du contenu à une page, ce qui est particulièrement utile pour les applications qui doivent se mettre à jour en temps réel sans recharger la page.

Supprimer des nœuds

Supprimer des éléments du DOM :


javascript
<!DOCTYPE html>
<html>
<head>
    <title>Remove Node Example</title>
</head>
<body>
    <div id="container">
        <p id="toBeRemoved">This paragraph will be removed. <button onclick="removeParagraph()">Remove</button></p>
    </div>
    <script>
        function removeParagraph() {
            let parentNode = document.getElementById('container');
            let childNode = document.getElementById('toBeRemoved');
            parentNode.removeChild(childNode);
        }
    </script>
</body>
</html>

Explication : Ce script fournit une démonstration pratique de la suppression d’un élément DOM à l’aide d’un bouton intégré dans le paragraphe lui-même. La méthode removeChild() est utilisée pour supprimer l’élément spécifié, illustrant une action dynamique initiée par l’utilisateur qui modifie directement la structure du document.

Remplacer des nœuds

Remplacer des nœuds dans le DOM :


javascript
<!DOCTYPE html>
<html>
<head>
    <title>Replace Node Example</title>
</head>
<body>
    <div id="oldElement">This element will be replaced. <button onclick="replaceElement()">Replace</button></div>
    <script>
        function replaceElement() {
            let newNode = document.createElement('div');
            newNode.textContent = 'This is a replacement.';
            let oldNode = document.getElementById('oldElement');
            oldNode.parentNode.replaceChild(newNode, oldNode);
        }
    </script>
</body>
</html>

Explication : Dans cet exemple interactif, un bouton déclenche le remplacement d’un div existant par un div nouvellement créé. Cela illustre la méthode replaceChild(), particulièrement utile dans les situations où un élément doit être mis à jour en fonction des actions de l’utilisateur ou d’événements externes, comme la réception de nouvelles données depuis un serveur.

Bonnes pratiques et conseils

  • Réduisez les manipulations du DOM : des mises à jour fréquentes peuvent entraîner des problèmes de performance. Optimisez en réduisant le nombre de manipulations.
  • Utilisez DocumentFragment pour les ajouts en masse : pour ajouter plusieurs éléments à la fois, utilisez DocumentFragment afin de minimiser les recalculs de mise en page et d’améliorer les performances.

INFO

Assurez-vous toujours de la compatibilité entre navigateurs lors des manipulations du DOM. Tester sur différents navigateurs aide à prévenir les comportements inattendus et garantit une expérience utilisateur cohérente.

Exemples de DocumentFragment :

Comme nous l’avons vu ci-dessus, lors de l’ajout de plusieurs éléments au DOM, l’utilisation d’un DocumentFragment peut considérablement améliorer les performances. En créant un DocumentFragment et en y ajoutant des éléments, nous minimisons le nombre de recalculs de mise en page et de repeints nécessaires, car le fragment ne fait pas partie du DOM actif. Une fois tous les éléments ajoutés au fragment, celui-ci peut être ajouté au DOM en une seule opération.


html
<!DOCTYPE html>
<html>
<head>
    <title>DocumentFragment Example</title>
</head>
<body>
    <div id="list-container">
        <h2>Item List</h2>
        <ul id="item-list">
            <!-- Items will be added here -->
        </ul>
        <button id="add-items">Add 100 Items</button>
    </div>

    <script>
        const itemList = document.getElementById('item-list');
        const addItemsButton = document.getElementById('add-items');

        addItemsButton.addEventListener('click', () => {
            // Create a DocumentFragment
            const fragment = document.createDocumentFragment();

            // Add 100 list items to the fragment
            for (let i = 1; i <= 100; i++) {
                const listItem = document.createElement('li');
                listItem.textContent = `Item ${i}`;
                fragment.appendChild(listItem);
            }

            // Append the fragment to the item list
            itemList.appendChild(fragment);
        });
    </script>
</body>
</html>
  • Nous commençons par sélectionner l’élément <ul> où les nouveaux éléments seront ajoutés, ainsi que le bouton qui déclenchera l’ajout.
  • Lorsque le bouton « Add 100 Items » est cliqué, nous créons un objet DocumentFragment.
  • Nous créons ensuite 100 éléments <li> dans une boucle, définissons leur contenu textuel et ajoutons chacun d’eux au DocumentFragment.
  • Enfin, nous ajoutons le DocumentFragment à l’élément <ul>. Comme le fragment ne fait pas partie du DOM actif pendant la phase de construction, cette approche minimise les recalculs de mise en page et les repeints, améliorant ainsi les performances.

L’utilisation de DocumentFragment est particulièrement utile lorsque vous devez ajouter un grand nombre d’éléments au DOM en une seule fois, car elle réduit la surcharge associée à plusieurs recalculs de mise en page et repeints, ce qui permet des mises à jour plus fluides et plus rapides.

Nœuds DOM vs arbres DOM

Les nœuds DOM et les arbres DOM sont des concepts liés, mais ils renvoient à des aspects différents de la manière dont un document web est structuré et manipulé :

  1. Nœuds DOM : un nœud DOM est un composant individuel au sein du Document Object Model (DOM). Chaque élément, texte, commentaire et attribut d’un document HTML ou XML est considéré comme un nœud. Les nœuds sont les éléments de base fondamentaux d’un document. Par exemple, une balise <h1>, le texte à l’intérieur de cette balise, et même les attributs de cette balise (comme class="title") sont tous des nœuds distincts.
  2. Arbre DOM : l’arbre DOM désigne la structure ou hiérarchie complète des nœuds tels qu’ils sont organisés dans le document. C’est une représentation en forme d’arbre qui montre comment tous les nœuds d’un document sont liés les uns aux autres. Les nœuds de cet arbre ont des relations parent-enfant, tout comme des dossiers et des fichiers sur votre ordinateur. Par exemple, dans un document HTML, le nœud <body> peut être un nœud parent, avec plusieurs nœuds enfants comme <div>, <p> et <img> qui représentent différentes parties de la page web.

En termes simples, vous pouvez considérer un nœud DOM comme un point unique ou une pièce d’un puzzle plus vaste, tandis que l’arbre DOM représente le puzzle complet ou l’ensemble des relations entre ces points. L’arbre DOM est utile pour naviguer dans la structure d’un document et la manipuler via des langages de programmation comme JavaScript, car il permet aux développeurs de trouver (sélectionner), modifier ou mettre à jour efficacement les éléments au sein de la hiérarchie imbriquée.

Conclusion

Maîtriser les nœuds DOM est essentiel pour tout développeur JavaScript souhaitant créer des applications web interactives et dynamiques. Ces exemples et explications fournissent une compréhension claire de la manière de manipuler efficacement le DOM, améliorant à la fois l’expérience utilisateur et les fonctionnalités de vos applications web.

Practice

Quels sont les types de nœuds DOM dans un document web ?

Trouvez-vous cela utile?

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