Javascript : DOM

Auteur :
  • François Brucker

Manipulation de l'arbre DOM en javascript.

Accès aux éléments

Créez un fichier javascript-dom.html et copiez/collez le contenu suivant :

<html>
    <head>
        <title>Magie javascript</title>

    </head>
    <body>
        <style>
            body,
            html {
                margin: 0;
                padding: 0;

                background: skyblue;
                color: #FFFFFF;
                font-size: 2em;
                text-align: center;
            }
            .milieu {
                margin: 10px auto;
                height: 50px;
                width: 20px;
            }
            .color {
                background-color: olive;
            }
        </style>

        <h1> Enfin du web !</h1>
        <p> et on <strong>aime</strong> ça</p>
        <div id="mon_div" class="milieu"></div>
        <p>!</p>
        <script>
            document
                .getElementById("mon_div")
                .style
                .backgroundColor = "blue"
        </script>
    </body>
</html>

Ouvrez le avec votre navigateur.

On ne peut pas mettre le code avant la déclaration du div (ce n'est pas comme du css).

Testez le pour voir.

L'objet document est le point d'accès à l'arbre DOM. Il nous permet de récupérer les éléments de cet arbre.

Dans notre cas, nous récupérons un HTMLElement qui hérite de Element. Un HTMLElement possède de nombreux attributs auxquels on peut accéder, comme le style.

On peut aussi accéder aux éléments par :

Seul la méthode document.getElementById rend directement un élément. Les autres méthodes rendent un conteneur de type HTMLCollection que l'on peut manipuler comme un tableau :

let list = document.getElementsByTagName("p");
for (let i = 0; i < list.length; i++) {
    console.log(list[i]);
}

Dans la console du fichier javascript_dom.html, accédez aux éléments par leur nom et leurs classes.

Naviguer dans l'arbre

TBD : arbre DOM : Node -> element -> HTMLElement

On peut naviguer dans l'arbre DOM en parcourant ses nœuds.

Notez qu'un élément possède aussi un attribut children. La différence tient au fait que children ne contient que les fils qui sont eux-même des éléments. Pas les champs texte par exemple.

Dans la console du fichier javascript_dom.html, Remarquez la différence entre document.getElementsByTagName("p")[0].childNodes et document.getElementsByTagName("p")[0].children

Modifier des éléments

Cela vaut le coup de jeter un coup d’œil aux attributs et méthodes des Element ou des HTMLElement, elles permettent de contrôler très finement et de connaître parfaitement l'arbre DOM.

style

Dans l'exemple précédent on a accédé au style d'un HTMLElement.

On peut aussi directement accéder à n'importe quel attribut d'un Element avec les méthodes getAttribute et setAttributes qui nous permettent de changer tous les attributs.

classes

element.classList qui rend une liste permettant d'ajouter ou supprimer ue class

texte

Attribut innerHtml ou innerText

Dans la console du fichier javascript_dom.html, Remarquez la différence entre document.getElementsByTagName("p")[0].innerText et document.getElementsByTagName("p")[0].innerHtml

Créer des éléments

On peut facilement ajouter des éléments à l'arbre DOM grace à la fonction document.createElement et à la méthode appendChild des éléments.

Ajoutez au fichier javascript_dom.html le code ci-après pour ajouter une liste dans le div :

<script>
    let liste_non_orientée = document.createElement('ul')
    let tab = ["oui", "non", "peut-être", "je ne sais pas"]
    tab.forEach((cat) => {
        let li = document.createElement('li')
        button = document.createElement('button')
        button.appendChild(document.createTextNode(cat))
        button.setAttribute("id", cat)
        button.setAttribute("class", "color")
        li.appendChild(button)
        liste_non_orientée.appendChild(li)
    })
    document
        .getElementById("mon_div")
        .appendChild(liste_non_orientée)
    document
        .getElementById("mon_div")
        .style
        .width = 'auto'
    document
        .getElementById("mon_div")
        .style
        .height = 'auto'
</script>