Skip to content

📅 SAISON A Semaine 5 Épisode 1 - Le DOM

📚 Notions du jour

  • DOM (Document Object Model),
  • Expliquer le principe du DOM,
  • AccĂ©der Ă  un Ă©lĂ©ment de la page en JS (getElement(s)By, querySelector
),
  • Modifier un Ă©lĂ©ment de la page (objet HTMLElement),
  • CrĂ©er un Ă©lĂ©ment,
  • InsĂ©rer un Ă©lĂ©ment dans un autre,
  • Utiliser la documentation pour connaitre les actions possibles avec un Ă©lĂ©ment.

🌐 Le DOM : Le Lien Magique entre HTML et JavaScript

Aujourd’hui, j’ai plongĂ© dans l’un des concepts les plus fondamentaux du dĂ©veloppement web : le DOM, ou Document Object Model. En gros, le DOM est une reprĂ©sentation en mĂ©moire de la structure de votre page HTML, sous forme d’un arbre d’objets. Chaque balise HTML (un <div>, un <p>, etc.) devient un nƓud dans cet arbre, et JavaScript peut interagir avec ces nƓuds pour modifier dynamiquement la page.

Pourquoi c’est puissant ? Sans le DOM, JavaScript ne pourrait pas rĂ©agir aux actions de l’utilisateur (clics, saisies
) ni mettre Ă  jour le contenu sans recharger la page. C’est la base des applications web dynamiques !


🔍 AccĂ©der aux ÉlĂ©ments : Les SĂ©lecteurs, ces ClĂ©s d’AccĂšs

Pour manipuler un Ă©lĂ©ment, il faut d’abord le cibler. JavaScript offre plusieurs mĂ©thodes :

  • getElementById() : RĂ©cupĂšre un Ă©lĂ©ment par son ID (unique).
const myTitle = document.getElementById("my-title");
  • getElementsByClassName() : RĂ©cupĂšre une liste d’élĂ©ments par leur classe.
  • querySelector() : Utilise des sĂ©lecteurs CSS pour cibler un Ă©lĂ©ment (le premier trouvĂ©).
const firstLink = document.querySelector("a");
  • querySelectorAll() : Comme querySelector, mais retourne tous les Ă©lĂ©ments correspondants.

💡 Astuce : querySelector est ultra-flexible et permet des sĂ©lections complexes, comme div > p.highlight.


✹ Modifier un ÉlĂ©ment : L’Objet HTMLElement

