Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| dev:javascript:core:fondamentaux [2024/10/09 13:53] – yoann | dev:javascript:core:fondamentaux [2024/10/13 11:24] (Version actuelle) – yoann | ||
|---|---|---|---|
| Ligne 16: | Ligne 16: | ||
| ===== Les types ===== | ===== Les types ===== | ||
| - | Il existe 8 types de base en Javascript. Le langage est **typé dynamiquement**, les variables | + | Il existe 8 types de base en Javascript |
| <code javascript> | <code javascript> | ||
| Ligne 27: | Ligne 27: | ||
| </ | </ | ||
| + | Les types primitifs : | ||
| * **Number** : inclus les entiers, les flottants, Infinity, -Infinity et NaN ; | * **Number** : inclus les entiers, les flottants, Infinity, -Infinity et NaN ; | ||
| * **BigInt** (pour les valeurs au delà de ±(2 53-1) ; | * **BigInt** (pour les valeurs au delà de ±(2 53-1) ; | ||
| * **String** pour les chaines de caractères | * **String** pour les chaines de caractères | ||
| * **Boolean** | * **Boolean** | ||
| - | * null : n' | + | |
| + | * **undefined** est un type à part également : il signifie pas de valeur attribuée | ||
| + | Le type **Object** permet de définir des collections ou des entités complexes et le Le type **Symbol** est utilisé pour créer des identificateurs uniques pour les objets (singleton). | ||
| + | |||
| + | |||
| + | L' | ||
| + | |||
| + | <code javascript> | ||
| + | </ | ||
| + | |||
| + | <note warning> | ||
| + | L' | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Les commentaires ===== | ||
| + | |||
| + | <code javascript> | ||
| + | /** | ||
| + | * Renvoie x élevé à la n-ième puissance. | ||
| + | * | ||
| + | * @param {number} x Le nombre à augmenter. | ||
| + | * @param {number} n L' | ||
| + | * @return {number} x élevé à la n-ème puissance. | ||
| + | */ | ||
| + | function pow(x, n) { | ||
| + | ... | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Ainsi formatés, les commentaires peuvent être extraits et mis en forme par des outils tels que [[https:// | ||
| + | |||
| + | Produire du code auto-descriptif : | ||
| + | * En nommant correctement les variables ; | ||
| + | * En factorisant et nommant correctement les fonctions ; | ||
| + | |||
| + | Si un bloc de code a besoin d' | ||
| + | |||
| + | A Commenter : | ||
| + | |||
| + | * Architecture globale, vue de haut niveau ; | ||
| + | * Utilisation de la fonction ; | ||
| + | * Les solutions importantes, | ||
| + | |||
| + | Commentaires à éviter : | ||
| + | |||
| + | * Qui disent “comment fonctionne le code” et “ce qu’il fait” ; | ||
| + | * Ne les mettez que s’il est impossible de rendre le code aussi simple et auto-descriptif qu’il n’en nécessite pas. | ||
| + | |||
| + | ===== Interactions avec la page web ===== | ||
| + | |||
| + | |||
| + | Pour interagir avec les éléments de la page web, le moteur Javascript construit une image du document : le **DOM** (**D**ocument **O**bject **M**odel). Cet objet est stocké dans la variable globale '' | ||
| + | |||
| + | Par défaut, l' | ||
| + | ** : | ||
| + | |||
| + | <code javascript> | ||
| + | <script src=" | ||
| + | </ | ||
| + | |||
| + | ==== Mettre à jour le contenu ==== | ||
| + | |||
| + | De nombreuses méthodes sont disponibles pour récupérer les éléments du DOM notamment : | ||
| + | |||
| + | * getElementById() si un attribut **id** est définit sur la balise ; | ||
| + | * querySelector() pour utiliser un sélecteur CSS retournant la première correspondance ; | ||
| + | * querySelectorAll() pour utiliser un sélecteur CSS retournant toutes les correspondances. | ||
| + | |||
| + | Une fois la balise récupérée, | ||
| + | |||
| + | <code javascript> | ||
| + | // on récupère la balise img utilisée pour le logo | ||
| + | let b = document.getElementById(" | ||
| + | |||
| + | // on modifie l' | ||
| + | baliseImage.setAttribute(" | ||
| + | </ | ||
| + | |||
| + | Un ensemble de classes peut être associé à la balise. Pour ajouter ou supprimer une classe : | ||
| + | |||
| + | <code javascript> | ||
| + | b.classList.add(" | ||
| + | b.classList.remove(" | ||
| + | </ | ||
| + | |||
| + | Pour ajouter du cotenu à la page on pourra notamment utiliser : | ||
| + | * la méthode '' | ||
| + | * la propriété '' | ||
| + | |||
| + | Lorsqu' | ||
| + | |||
| + | <code javascript> | ||
| + | // création de l' | ||
| + | let footer_note = document.createElement(" | ||
| + | |||
| + | // Insertion dans l' | ||
| + | document.getElementById(" | ||
| + | </ | ||
| + | |||
| + | Pour insérer un nombre plus important d' | ||
| + | |||
| + | <code javascript> | ||
| + | let title = "Hello World.!" | ||
| + | let text = "Voici un exemple de contenu de paragraphe" | ||
| + | |||
| + | let d = ` | ||
| + | <div> | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | `; | ||
| + | |||
| + | document.getElementById(" | ||
| + | </ | ||
| + | |||
| + | ==== Réagir aux évènements ==== | ||
| + | |||
| + | La programmation évènementielle consiste à définir du code qui sera exécuté lorsque certains évènements se produisent. Un évènement est un signal envoyé par l’élément HTML lorsque l’utilisateur effectue une action (clic, frappe au clavier, etc). La méthode consiste à : | ||
| + | |||
| + | * Indiquer au moteur Javascript les évènements que l'on souhaite écouter grâce à un **eventListener**; | ||
| + | * Associer le comportement souhaité (le code) à l’évènement; | ||
| + | |||
| + | On crée un bouton dans le document : | ||
| + | <code html> | ||
| + | <div> | ||
| + | <button id=" | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Puis on associe un comportement à un évènement possible comme " | ||
| + | <code javascript> | ||
| + | //syntaxe fonction anonyme | ||
| + | let bt = document.getElementById(" | ||
| + | bt.addEventListener(" | ||
| + | console.log(" | ||
| + | }); | ||
| + | | ||
| + | //syntaxe équivalente fonction fléchée | ||
| + | bt.addEventListener(" | ||
| + | console.log(" | ||
| + | }); | ||
| + | </ | ||
| + | |||
| + | Lorsqu' | ||
| + | |||
| + | * L' élément sur lequel l' | ||
| + | * Les coordonnées de la souris ('' | ||
| + | * La touche du clavier frappée par l' | ||
| + | * Etc | ||
| + | |||
| + | |||
| + | Ici on journalise dans la console les touches frappées par l' | ||
| + | <code javascript> | ||
| + | document.addEventListener(' | ||
| + | console.log(event.key); | ||
| + | }); | ||
| + | </ | ||
| + | |||
| + | ==== Traitement des formulaires ==== | ||
| + | |||
| + | Les formulaires permettent de regrouper des champs que l' | ||
| + | |||
| + | Dans le document HTML : | ||
| + | <code html> | ||
| + | < | ||
| + | <label for=" | ||
| + | <input type=" | ||
| + | <input type=" | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | La plupart des champs de formulaire possèdent un attribut **value** qui contient la saisie de l' | ||
| + | |||
| + | <code javascript> | ||
| + | //Obtenir la valeur saisie par l' | ||
| + | document.getElementById(" | ||
| + | </ | ||
| + | |||
| + | Dans le cas des cases à cocher, il faudra vérifier si la propriété **checked** est vraie ; | ||
| + | <code javascript> | ||
| + | // L' | ||
| + | document.getElementById(" | ||
| + | </ | ||
| + | |||
| + | Les boutons radio partagent l' | ||
| + | |||
| + | <code html> | ||
| + | < | ||
| + | < | ||
| + | <input type=" | ||
| + | <label for=" | ||
| + | <input type=" | ||
| + | <label for=" | ||
| + | <input type=" | ||
| + | <label for=" | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Pour les traiter, on récupère l' | ||
| + | |||
| + | <code javascript> | ||
| + | // Récupère tous les balises input de type bouton radio ayant l' | ||
| + | let boutons = document.querySelectorAll(' | ||
| + | |||
| + | let couleur = ""; | ||
| + | |||
| + | for (let i = 0; i < boutons.length; | ||
| + | if (boutons[i].checked) { | ||
| + | couleur = boutons[i].value; | ||
| + | break; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // Affiche la valeur du bouton radio coché | ||
| + | console.log(couleur); | ||
| + | </ | ||
| + | |||
| + | Par défaut, lorsque l' | ||
| + | |||
| + | Si nos traitements ont lieu côté client, ce comportement par défaut n'est pas approprié : dans ce cas, on peut le désactiver. | ||
| + | |||
| + | Pour désactiver ce comportement par défaut, il faut : | ||
| + | |||
| + | * Écouter cet événement " | ||
| + | * Empêcher ce comportement grâce à la méthode '' | ||
| + | |||
| + | <code javascript> | ||
| + | const form = document.getElementById(" | ||
| + | |||
| + | form.addEventListener(" | ||
| + | // On désactive le rechargement de la page | ||
| + | event.preventDefault(); | ||
| + | console.log(" | ||
| + | }); | ||
| + | </ | ||
| + | |||
| + | En général, on vérifie la saisie de l' | ||
| + | |||
| + | * L’ événement " | ||
| + | * L’ événement " | ||
| + | * L’ événement " | ||
| + | |||
| + | |||
| + | ===== Gestion des erreurs ===== | ||
| + | |||
| + | Javascript utilise la gestion des exceptions via les instructions **try** / **catch** et **throw**. Ce système permet notamment de reporter/ | ||
| + | |||
| + | <code javascript> | ||
| + | |||
| + | function verifyFormField(a_field) { | ||
| + | if (a_field.value === "" | ||
| + | throw new Error(`Le champ ${a_field.id} est vide`) | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | La fonction définie ci-dessus pourra être appelée n fois dans le code pour chaque champ du formulaire mais selon les besoins, la gestion des erreurs pourra être différente : | ||
| + | |||
| + | <code javascript> | ||
| + | let form = document.querySelector(" | ||
| + | |||
| + | form.addEventListener(" | ||
| + | try { | ||
| + | event.preventDefault(); | ||
| + | |||
| + | let name_field = document.getElementById(" | ||
| + | verifyFormField(name_field); | ||
| + | |||
| + | let mail_field = document.getElementById(" | ||
| + | verifyFormField(mail_field); | ||
| + | |||
| + | // traitements du formulaire | ||
| + | // ... | ||
| + | } catch (error) { | ||
| + | //gestion des erreurs centralisée et adaptée à l' | ||
| + | console.log(" | ||
| + | } | ||
| + | }) | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Tests ===== | ||
| + | |||
| + | |||
| + | Frameworks de tests : | ||
| + | * [[https:// | ||
| + | * La bibliothèque [[https:// | ||
| + | * Le framework [[https:// | ||
| ===== Références ===== | ===== Références ===== | ||
| * [[https:// | * [[https:// | ||