Commentaires

Créer un nouvel élément avec createElement



Pour cette première façon de procéder, on va utiliser la méthode document.createElement qui permet, comme son nom l'indique, de créer un nouvel élément.

Arthur, l'apprenti développeurMais comment on fait pour choisir le type d'élément à créer? Par exemple si je veux faire un div ou un p ce n'est pas pareil.

Il suffit pour cela de préciser le nom de la balise en paramètre de la méthode, comme ceci :

{"language":"text/javascript","content":"document.createElement(\"div\");","filename":""}


Arthur, l'apprenti développeurHum, ok mais elle a du contenu là?

Pas encore, on a juste créer l'élément pour le moment, on peut modifier ses propriétés, par exemple pour ajouter du contenu textuels on peut modifier innerText

{"language":"text/javascript","content":"let el = document.createElement(\"div\");\nel.innerText = \"Test\";","filename":""}


Arthur, l'apprenti développeurAh je vois, mais pourquoi pas innerHTML? Je l'avais déjà utilisé auparavant mais j'ai du mal à comprendre la différence

innerHTML est prévu pour le cas où ta div va contenir d'autre balises, ici c'est juste un text, donc on préfères modifier innerText, en terme de bonne pratique c'est mieux de faire comme ça, mais si on modifiais innerHTML ça fonctionnerais aussi.

Arthur, l'apprenti développeurOk et pour modifier la couleur?

On pourrait directement modifier le style :

{"language":"text/javascript","content":"let el = document.createElement(\"div\");\nel.innerText = \"Test\";\nel.style.color = \"red\";","filename":""}


Mais généralement on va éviter de modifier le style directement, sauf cas particulier ou on a besoin de préciser des valeurs calculés, on va généralement plutôt prévoir des classes et modifier les classes de l'élément pour qu'il s'affiche avec un style prédéfinit.

Arthur, l'apprenti développeurD'accord, et pour ça il y a une propriété class que l'on peut modifier j'imagine?

Effectivement il y a la propriété className, qui contiens précisément ce que l'attribut class HTML définit. On pourrait ici aussi modifier l'élément directement, mais on va éviter, car la moindre modification nécéssite de réécrire toutes les classes de l'élément, et si on veut par exemple en ajouter ou en retirer juste une, ce n'est pas pratique.

Arthur, l'apprenti développeurAh j'imagine que tu as un moyen pratique de faire ça alors.

Tout à fait, il y a la propriété classList, qui elle est un tableau avec la liste de chaque classe de l'élément, et elle possède des méthodes que l'on va utiliser, particulièrement la méthode add pour ajouter une classe.
{"language":"text/javascript","content":"let el = document.createElement(\"div\");\nel.innerText = \"Test\";\nel.classList.add(\"maclasse\");","filename":""}


Arthur, l'apprenti développeurEt là l'élément apparait dans la page comme ça? Mais à quel endroit du coup?

Pas encore, là on l'as juste créer mais il n'est pas encore ajouté dans le DOM.

Intégrer cet élément dans le DOM



Il existe plusieurs méthode pour ajouter un élément dans le DOM, celle qu'on utilisera le plus souvent c'est appendChild, elle permet d'ajouter un élément enfant dans un élément sélectionné.

Arthur, l'apprenti développeurDonc si je comprend bien, on sélectionne un élément dans le DOM avec getElementById ou querySelector et on peut utiliser appendChild pour lui ajouter l'élément qu'on a créé?

C'est exactement ça, un petit exemple pour tester ça :



Arthur, l'apprenti développeurAh oui l'élément s'affiche c'est génial ! Mais attend, s'il y a déjà quelque chose dans le body, ça va faire quoi? Le contenu va être supprimé et remplacer par l'élément?

Et bien non justement, la méthode appendChild ajoute l'élément au contenu déjà existant, sans y toucher, et le nouvel élément est toujours ajouté à la fin.

Arthur, l'apprenti développeurEt si je veux ajouter mon élément au début?

Dans ce cas, il y a une autre méthode, insertAdjacentElement, qui permet d'ajouter un élément en précisant la position avec :


  • beforebegin : avant le début de la balise parent

  • afterbegin : juste après le début de la balise parent, donc au début du contenu à l'intérieur

  • beforeend : avant la fin de la balise parent, donc comme avec appendChild

  • afterend : juste après la fin de la balise parent





Arthur, l'apprenti développeurJe pense que j'ai tout compris jusque là ! Et si dans mon div je veux mettre une autre balise je fais comment?

Des éléments imbriqués



C'est là que ça se complique un petit peu.

Arthur, l'apprenti développeurJe le sentais que ça n'allait pas être si simple que ça...

En fait techniquement, ce n'est pas plus compliqué que ça, il ne va rien y avoir de nouveau, par exemple si on veut mettre une balise p dans un div et ajouter le div au body on peut procéder comme ça :



Arthur, l'apprenti développeurAh oui, on fait juste un appendChild du p dans le div, je ne vois pas pourquoi tu as dit que ça allait se compliquer.

Imaginons, on veuille ajouter des "card" au DOM, chaque card possède un titre, une image, une description et une date, rien de très compliqué?

Arthur, l'apprenti développeurNon ça me parait simple dit comme ça.

Voyons le code, avec du css et tout ce qui va bien.



Tout ça pour créer en Html :

{"language":"text/html","content":"<div class=\"card\">\n\t<span class=\"title\">Titre de la card</span>\n\t<img class=\"picture\" alt=\"Texte alternatif de l'image\" src=\"https://www.training-dev.fr/Img/Shared/training-dev-v3_250.png\">\n\t<span class=\"description\">Description de la card</span>\n\t<date class=\"date\">Date de la card</date>\n</div>","filename":""}


Arthur, l'apprenti développeurHum, je ne vois toujours rien de choquant en fait... Le code reste le même à chaque fois.

Ok, cette fois c'est toi qui va travailler, tu va me faire en javascript une card pour un profil utilisateur, elle doit contenir une zone pour la photo ainsi que le nom de l'utilisateur, mais aussi une autre zone dans laquelle tu mettras dans des éléments séparé avec titre à chaque fois :

  • Le rôle de l'utilisateur

  • Sa date d'inscription au site

  • La liste de tous les commentaire qu'il a pu écrire sur le site, chacune dans une box qui contiendra un lien vers la page du commentaire, sa date de publication, le début du contenu, et un bouton pour répondre

  • La liste de ses compétences avec à chaque fois une image et un texte



Arthur, l'apprenti développeurArrête toi là! J'en ai pour 3 jours déjà à faire ça... Et ça va devenir n'importe quoi mon code je n'arriverais plus à m'y retrouver...

Là tu vois où je veux en venir quand je dit que ça peut rapidement se compliquer.

Arthur, l'apprenti développeur... Donc je n'ai pas à faire tout ça?

Non, c'était pour te faire réaliser que cette méthode, bien qu'efficace, peut rapidement devenir compliquée quand il y a trop d'éléments à créer. On va voir maintenant une autre méthode. J'ai terminé cette partie
Demander de l'assistance