Une fois l’élĂ©ment ciblĂ©, on peut lire ou modifier ses propriĂ©tĂ©s et son contenu :

  • Contenu texte : element.textContent ou element.innerHTML (attention, ce dernier interprĂšte le HTML. Il peut insĂ©rer des balises <script> et ainsi laisser la porte ouverte pour une attaque XSS. PrĂ©fĂ©rer l'utilisation de element.innerText).
  • Attributs : element.setAttribute("class", "class-name"), element.classList("class-name"), element.id = "id-name".
  • Styles : element.style.color = "red".

Exemple :

const button = document.querySelector("button");
bouton.textContent = "Click Me!";
bouton.style.backgroundColor = "#4CAF50";

đŸ› ïž CrĂ©er et InsĂ©rer des ÉlĂ©ments : Construire la Page Dynamiquement

JavaScript permet de créer des éléments et de les ajouter à la page :

  1. Créer un élément :
const newParagraph = document.createElement("p");
newParagraph.textContent = "Hello, world!";
  1. L’insĂ©rer dans le DOM :

  2. parent.appendChild(newParagraph) : Ajoute l'élément en tant qu'enfant de l'élément parent ciblé.

  3. parent.insertBefore(newParagraph, elementReference) : InsĂšre un nƓud avant un nƓud de rĂ©fĂ©rence en tant qu'enfant d'un nƓud parent spĂ©cifiĂ©.

💡 Cas pratique : Ajouter une liste d’items gĂ©nĂ©rĂ©e dynamiquement Ă  partir d’un tableau JavaScript.


📚 La Documentation : Le Guide Ultime

Le DOM est vaste, et personne ne retient tout ! La documentation MDN est une mine d’or :

  • Elle liste toutes les propriĂ©tĂ©s et mĂ©thodes disponibles pour chaque type d’élĂ©ment.
  • Exemples concrets et compatibilitĂ© navigateur.

💡 Conseil : Apprendre Ă  chercher efficacement dans la doc. Par exemple, taper "MDN HTMLElement" pour explorer les mĂ©thodes d’un Ă©lĂ©ment.


🎯 Ce Que Je Retiens

  • Le DOM est une interface entre HTML et JavaScript.
  • Les sĂ©lecteurs (querySelector, getElementById) sont essentiels pour cibler des Ă©lĂ©ments.
  • On peut lire, modifier, crĂ©er, et supprimer des Ă©lĂ©ments dynamiquement.
  • La documentation est indispensable pour dĂ©couvrir les possibilitĂ©s.

Prochaine étape : Explorer les événements (addEventListener) pour rendre mes pages interactives !


⌚ Challenge du jour

đŸŽČ Dice roller

🎯 But du Challenge

CrĂ©er une application web interactive permettant de simuler le lancer de dĂ©s đŸŽČđŸŽČ en JavaScript. L’objectif est de gĂ©nĂ©rer visuellement un ou plusieurs dĂ©s, dont la face est dĂ©terminĂ©e alĂ©atoirement, et d’afficher ces dĂ©s dans l’interface utilisateur. En bonus, le challenge propose d’ajouter un adversaire (un deuxiĂšme joueur virtuel) pour comparer les lancers.


🔗 Lien avec les Notions du Jour

Ce challenge met en pratique toutes les notions clĂ©s du DOM apprises aujourd’hui :

  • CrĂ©ation d’élĂ©ments HTML (div) via JavaScript.
  • Manipulation des classes et styles pour appliquer des styles CSS existants et afficher un sprite (image composite).
  • Insertion d’élĂ©ments dans le DOM pour afficher les dĂ©s dans des zones spĂ©cifiques de la page.
  • Modification dynamique des propriĂ©tĂ©s CSS (comme la position de l’arriĂšre-plan) pour changer la face du dĂ©.
  • Interaction avec l’utilisateur via prompt pour personnaliser le nombre de dĂ©s lancĂ©s.
  • Utilisation de la documentation pour comprendre comment manipuler les Ă©lĂ©ments et leurs propriĂ©tĂ©s (comme background-position).

📋 Étapes Ă  RĂ©aliser

  1. CrĂ©ation d’un DĂ© en JavaScript
  2. GĂ©nĂ©ration d’un Nombre AlĂ©atoire et Affichage de la Face du DĂ©
  3. Lancer Plusieurs Dés
  4. Bonus : Ajouter un Adversaire

đŸ’» Langage de Programmation UtilisĂ©

Le challenge est entiĂšrement rĂ©alisĂ© en JavaScript, avec une interaction directe avec le DOM pour manipuler les Ă©lĂ©ments HTML et CSS. Le HTML et CSS sont fournis (ou peuvent ĂȘtre gĂ©nĂ©rĂ©s dynamiquement en JavaScript pour s’entraĂźner), mais la logique principale repose sur JavaScript. L'image stripe (contenant toutes les faces d'un dĂ©, chaque face faisant 100px de largeur) Ă  manipuler pour afficher les dĂ©s est Ă©galement fournie.


đŸ§‘â€đŸ’» Ma proposition de code pour ce challenge

index.html
<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="../css/reset.css">
    <link rel="stylesheet" href="../css/styles.css">
    <title>Roll</title>
</head>
<body>
    <div id="app">
        <div class="board" id="player"></div>
    </div>
    <script src="../js/app.js"></script>
</body>
</html>
app.js
// Get the main board element from the DOM by its id 'app'
const boardElt = document.getElementById("app");
// Create a new div element to represent the dealer's board and add an id and class to it
const dealerElt = document.createElement("div");
dealerElt.classList.add("board");
dealerElt.id = "dealer";
// Append the dealer's board to the main board
boardElt.appendChild(dealerElt);

/**
 * Generates a dice for the specified player and appends it to the player's board.
 * The dice face is determined randomly between 1 and 6.
 * @param {string} player - The id of the player ('player' or 'dealer') to whom the dice will be added.
 */
function generateDice(player) {
  // Generate a random number between 1 and 6 to represent the dice value
  const diceValue = (Math.floor(Math.random() * 6) + 1);
  // Log the dice value to the console for debugging and check if the diceValue corresponds to the correct dice face displayed
  console.log(diceValue);
  // Create a new div element to represent the dice
  const diceElt = document.createElement("div");
  diceElt.classList.add("dice");
  // Get the player's board element by its id
  const playerElt = document.getElementById(player);
  // Append the dice element to the player's board
  playerElt.appendChild(diceElt);

  // Set the background position based on X axis to display the correct dice face using a sprite
  diceElt.style.backgroundPositionX = `${(-100 * diceValue) + 100}px`;
}

// Ask the user how many dice they want to roll and convert the input to a number
const playerInput = Number(prompt("Combien de dés souhaitez-vous lancer ?"));

// Loop to generate the specified number of dice for both the player and the dealer
for (let dice = 1; dice <= playerInput; dice++) {
  generateDice("player");
  generateDice("dealer");
}
Résultat attendu.

Image du prompt Affichage du rendu de la page avec les évÚnements dans la console