Outils pour utilisateurs

Outils du site


code_language:javascript

Ceci est une ancienne révision du document !


JavaScript

Synthèse de début

Le chargement d'un fichier javaScript dans une page web:

  1. <script src="./script.js"> </script>

Variable

Déclaration, type et fonction
  1. let nomberOfCats = 2; // Premiere méthode, variable local dont la porté est le bloc. au dela elle est détruite
  2. var nombreOfCats = 2; // Deuxième méthode, variable local dont la porté est la fonction.
  3. const nombreOfCats = 2; //Déclaration d'une constante local
  4. void <a href="javascript:void(maFonction())"> ... </a> // Ne retourne rien, déclaration obligatoire pour les pseudo url javascript: sinon l'instruction retourne une valeur qui remplace la page en question.
  5. with(navigator) //Permet de simplifier la référence aux propriétés et méthodes des objets en précédant un bloc d'instruction dans lequel un objet devient implicite.
  6. {
  7. alert(appName + " " + appVersion);
  8. } // équivalent à :
  9. alert(navigator.appName + " " +navigator.appVersion);
  10. function ma_fonction()
  11. {
  12. alert("Je suis exécuté dans ma_fonction");
  13. }

Type de variable et objet pédéfinis

window

Propriété
  • 'closed '

fenêtre fermée

  • 'defaultStatus '

affichage normal dans la barre d'état

  • 'innerHeight '

hauteur du domaine d'affichage

  • 'innerWidth '

largeur du domaine d'affichage

  • 'locationbar '

barre d'adresse

  • 'menubar '

barre de menus

  • 'name '

nom de fenêtre

  • 'outerHeight '

hauteur de la fenêtre globale

  • 'outerWidth '

largeur de la fenêtre globale

  • 'pageXOffset '

position de départ de la fenêtre à partir de la gauche

  • 'pageYOffset '

position de départ de la fenêtre à partir du haut

  • 'personalbar '

barre pour les adresses favorites

  • 'scrollbars '

barres de défilement

  • 'statusbar '

barre d'état

  • 'status '

Contenu de la barre d'état

  • 'toolbar '

barre d'outils

Méthodes
  • 'alert()'

boite de dialogue avec infos

  • 'back()'

page précédente

  • 'blur()'

quitter la fenêtre

  • 'captureEvents()'

surveiller les événements

  • 'clearInterval()'

interrompre la suite d'instructions sans fin

  • 'clearTimeout()'

interrompre le compte à rebours

  • 'close()'

fermer la fenêtre

  • 'confirm()'

boite de dialogue pour confirmer

  • 'disableExternalCapture()'

empêcher une surveillance extérieure

  • 'enableExternalCapture()'

permettre une surveillance extérieure

  • 'find()'

chercher du texte

  • 'focus()'

activer la fenêtre

  • 'forward()'

page suivante

  • 'handleEvent()'

renvoyer l'événement

  • 'home()'

appeler la page d'accueil

  • 'moveBy()'

se mouvoir avec des mentions relatives

  • 'moveTo()'

se mouvoir avec des mentions absolues

  • 'open()'

ouvrir une nouvelle fenêtre

  • 'print()'

imprimer

  • 'prompt()'

fenêtre de dialogue pour la saisie de valeur

  • 'releaseEvents()'

fermer un événement

  • 'resizeBy()'

modifier la taille avec des mentions relatives

  • 'resizeTo()'

modifier la taille avec des mentions absolues

  • 'routeEvent()'

parcourir la hiérarchie des gestionnaires d'événement

  • 'scrollBy()'

défiler un certain nombre de pixels

  • 'scrollTo()'

défiler jusqu'à la position

  • 'setInterval()'

établir une liste d'instructions planifiées

  • 'setTimeout()'

entamer le compte à rebours

  • 'stop()'

interrompre

document

Propriétés
  • 'alinkColor '

couleur des liens lorsqu'ils sont cliqués

  • 'bgColor '

couleur d'arrière plan

  • 'charset '

jeu de caractères utilisés

  • 'cookie '

chaîne de caractères pouvant être sauvegardée chez l'utilisateur

  • 'defaultCharset '

jeu de caractères normal

  • 'fgColor '

couleur pour le texte

  • 'lastModified '

dernière modification du document

  • 'linkColor '

couleur pour les liens

  • 'referrer '

pages déjà visitées

  • 'title '

titre du fichier

  • 'URL '

adresse URL du fichier

  • 'vlinkColor '

couleur pour les liens à des cibles visitées

Méthodes
  • 'captureEvents()'

surveiller les événements

  • 'close()'

fermer

  • 'createAttribute()'

créer un nœud d'attributs

  • 'createElement()'

créer un nœud d'éléments

  • 'createTextNode()'

créer un nœud de texte

  • 'getElementById()'

Accès à l'élément HTML par l'attribut Id

  • 'getElementsByName()'

Accès à l'élément HTML par l'attribut name

  • 'getElementsByTagName()'

Accès à l'élément HTML par liste d'éléments

  • 'getSelection()'

texte sélectionné

  • 'handleEvent()'

traiter les événements

  • 'open()'

ouvrir le document

  • 'releaseEvents()'

fermer des événements

  • 'routeEvent()'

parcourir la hiérarchie des gestionnaires d'événement

  • 'write()'

écrire dans la fenêtre du document

  • 'writeln()'

écrire ligne par ligne

Propriétés
  • 'appCodeName'

surnom du navigateur

  • 'appName'

nom officiel du navigateur

  • 'appVersion'

version du navigateur

  • 'cookieEnabled'

Cookies permis

  • 'language'

langue du navigateur

  • 'platform'

plate-forme sur laquelle tourne le navigateur

  • 'userAgent'

identification HTTP du navigateur

Méthodes
  • 'javaEnabled()'

vérifier la disponibilité Java

Array

Propriétés
  • 'length()'

retourne la taille du tableau (entier)

Methodes

Modification du contenu

Méthode Description Exemple
Création Génère un tableau
  1. let monTableau = [];
pop() Supprime et retourne le dernier élément
  1. mon_tableau.pop()
push() Ajoute un ou plusieurs éléments à la fin
  1. mon_tableau.push("nouveau","deuxième nouveau")
shift() Supprime le premier élément
  1. mon_tableau.shift()
unshift() Ajoute des éléments au début
  1. mon_tableau.unshift("nouveau1","nouveau2")
splice() Insère des éléments
  1. mon_tableau.splice(ou, 2,"nouveau1","nouveau2")
reverse() Réorganise le tableau de la fin ver le début
  1. mon_tableau.reverse()
concat() Concaténer plusieurs tableaux
  1. mon_tableau.concat(tableau1,tableau2)

Obtenir des données

join() Extrait les données dans une chaîne avec le délimiteur donné en paramètre
  1. mon_tableau.join(" ")
slice() Renvoie un tableau contenant 'nombre' cellules à partir de 'début'
  1. mon_tableau.slice(debut,nombre)

Trier

sort() Trier le tableau
  1. mon_tableau.sort()

Méthodes héritées

toString() Renvoyer le contenu de l'objet sous forme de chaîne
  1. s = mon_tableau.toString()
toLocaleSting() Renvoyer le contenu de l'objet sous forme de chaîne
  1. s= mon_tableau.toLocaleString()

Manipulation:

  • Instanciation:
  1. mon_tableau = new Array(); // Simple et direct
  2. mon_tableau = new Array(10); // Imposition de dix cases vides, (de 0 à 9) length vaut 10
  3. // Note : rien n'empèche immédiatement après de faire mon_tableau[11] (dynamisme)
  4.  
  5. mon_tableau = new Array("Elément 1", "Elément 2"); // Remplissage à la déclaration.
  • Adressage d'un élément
  1. t = new Array(null,null,null,"Contenu de trois"); // Création avec 4 éléments
  2. t["nom"] = "contenu de 'nom'";
  3. alert(t[0]); // Affiche 'null'
  4. alert(t[3]); // Affiche "Contenu de trois";
  5. alert(t["nom"]); // Affiche "contenu de 'nom'"
  6. alert(t[4]); // Affiche "undefined"
  7. </pre>
  8.  
  9.  
  10. === Lecture de la propriété length ===
  11. <code JavaScript [enable_line_numbers="true"]>
  12. t = new Array(null,null,null,"Contenu de trois"); // Création avec 4 éléments
  13.  
  14. var nb_elements = t.length; // Lecture de length dans une variable
  15.  
  16. alert("Le tableau a " + t.length + " éléments"); // Affiche "le tableau a 4 éléments"
  17.  
  18. for(i = 0; i < t.length; i++)
  19. alert("contenu de : " + i + t[i]);
  20. // Affiche "null", puis "null", "null" et "Contenu de trois"
  • Utilisation d'une méthode:
  1. t = new Array("Premier","Deuxieme","Troisieme");
  2. t.sort(); // Invocation de la méthode sort()
  3. alert(t); // Affiche "Deuxieme,Premier,Troisieme", soit le contenu par ordre alphabétique

Date

Méthode
  • 'getDate()'

renvoie le jour du mois

  • 'getDay()'

renvoie le jour de la semaine

  • 'getFullYear()'

renvoie l'année complète

  • 'getHours()'

renvoie la partie heures de l'heure

  • 'getMilliseconds()'

renvoie les millièmes de secondes

  • 'getMinutes()'

renvoie la partie minutes de l'heure

  • 'getMonth()'

renvoie le mois

  • 'getSeconds()'

renvoie la partie secondes de l'heure

  • 'getTime()'

renvoie l'heure

  • 'getTimezoneOffset()'

renvoie le décalage horaire de l'heure locale

  • 'getUTCDate()'

renvoie le jour du mois de l'heure UTC (temps universel coordonné)

  • 'getUTCDay()'

renvoie le jour de la semaine de l'heure UTC

  • 'getUTCFullYear()'

renvoie l'année complète de l'heure UTC

  • 'getUTCHours()'

renvoie la partie heures de l'heure UTC

  • 'getUTCMilliseconds()'

renvoie les millièmes de secondes de l'heure UTC

  • 'getUTCMinutes()'

renvoie la partie minutes de l'heure UTC

  • 'getUTCMonth()'

renvoie le mois de l'heure UTC

  • 'getUTCSeconds()'

renvoie la partie secondes de l'heure UTC

  • 'getYear()'

renvoie l'année

  • 'parse()'

renvoie le nombre de millièmes de secondes depuis le 1/1/1970

  • 'setDate()'

change le jour du mois de l'objet

  • 'setFullYear()'

change l'année complète de l'objet

  • 'setHours()'

change la partie heures de l'heure de l'objet

  • 'setMilliseconds()'

change la partie millièmes de seconde de l'heure de l'objet

  • 'setMinutes()'

change la partie minutes de l'heure de l'objet

  • 'setMonth()'

change la partie mois de la date de l'objet

  • 'setSeconds()'

change la partie secondes de l'heure de l'objet

  • 'setTime()'

change la date et l'heure de l'objet

  • 'setUTCDate()'

change le jour du mois de l'heure UTC de l'objet

  • 'setUTCDay()'

change le jour de la semaine de l'heure UTC de l'objet

  • 'setUTCFullYear()'

change l'année complète de l'heure UTC de l'objet

  • 'setUTCHours()'

change la partie heures de l'heure UTC de l'objet

  • 'setUTCMilliseconds()'

change la partie millièmes de seconde de l'heure UTC de l'objet

  • 'setUTCMinutes()'

change la partie minutes de l'heure UTC de l'objet

  • 'setUTCMonth()'

change le mois de l'heure UTC de l'objet

  • 'setUTCSeconds()'

change la partie secondes de l'heure UTC de l'objet

  • 'setYear()'

change la date et l'heure de l'objet

  • 'toGMTString()'

convertir la date et l'heure au format GMT

  • 'toLocaleString()'

convertir la date et l'heure au format local

  • 'UTC()'

renvoie le nombre de millièmes de secondes entre le 1/1/1970 et un moment donné

Error

Les exceptions renvoient des objets de type Error, ou qui en héritent.

  1. var myError = new Error('Message');

Function

Propriétés
  • arguments

tableau de noms d'arguments

  • arity

nombre d'arguments

  • caller

nom de la fonction qui appelle

Image

Propriétés
Méthode

Math

Propriétés
  • 'E'

constante d'Euler

  • 'LN2'

logarithme naturel de 2

  • 'LN10'

logarithme naturel de 10

  • 'LOG2E'

logarithme constant de 2

  • 'LOG10E'

logarithme constant de 10

  • 'PI'

constante PI

  • 'SQRT1_2'

constante pour racine carrée de 0,5

  • 'SQRT2'

constante pour racine carrée de 2

Méthode
  • 'abs()'

valeur positive

  • 'acos()'

arc cosinus

  • 'asin()'

arc sinus

  • 'atan()'

arc tangente

  • 'ceil()'

nombre entier supérieur le plus proche

  • 'cos()'

cosinus

  • 'exp()'

valeur exponentielle

  • 'floor()'

nombre entier inférieur le plus proche

  • 'log()'

utilisation du logarithme naturel

  • 'max()'

le plus grand de deux chiffres

  • 'min()'

le plus petit de deux chiffres

  • 'pow()'

nombre puissance exposant

  • 'random()'

0 ou 1 aléatoire

  • 'round()'

arrondi commercial d'un nombre

  • 'sin()'

sinus

  • 'sqrt()'

racine carrée

  • 'tan()'

tangente

Number

Propriétés
  • 'MAX_VALUE'

plus grand nombre pouvant être sauvegardé

  • 'MIN_VALUE'

plus petit nombre pouvant être sauvegardé

  • 'NaN'

nombre non valable

  • 'NEGATIVE_INFINITY'

nombre trop petit

  • 'POSITIVE_INFINITY'

nombre trop grand

Méthode
  • 'toExponential()'
  • 'toFixed()'
  • 'toPrecision()'
  • 'toString()'

Opérateurs arithmétiques

Addition et soustraction
  1. let totalCDs = 67;
  2. let totalVinyls = 34;
  3. let totalMusic = totalCDs + totalVinyls;
  1. let cookiesInJar = 10;
  2. let cookiesRemoved = 2;
  3. let cookiesLeftInJar = cookiesInJar - cookiesRemoved;
  1. let cookiesInJar = 10;
  2. /* manger deux cookies */
  3. cookiesInJar -= 2; //il reste 8 cookies
  4. /* cuisson d'un nouveau lot de cookies */
  5. cookiesInJar += 12; // il y a maintenant 20 cookies dans la boîte
  1. let numberOfLikes = 10;
  2. numberOfLikes++; // cela fait 11
  3. numberOfLikes--; // et on revient à 10...qui n'a pas aimé mon article ?
Multiplication et division
  1. let costPerProduct = 20;
  2. let numberOfProducts = 5;
  3. let totalCost = costPerProduct * numberOfProducts;
  4. let averageCostPerProduct = totalCost / numberOfProducts;
  1. let numberOfCats = 2;
  2. numberOfCats *= 6; // numberOfCats vaut maintenant 2*6 = 12;
  3. numberOfCats /= 3; // numberOfCats vaut maintenant 12/3 = 4;
Mutabilité des variables

Les variables sont soit mutable, c'est a dire que l'on peut modifier leur affectation, soit Constante, une fois initialisé elle ne peuvent plus être modifier.

  1. const nombrePostParPage = 20;
  2. nombrePostParPage = 30; // Retournera une erreur dans la console car on ne peut plus changer sa valeur

Structure de contrôle

Return

Employé dans une fonction, provoque le retour au programme appelant avec renvoi facultatif d'un résultat.

  1. function ma_fonction(aparam)
  2. {
  3. s = "";
  4. if (aparam == "")
  5. return; // Sortie sans renvoyer de résultat
  6. else
  7. s = "Le résultat";
  8. return s; // Renvoie le contenu de s
  9. }

if

Permet de définir l'exécution conditionnelle d'instructions ou d'un bloc d'instructions. Peut-être utilisé conjointement à else.

  1. a = 5;
  2. if (a==5)
  3. alert("la condition est remplie");

else

Utilisé conjointement à if, permet d'exécuter des instructions alternativement au résultat de la condition spécifiée par if.

  1. a = 5
  2. if (a==5)
  3. alert("a est égal à 5");
  4. else
  5. alert("a est différent de 5");

switch

Utilisé conjointement à case, permet d'implanter un sélecteur de cas

  1. function test(condition)
  2. {
  3. switch(condition)
  4. {
  5. case "1":
  6. alert("condition='1'");
  7. break;
  8. case "3":
  9. alert("condition='3'");
  10. break;
  11. case "5":
  12. alert("condition='5'");
  13. break;
  14. }
  15. }

case

Utilisé à l'intérieur d'un bloc switch, constitue un des choix du selecteur.

break

Utilisé à l'intérieur d'un bloc switch, permet de sortir du sélecteur sans procéder tests suivants. Utilisé à l'intérieur d'une boucle telle un bloc switch, permet de quitter la boucle immédiatement.

default

Utilisé à l'intérieur d'un bloc switch, constitue l'option par défaut du sélecteur.

for

Introduit une boucle itérative deterministe.

  1. for (i=0;i<5;i++)
  2. {
  3. alert(i);
  4. }

For each : “for …in …” ou “for … of …”

  1. var array = [1, 2, 3];
  2. for (line in array)
  3. {
  4. alert(line);
  5. }
  6.  
  7. for(i in array)
  8. {
  9. console.log(array[i].toString();
  10. }
  11.  
  12. for(arrayItem of array)
  13. {
  14. console.log(arrayItem);
  15. }

En tableau associatif :

  1. var array = { "a" : 1, "b" : 2, "c": 3 };
  2. for (line in array)
  3. {
  4. alert('Clé : ' + line + ', valeur : ' + array[line]);
  5. }

do

Introduit une boucle itérative indeterministe conditionnelle avec test effectué à chaque tour par “while” :

  1. i=0
  2. do
  3. {
  4. i++
  5. alert(i); // Affichera 1, puis 2, puis 3, puis 4, puis 5
  6. }
  7. while(i<5);

while

Introduit une boucle itérative indeterministe conditionnelle:

  1. i=0
  2. while(i<5)
  3. {
  4. i++; // Incrémenter i
  5. alert(i); // Affiche 1, puis 2, puis 3, puis 4, puis 5
  6. }

continue

Utilisé dans une boucle “for”, “while” et “do”, permet de sauter un tour.

  1. for (i=-2;i<=2;i++)
  2. {
  3. if (i==0) continue; // Si i == 0, on passe directement à 1
  4. alert(5/i); // On évite ainsi la division par zéro.
  5. }

Gestion des erreurs

throw

Provoque une erreur personnalisée.

  1. throw new Error("votre erreur");// a le même effet visuel que alert("votre erreur");

try ... catch ... finally

Évalue un bloc (try) en capturant les erreurs, tente de les gérer (catch) si elles se produisent, et quoiqu'il arrive, évalue un dernier bloc (finally).

Opérateur

in

Opérateur qui détermine l'appartenance à un objet. Dans une boucle for… in, permet de répéter des instructions pour chaque propriété d'un objet.

new

Opérateur qui permet l'instanciation d'un objet.

  1. var mon_tableau = new Array();

instanceof

Cet opérateur permet de tester si une valeur est une instance d'un objet :

  1. t = new Array();
  2. alert(t instanceof Array); // Affiche true
  3. alert(t instanceof Date); // Affiche false

typeof

Cet opérateur renvoie le type de la variable placée à droite. Les valeurs renvoyées par typeof correspondent aux types de variables JavaScript, soit : boolean string number function object undefined.

delete

Cet opérateur permet de supprimer une propriété.

Valeurs spéciales

this

Dans le constructeur ou une méthode d'un objet, c'est une référence à l'objet. Hors de ce contexte, this référence l'objet global window.

true

Valeur booléenne “vrai”.

  1. if (true)
  2. {
  3. alert("Je m'affiche toujours");
  4. }

false

Valeur booléenne “faux”.

  1. if (true)
  2. {
  3. if (ma_bool == false)
  4. alert("C'est pas vrai...")
  5. }

null

Valeur de type “object” qui ne référence rien.

undefined

C'est la valeur de toutes les variables inexistantes ou supprimées.

Fonctions prédéfinies

  • decodeURL()
    • décode une url codée
  • decodeURLComponent()
    • décode une URl codée - II
  • encodeURL()
    • coder une URL
  • encodeURLComponent()
    • code une URL - II
  • eval()
    • transforme une expression
  • escape()
    • transforme des signes ASCII en nombres
  • isFinite()
    • vérifie le domaine numérique de valeurs
  • isNaN()
    • vérifie si la valeur n'est pas un nombre
  • parseFloat()
    • transform en nombre avec décimales
  • parseInt()
    • transform en nombre entier
  • Number()
    • transforme un objet en nombre
  • String()
    • transforme le contenu d'un objet en une chaine de caractères
  • unescape()
    • transforme des nombres en caractères ASCII

Programmation avancée

Paradigme de programmation classe/objet

Premier exemple:

  1. /**
  2.  * Modélisation d'une voiture
  3.  *
  4.  * @class Voiture
  5.  */
  6. var Voiture = (function () {
  7. //'use strict';
  8.  
  9. Voiture.couleur = "verte";
  10. // methode de classe
  11. Voiture.construire = function (marque) {
  12. return new Voiture(marque);
  13. };
  14.  
  15. // constructeur
  16. function Voiture(marque) {
  17. this.marque = marque;
  18. }
  19.  
  20. // méthodes d'instance
  21. Voiture.prototype = {
  22.  
  23. rouler: function (direction) {
  24. document.write("la voiture roule");
  25. },
  26. getMarque: function (){
  27. return this.marque;
  28. }
  29. };
  30.  
  31. return Voiture;
  32.  
  33. }());
  34.  
  35. // ->
  36. var saab = new Voiture('Saab');
  37. var chrysler = Voiture.construire('Chrysler');
  38. chrysler.rouler();
  39. alert(saab.getMarque());

Deuxième exemple:

  1. var article = new Object();
  2. article.nom = "Livre";
  3. article.prix_unitaire = 21.99;
  4. article.quantite = 2;

Variante:

  1. function Article(nom, prix_unitaire, quantite)
  2. {
  3. this.nom = nom;
  4. this.prix_unitaire = prix_unitaire;
  5. this.quantite = quantite;
  6. this.resume = function(){
  7. return this.nom+" x "+this.quantite+" à "+this.prix_unitaire+
  8. " l'unité coûte(nt) "+( this.quantite*this.prix_unitaire );
  9. }
  10. return this;
  11. }
  12. var article = new Article( "Livre", 21.99, 2);

Troisième exemple:

  1. var article = {
  2. "nom" : "Livre",
  3. "prix_unitaire" : 21.99,
  4. "quantite" : 2,
  5. "resume" : function(){
  6. return this.nom+" x "+this.quantite+" à "+this.prix_unitaire+
  7. " l'unité coûte(nt) "+( this.quantite*this.prix_unitaire );
  8. }
  9. };

Quatrième exemple avec Imbrications:

  1. var commandes = [
  2. { "client": "Jean",
  3. "articles": [
  4. { "nom": "Livre", "quantite": 2, "prix_unitaire": 21.99 } ,
  5. { "nom": "Stylo", "quantite": 4, "prix_unitaire": 0.79 }
  6. ],
  7. "mode_paiement": "chèque"
  8. },
  9. { "client": "Pierre",
  10. "articles": [
  11. { "nom": "Livre", "quantite": 1, "prix_unitaire": 21.99 } ,
  12. { "nom": "Trombones", "quantite": 50, "prix_unitaire": 0.05 }
  13. ],
  14. "mode_paiement": "espèces"
  15. }
  16. ];

Création d'une classe:

  1. class Book {
  2. constructor(title, author, pages){
  3. this.title = title;
  4. this.author = author;
  5. this.pages = pages;
  6. }
  7. } //création de la classe avec son constructeur.
  8.  
  9. var myBook = new Book("l'Histoire de Tao", "Will Alexander", 250);
  10. // instanciation d'un objet book par le constructeur.

Methode de classe

Comme en Java classique: les méthodes créer dans une classe sont accessible depuis n'importe quel objet instancier de cette classe.

  1. class BankAccount {
  2. constructor(owner, balance) {
  3. this.owner = owner;
  4. this.balance = balance;
  5. }
  6. //Ici création de la méthode dite d'instance.
  7. showBalance() {
  8. console.log("Solde: " + this.balance + " EUR");
  9. }
  10. }
  11. const newAccount = new BankAccount("Will Alexander", 500); //Instanciation d'un objet de la classe BankAccount.
  12. newAccount.showBalance(); // Invocation de la méthode instance, imprime "Solde: 500 EUR" à la console.

Il y a également les méthode Static, invocable depuis l'évocation de la classe elle même sans avoir à l'instancier.

  1. class BePolite {
  2.  
  3. static sayHello() {
  4. console.log("Hello!");
  5. }
  6.  
  7. static sayHelloTo(name) {
  8. console.log("Hello " + name + "!");
  9. }
  10.  
  11. static add(firstNumber, secondNumber) {
  12. return firstNumber + secondNumber;
  13. }
  14. }
  15.  
  16. BePolite.sayHello(); // imprime "Hello!""
  17.  
  18. BePolite.sayHelloTo("Will"); // imprime "Hello Will!""
  19.  
  20. const sum = BePolite.add(2, 3); // sum = 5

Frameworks

Visual Studio Code

Dojo

jQuery

Node.js

React.js

Développement Web avec js

DOM

Le DOM: Document Object Model est une interface de programmation qui est une représentation du HTML d'une page web et qui permet d'accéder aux éléments de cette page web et de les modifier avec le langage JavaScript. Il faut voir le DOM comme un arbre ou chaque éléments peut avoir zero ou plusieurs enfants:

Le document et accès à ses éléments

Le document est l'objet réprésentant notre page, auquel on a directement acces avec JavaScript il est le point de départ du DOM.

Principales fonctions de recherche d'éléments du DOM:

 document.getElementByld() 

Recherche un élément grâce à son “ id ”. On rappel qu'il n'y a qu'un seul élément avec un “ id ” donné. Exemple: Si on a dans notre page HTML la l'élément suivant:

  1. <p id="my-anchor"> My content </p>

On aura pour accéder à cet élément avec js:

  1. const myAnchor = document.getElementById('My-anchor');
 document.getElementsByClassName() 

Recherche un élément grâce à sa “ Classe ”. On rappel qu'il peut y avoir plusieurs éléments avec un “ nom de classe ” donné. Il renverra la liste des éléments des cette classe. Exemple: Si on a dans notre page HTML la l'élément suivant:

  1. <div>
  2. <div class="content"> Contenu 1 </div>
  3. <div class="content"> Contenu 2 </div>
  4. <div class="content"> Contenu 3 </div>
  5. </div>

On aura pour accéder à cet élément avec js:

  1. const contents = document.getElementsByClassName('content');
  2. const firstContent = contents[0];
 document.getElementsByTagName() 

Recherche un élément grâce à son “ Tag name ” soit son “ nom de balise ” donné. Il renverra la liste des éléments correspondants. Exemple: Si on a dans notre page HTML la l'élément suivant:

  1. <div>
  2. <aritcle> Contenu 1 </aritcle>
  3. <aritcle> Contenu 2 </aritcle>
  4. <aritcle> Contenu 3 </aritcle>
  5. </div>

On aura pour accéder à cet élément avec js:

  1. const articles= document.getElementsByTagName('article');
  2. const thirdArticle = contents[2];
 document.querySelector() 

Recherche un élément grâce à un selecteur qui permet de cibler certains éléments. Exemple:

  1. document.querySelector("#myId p.article > a")

fera une recherche dans l'élément ayant pour id = “#myId”, mes éléments de type <p> qui ont pour classe article, afin de récupérer le lien <a> qui est un enfant direct (pas des enfants de ses enfants). Si on a dans notre page HTML la l'élément suivant:

  1. <div id="myId">
  2. <p>
  3. <span><a href="#">Lien 1</a></span>
  4. <a href="#">Lien 2</a>
  5. <span><a href="#">Lien 3</a></span>
  6. </p>
  7. <p class="article">
  8. <span><a href="#">Lien 4</a></span>
  9. <span><a href="#">Lien 5</a></span>
  10. <a href="#">Lien 6</a>
  11. </p>
  12. <p>
  13. <a href="#">Lien 7</a>
  14. <span><a href="#">Lien 8</a></span>
  15. <span><a href="#">Lien 9</a></span>
  16. </p>
  17. </div>

On aura pour accéder à cet élément avec js:

  1. const elt = document.querySelector("#myId p.article > a");

Nous retournera uniquement Lien 6.

  1. querySelector(<selector>)

Ne revoie pas de liste de résultats, mais le premier élément qui correspond à la recherche.

  1. querySelectorAll(<selector>)

Revoie une liste de résultats correspondant au “Selector” passé en paramètre.

  1. element.children

Renvoi la liste des enfants de cet élément.

  1. element.parentElement

Renvoi LE parents de cet élément.

  1. element.nextElementSibling
  1. element.previousElementSibling

Ces propriétés nous permettent de naviguer vers l'élément suivant / précédent de même niveau que notre élément.

Si on a dans notre page HTML la l'élément suivant:

  1. <div id="parent">
  2. <div id="previous">Précédent</div>
  3. <div id="main">
  4. <p>Paragraphe 1</p>
  5. <p>Paragraphe 2</p>
  6. </div>
  7. <div id="next">Suivant</div>
  8. </div>

On aura pour accéder à cet élément avec js:

  1. const elt = document.getElementById('main');

Nous aurons ceci:

  •  elt.children

    nous retournera les éléments de type “p” qui sont les enfants de l'élément “#main” .</code>

  •  elt.parentElement

    nous retournera la “div” qui à l'id “parent”. </code>

  •  elt.nextElementSibling 

    Nous retournera l'élément qui à l'“id” “next” </code>

  •  elt.previousElementSibling 

    nous retournera l'élément qui à l'id “previous.

Modifier le contenu d'un élément

Pour modifier le contenue d'un élément: deux fonction principale.

  •  innerHTML 
  •  textContent 

Attention ces deux fonction remplace directement le contenu actuel de l'élément par celui que vous précisez.

innerHTML

innerHTML demande à ce que vous entriez du texte représentant un contenu HTML: Exemple:

  1. let element = document.getElementById('main');
  2. element.innerHTML = "<ul><li> Elément 1</li><li>Elément 2</li></ul>";

L'élément qui à l'id 'main' aura un nouveau contenu: le HTML deviendra donc:

  1. <div id="main">
  2. <ul>
  3. <li>Elément 1</li>
  4. <li>Elément 2</li>
  5. </ul>
  6. </div>

textContent

textContent , quant à elle, demande un simple texte qui ne sera pas interprété comme étant du HTML, le texte prendra la place du contenue de l'élément tel quel sans mise en forme.

Modifier des classes

Il est possible d'accéder directement à la liste des classes d'un élément avec la propriété:

 classList 

Cette propriété fournit aussi une série de fonctions permettant de modifier cette liste de classes. En voici quelques-unes:

  •  add(<string>, [<string>,...]) 

    ajoute la ou les classes spécifiées.

  •  remove(<string>, [<string>,...] 

    supprime la ou les classes spécifiées.

  •  contains(<string>) 

    vérifie si la classe spécifiée est contenue par cet élément.

  •  replace (<old>, <new>) 

    remplace l'ancienne classe par la nouvelle classe.

Exemple:

  1. element.classList.add("nouvelleClasse"); // Ajoute la classe nouvelleClasse à l'élément
  2. element.classList.remove("nouvelleClasse"); // Supprime la classe nouvelleClasse que l'on venait d'ajouter
  3. element.classList.contains("nouvelleClasse"); // Retournera false car on vient de la supprimer
  4. element.classList.replace("oldClass", "newClass"): // Remplacera oldClass par newClass si oldClass était présente sur l'élément

Changer les styles d'un élément

Avec la propriété

style

, on peut récupérer et modifier les différents styles d'un élément. style est un objet qui a une propriété pour chaque style existant. Exemple:

  1. element.style.color = "#fff"; // Change la couleur du texte de l'élément à blanche
  2. element.style.backgroundColor = "#000"; // Change la couleur de fond de l'élément en noir
  3. element.style.fontWeight = "bold"; // Met le texte de l'élément en gras

Modifier les attributs

Pour définir ou remplacer les attributs d'un élément, vous pouvez utiliser la fonction

 setAttribute 

.

 element.setAttribute(<name>, <value>) 

prend en paramètres le nom de l'attribut et sa valeur et ne retourne rien. On peut également utiliser les fonctions:

 getAttribute
 removeAttribute

pour avoir accès à plus de contrôle sur les attributs. Exemple:

  1. element.setAttribute("type", "password"); // Change le type de l'input en un type password
  2. element.setAttribute("name", "my-password"); // Change le nom de l'input en my-password
  3. element.getAttribute("name"); // Retourne my-password

Créez de nouveaux éléments

Création d'un nouveau élément

C'est la fonction

 document.createElement(<tag>) 

qui va permettre de créez de nouveaux éléments puis nous l'insérerons dans le DOM.

 document.createElement(<tag>) 

prend en paramètre le nom de la balise de notre élément et nous renvoie l'élément nouvellement créé.

  1. const newElement = document.createElement("div");

Un élément créé avec cette fonction ne fait pas encore partie du document, vous ne le verrez donc pas sur votre page. Pour le voir, il va d'abord falloir l'ajouter en tant qu'enfant à un élément.

Ajoutez des enfants

La façon la plus connue pour ajouter un élément dans notre page est

 appendChild 

Cette fonction permet d'ajouter un élément à la liste des enfants du parent depuis lequel la fonction est appelée.

 parentNode.appenChild(<element>) 

prend en paramètre l'élément à ajouter en tant qu'enfant. L'élément depuis lequel on appelle cette fonction devient donc le parent de notre élément.

Exemple:

  1. const newElt = document.createElement("div");
  2. let elt = document.getElementById("main");
  3.  
  4. element.appendChild(newElt);

Avec le code ci-dessous, nous venons de créer un nouvel élément de type, mais qui n'est pas encore rattaché au DOM. Nous avons ensuite récupéré l'élément ayant pour id

 main

. Enfin, nous avons ajouté notre nouvel élément dans les enfants de l'élément

 #main 

.

Ajoutez des enfants

Il existe les fonctions

 removeChild 

et

 replaceChild

, afin de respectivement supprimer et remplacer un élément.

 prentNode.removeChild(<element>) 

prend en paramètre l'élément à supprimer du parent et retourne cet élément.

 parentNode.replaceChild(<newElement>, <oldElement>)

prend en paramètres le nouvel élément ainsi que l'élément à remplacer, et retourne ce dernier. Exemple:

  1. const newElt = document.createElement("div");
  2. let elt = document.getElementById("main");
  3. elt.appendChild(newElt);
  4.  
  5. elt.removeChild(newElt); // Supprime l'élément newElt de l'élément elt
  6. elt.replaceChild(document.createElement("article"), newElt); // Remplace l'élément newElt par un nouvel élément de type article

Ecoutez des événements

Un événement est une réaction à une action émise par l'utilisateur, comme le clic sur un bouton ou la saisie d'un texte dans un formulaire.

Un événement en JavaScript est représenté par un nom ( “click” , “mousemove” …) et une fonction que l'on nomme une “collback”. Un événement est par défaut propagé, c'est à dire que si nous n'indiquons pas à l'événement que nous le traitons, il sera transmis à l'élément parent, et ainsi de suite jusqu'à l'élément racine.

Cette fonction “callback”, c'est nous qui allons la spécifier. Elle sera appelée à chaque fois que l'action que l'on désire suivre est exécutée. Cela signifie que si l'on désire suivre le clic sur un élément, notre fonction sera appelée à chaque fois que l'utilisateur cliquera sur cet élément.

Réagir lors d'un clic sur un élément

Ecouter un événement:

 addEventListener() 

Cette fonction nous permet d'écouter tous types d'événements (pas que le clic).

 addEventListener(<event>,<callback>) 

prend en paramètres le nom de l'événement à écouter: Tableau des événement à écouter:

Type événement Description Documentation
Animation Liés à lAPI web Animation Événements d'animation déclenchés sur Document https://developer.mozilla.org/fr/docs/Web/API/Document#animation_events, Window https://developer.mozilla.org/fr/docs/Web/API/Window#animation_events, HTMLElement https://developer.mozilla.org/fr/docs/Web/API/HTMLElement#animation_events.
Récupération asynchrone des données Événements liés à l'extraction des données. Événements déclenchés sur AbortSignal https://developer.mozilla.org/fr/docs/Web/API/AbortSignal#events, XMLHttpRequest https://developer.mozilla.org/fr/docs/Web/API/XMLHttpRequest#events, FileReader https://developer.mozilla.org/fr/docs/Web/API/FileReader#events.
Presse-papiers Les événements liés à l'API Clipboard API. Utilisé pour notifier lorsque le contenu est coupé, copié ou collé. https://developer.mozilla.org/fr/docs/Web/API/Clipboard_API Événements déclenchés sur Document, Element, Window.
Composition Événements liés à la composition ; saisie “indirecte” du texte (au lieu d'utiliser les touches normales du clavier).Par exemple, un texte saisi via un moteur de conversion de la parole en texte, ou l'utilisation de combinaisons de touches spéciales qui modifient les pressions sur le clavier pour représenter de nouveaux caractères dans une autre langue. Événements déclenchés sur Element.
Transition CSS Événements liés aux Transitions CSS. Fournit des événements de notification lorsque les transitions CSS commencent, s'arrêtent, sont annulées, etc. https://developer.mozilla.org/fr/docs/Web/CSS/CSS_Transitions Événements déclenchés sur Document, HTMLElement, Window.
Base de données Événements liés aux opérations de la base de données : ouverture, fermeture, transactions, erreurs, etc. Événements déclenchés sur IDBDatabase https://developer.mozilla.org/fr/docs/Web/API/IDBDatabase#events, IDBOpenDBRequest https://developer.mozilla.org/fr/docs/Web/API/IDBOpenDBRequest#events, IDBRequest https://developer.mozilla.org/fr/docs/Web/API/IDBRequest#events, IDBTransaction https://developer.mozilla.org/fr/docs/Web/API/IDBTransaction#events
Glisser/Déposer, Roue Les événements liés à l'utilisation de l'API Glisser/Déposer https://developer.mozilla.org/fr/docs/Web/API/HTML_Drag_and_Drop_API et WheelEvent https://developer.mozilla.org/fr/docs/Web/API/WheelEvent. Les événements de Glisser/Déposer déclenchés sur Document, Les événements de la Roue déclenchés sur Document (en-US) et Element (en-US)
Focus Les événements liés aux éléments qui gagnent et perdent le focus. Événements déclenchés sur Element, Window.
Formulaire Événements liés à la construction, la réinitialisation et la soumission de formulaires. Événements déclenchés sur HTMLFormElement.
Plein écran Evénements relatifs à l'API Fullscreen API https://developer.mozilla.org/fr/docs/Web/API/Fullscreen_API. Événements déclenchés sur Document, Element.
Manette de jeu Evénements relatifs à l'API Gamepad API. https://developer.mozilla.org/fr/docs/Web/API/Gamepad_API Événements déclenchés sur Window.
Historique Les événements liés à l'API de Manipulation de l'historique du navigateur. https://developer.mozilla.org/fr/docs/Web/API/History_API Événements déclenchés sur Window.
Gestion de l'affichage du contenu des éléments HTML Événements liés à la modification de l'état d'un élément d'affichage ou textuel. Événements déclenchés sur HTMLDetailsElement (en-US), HTMLDialogElement, HTMLSlotElement (en-US). https://developer.mozilla.org/fr/docs/Web/API/HTMLDialogElement#events
Entrées Événements liés aux éléments d'entrée HTML, par ex. <input>, <select>, ou <textarea>. Événements déclenchés sur HTMLElement https://developer.mozilla.org/fr/docs/Web/API/HTMLElement#input_events, HTMLInputElement https://developer.mozilla.org/fr/docs/Web/API/HTMLInputElement#events.
Clavier Événements liés à l'utilisation d'un clavier.Utilisé pour notifier lorsque les touches sont déplacées vers le haut, vers le bas, ou simplement pressées. Événements déclenchés sur Document, Element.
Chargement/Déchargement des documents Événements liés au chargement et au déchargement des documents. Événements déclenchés sur Window.
Manifeste Événements liés à l'installation de Manifeste des applications web. https://developer.mozilla.org/fr/docs/Web/Manifest Événements déclenchés sur Window.
Médias Événements liés à l'utilisation des médias (y compris l'API de capture et de diffusion de médias, Web Audio API, Picture-in-Picture API (en-US), etc.). Événements déclenchés sur ScriptProcessorNode (en-US), HTMLMediaElement https://developer.mozilla.org/fr/docs/Web/API/MediaStream#events, MediaStream https://developer.mozilla.org/fr/docs/Web/API/MediaStream#events
Messagerie Événements liés à la réception par une fenêtre d'un message provenant d'un autre contexte de navigation. Événements déclenchés sur Window.
Souris Événements liés à l'utilisation d'une souris d'ordinateur. Utilisé pour notifier le clic de la souris, le double-clic, les événements haut et bas, le clic droit, le déplacement dans et hors d'un élément, la sélection de texte, etc. Les événements de souris déclenchés sur Element
Réseau/Connexion Événements liés à l'obtention et à la perte d'une connexion réseau. Événements déclenchés sur Window. Événements déclenchés sur NetworkInformation (en-US) (Network Information API).
Paiements Les événements liés à l'API Payment Request API. https://developer.mozilla.org/fr/docs/Web/API/Payment_Request_API Événements déclenchés sur PaymentRequest (en-US), PaymentResponse (en-US).
Performance Événements liés aux APIs Performance API, Performance Timeline API, Navigation Timing API (en-US), User Timing API (en-US), et Resource Timing API (en-US). Événements déclenchés sur Performance. https://developer.mozilla.org/fr/docs/Web/API/Performance#events
Pointeur Les événements liés à l'API Pointer Events API.Fournit une notification agnostique du matériel à partir des dispositifs de pointage, y compris la souris, la souris tactile, le stylo/stylet. https://developer.mozilla.org/fr/docs/Web/API/Pointer_events Événements déclenchés sur Document, HTMLElement.
Impression Événements liés à l'impression. Événements déclenchés sur Window.
Rejet de promesse Événements envoyés au contexte global du script lorsqu'une promesse JavaScript est rejetée. Événements déclenchés sur Window.
Sockets Les événements liés à l'API WebSockets API. https://developer.mozilla.org/fr/docs/Web/API/WebSockets_API Événements déclenchés sur Websocket. https://developer.mozilla.org/fr/docs/Web/API/WebSocket#events
SVG Événements liés aux images SVG. Événements déclenchés sur SVGElement, https://developer.mozilla.org/fr/docs/Web/API/SVGElement#events
Sélection de texte Événements liés à la sélection du texte. https://developer.mozilla.org/fr/docs/Web/API/Selection Événements déclenchés sur Document.
Tactile Les événements liés à l'API Événements tactiles. https://developer.mozilla.org/fr/docs/Web/API/Touch_events Événements déclenchés sur Document, Element.
Réalité virtuelle Les événements liés à l'API WebXR Device API. https://developer.mozilla.org/fr/docs/Web/API/WebXR_Device_API
RTC (communication en temps réel Les événements liés à l'API WebRTC API.https://developer.mozilla.org/fr/docs/Web/API/WebRTC_API
Evenement envoyés par le serveur Les événements liés à l'API des événements envoyés par le serveur. https://developer.mozilla.org/fr/docs/Web/API/Server-sent_events Événements déclenchés sur EventSource. https://developer.mozilla.org/fr/docs/Web/API/EventSource#events
Synthèse vocale Les événements liés à l'API Web Speech API. https://developer.mozilla.org/fr/docs/Web/API/Web_Speech_API Événements déclenchés sur SpeechSynthesisUtterance. https://developer.mozilla.org/fr/docs/Web/API/SpeechSynthesisUtterance#events
Workers Les événements liés aux APIs Web Workers API, Service Worker API Événements déclenchés sur ServiceWorkerGlobalScope, DedicatedWorkerGlobalScope, SharedWorkerGlobalScope, WorkerGlobalScope, Worker, WorkerGlobalScope

Exemple avec un événement “click sur la souris”: Réagir au click sur un lien, il faut d'abord récupérer l'élément qui correspond à votre lien, comme nous l'avons vu précédemment. Ensuite, vous allez appeler la méthode:

 element.addEventListener('click', onClick);

directement sur cet élément.

“onClick” correspond à la fonction que vous allez définir et qui sera appelée à chaque fois que l'utilisateur cliquera sur votre lien. Le comportement par défaut de l'élément actionné sera tout de même exécuté. Le lien ou ouvrira la page, le formulaire sera envoyer etc …

Exemple:

  1. const elt = document.getElementById('mon-lien'); // On récupère l'élément sur lequel on veut détecter le clic
  2. elt.addEventListener('click', function() { // On écoute l'événement click
  3. elt.innerHTML = "C'est cliqué !"; // On change le contenu de notre élément pour afficher "C'est cliqué !"
  4. });

Même exemple en modifiant le comportement par défaut de l'élément clicker:

  1. const elt = document.getElementById('mon-lien'); // On récupère l'élément sur lequel on veut détecter le clic
  2. elt.addEventListener('click', function(event) { // On écoute l'événement click, notre callback prend un paramètre que nous avons appelé event ici
  3. event.preventDefault(); // On utilise la fonction preventDefault de notre objet event pour empêcher le comportement par défaut de cet élément lors du clic de la souris
  4. });

De plus : avec

 stopPropagation() 

, vous pouvez ainsi empêcher que d'autres éléments reçoivent l'événement. Exemple:

  1. elementInterieur.addEventListener('click', function(event) {
  2. event.stopPropagation();
  3. elementAvecMessage.innerHTML = "Message de l'élément intérieur";
  4. });

De cette manière, lorsque l'on clique sur l'élément intérieur, l'élément parent ne recevra plus le clic, et seul l'élément intérieur affichera son message. Par contre, en cliquant directement dans l'élément parent, sans être dans l'élément intérieur, l'élément parent recevra bien l'événement et affichera bien son message.

Récupérez des données utilisateurs avec les événement

Nous savons écouter un événement, mais on ne sait pas encore comment récupérer la position de la souris, ou le texte saisi.

Lorsqu'on reçoit un événement, notre fonction callback reçoit un paamètre contenant des informations sur cet événement. Ces information sont recues sous la forme d'un objet qui dépendra du type d'événement reçu. De plus chaque événement implémente l'objet “Event”. C'est à dire que chaque événement a au minimum les même fonctions et propriétés que l'objet “Event”: https://developer.mozilla.org/fr/docs/Web/API/Event

  • AnimationEvent
  • AudioProcessingEvent
  • BeforeInputEvent
  • BeforeUnloadEvent
  • BlobEvent
  • CloseEvent
  • CompositionEvent
  • CSSFontFaceLoadEvent
  • CustomEvent
  • DeviceMotionEvent
  • DeviceOrientationEvent
  • DOMTransactionEvent
  • EditingBeforeInputEvent
  • ErrorEvent
  • FetchEvent
  • FocusEvent
  • InputEvent
  • KeyboardEvent
  • MediaStreamEvent
  • MessageEvent
  • MouseEvent
  • PageTransitionEvent
  • PointerEvent
  • RelatedEvent
  • SensorEvent
  • SVGZoomEvent
  • TransitionEvent
  • UIEvent
  • WheelEvent

Détection de la souris

Dès que la souris bouge, notre fonction callback sera appelée avec un paramètre detype “MouseEvent”, qui contient les données sur le mouvement de la souris.

Entre autres, ce que cet objet nous permet de récupérer:

  • “clientX” / “clientY” = position de la souris dans les coordonnées locales (contenu du DOM)
  • “offsetX” / “offsetY” = position de la souris par rapport à l'élément sur lequel on écoute l'évenement.
  • “pageX” / “pageY” = position de la souris par rapport au document entier.
  • “screenX” / “screenY” = position de la souris par rapport à la fenêtre du navigateur.
  • “movementX” / “movementY” = position de la souris par rapport à la position de la souris lors du dernier événement “mousemove”.

Exemple:

  1. element.addEventListener('mousemove', function(event) {
  2. const x = event.offsetX; // Coordonnée X de la souris dans l'élément
  3. const y = event.offsetY; // Coordonnée Y de la souris dans l'élément
  4. });

Lire le contenu d'un champ texte

On peut voir dans la liste des événements qu'il existe un événement “change”. Si on regarde sa doc, https://developer.mozilla.org/en-US/docs/Web/Events/change , on peut voir que c'est un événement qui fonctionne avec les éléments de ty ”<input>“, ”<select> et “<textarea>” . Cet événement est déclenché lorsque le champ perd le focus, c'est à dire lorsque l'utilisateur passe à autre chose en cliquant ailleurs et qu'il a fini sa saisie pour ce champ. Cet événement fonctionne aussi pour les cases à cocher “<checkbox>” et les cases à choix unique “<radio>” .

Exemple: Pour récupérer la valeur de notre champ une fois qu'il a été modifié, il suffit d'accéder à la valeur de l'élément cible : “event.target.value” . En effet ici “target” correspond à l'élément sur lequel s'est produit l'événement, c'est à dire un champ de type “<input>”.

Dans le cas ou je souhaite pouvoir avoir la valeur dès que l'utilisateur ajoute ou supprime une lettre, on va utilisé l'événement “input” https://developer.mozilla.org/en-US/docs/Web/Events/input , qui fonctionne comme “change” sauf qu'il est déclenché dès que le contenu du champs est modifié, même si l'utilisateur n'a pas encore fini de saisir ce qu'il souhaite.

  1. input.addEventListener('input', function(event) {
  2. output.innerHTML = event.target.value;
  3. });

API et service web

Les services web et les API sont des éléments essentiels aux applications web. N’importe quel site sur lequel vous naviguez est un service web, et il fournit une API pour communiquer avec

Service web = programme s'exécutant sur un serveur accessible depuis internet et fournissant un service. Le but d'un service web est donc de fournir un service à celui qui le demande et pour ce faire il met à disposition une API (Application Programming Interface).

API = ensemble des demandes que l'on peut faire à un service web. Ces demandes sont appelées des requêtes.

Requêtes = données qui respectent le protocole de communication approprié et qui sont envoyées au serveur.

Pour notre cas nous allons nous limiter aux requête respectant le protocole HTTP:

  • Les méthodes = action que l'on souhaite faire.
    • GET = récupérer des ressources
    • POST = créer ou modifier une ressources
    • PUT = modifier une ressource
    • DELETE = supprimer une ressource.
  • L'URL = adresse du serveur ayant le service web demandé
  • Les données = ressources à traiter.

Une fois la requête soumis, le serveur répond et renvoi:

  • des données = une page HTML par exemple.
  • Le code HTTP = code numérique indiquant comment s'est déroulée la requête.
    • 200 : indique que tout s'est bien passé
    • 400 : indique que votre requête n'est pas conforme à ce qui est attendu
    • 401 : indique que vous devez être authentifié pour faire cette requête
    • 403 : indique que vous êtes bien authentitfié mais que vous n'êtes pas autorisé à faire cette requête.
    • 404 : indique que la ressource demandée n'existe pas.
    • 500 : indique une erreur avec le service web.

Fetch

Fetch est un ensemble d'objets et de fonctions mis à disposition par le langage JavaScript, afin d'exécuter des requêtes HTTP de manière asynchrone.

L'API Fetch va nous permettre d'exécuter des requêtes HTTP sans avoir besoin de recharger la page du navigateur. Cela à plusieurs avantages:

  • Avoir un site plus réactif (pas besoin de recharger la page)
  • Améliorer l'expérience utilisateur avec des contenue dynamique.

Envoyer une requête:

  1. fecth ("http://url-service-web.com/api/users");

Ce code nous permet d'envoyer une requête HHTP de type “GET” au service web se trouvant à l'adresse

 http://url-service-web.com/api/users 

.

Maintenant il faut récupérer et interpréter la réponse à la requête faite par le serveur.

Un service web peut choisir le format qu'il veut pour nous revoyer des données, mais le plus courant et le plus simple est le format JSON.

JSON

JSON = JavaScript Object Notation. Il s'agit d'un format textuel se rapprochant en termes de syntaxe de celui des objets dans le langage JavaScript.

Exemple, l'objet JavaScript suivant:

  1. const obj = {
  2. name: "Mon contenu",
  3. id: 1234,
  4. message: "Voici mon contenu",
  5. author: {
  6. name: "John"
  7. },
  8. comments: [
  9. {
  10. id: 45,
  11. message: "Commentaire 1"
  12. },
  13. {
  14. id: 46,
  15. message: "Commentaire 2"
  16. }
  17. ]
  18. };

Sera retranscrit ainsi en JSON:

  1. {
  2. "name": "Mon contenu",
  3. "id": 1234,
  4. "message": "Voici mon contenu",
  5. "author": {
  6. "name": "John"
  7. },
  8. "comments": [
  9. {
  10. "id": 45,
  11. "message": "Commentaire 1"
  12. },
  13. {
  14. id: 46,
  15. "message": "Commentaire 2"
  16. }
  17. ]
  18. }

Le gros avantage de ce format (json) lorsqu'il est utilisé avec lde langage JavaScript est qu'il n'y a pas besoin de le parser comme on le ferait avec du XML. LE deuxième gros avantage du format (json) est sa légèreté par rapport à un format comme le XML, qui reste bien plus verbeux, la communication avec un service web en json optimisera donc les temps de réponse.

Récupérez le résultat de la requête:

Fetch va nous renvoyer une “Promise”. La Promise est un objet qui fournit une fonction “then” qui sera exécutée quand le résultat aura été obtenu, et une fonction catch qui sera appelée s'il y a une erreur qui est survenue lors de la requête.

Exemple voici comment procéder avec un service qui fait un simple echo:

  1. fetch(“https://mockbin.com/request”)
  2. .then(function(res) {
  3. if (res.ok) {
  4. return res.json();
  5. }
  6. })
  7. .then(function(value) {
  8. console.log(value);
  9. })
  10. .catch(function(err) {
  11. // Une erreur est survenue
  12. });

L'URL passée à la fonction “fetch()” correspond à l'URL de notre service web. Type de requête GET (par defaut avec Fetch) pour récupérer les données. Nous appelons ensuite la fonction “then()” pour récupérer le résultat de la requête au format json en ayant vérifié au préalable que la requête s'était bien passée avec “res.ok”. Ce résultat “json” étant lui aussi une “Promise”, nous le retrounons et récupérons sa vraie valeur dans la fonction then() suivante: Voici ce que nous obtenons de l'API à l'heure où j'écris ces lignes:

Validez les données saisies des utilisateurs

Validez les données suite à des événements

Afin de valider les données utilisateurs, vous pouvez vous aider des événements du DOM. Ainsi, vous pouvez écouter l'événement “onChange” pour vérifier la donnée, dès que l'utilisateur a fini de l'éditer. Ou bien vous pouvez écouter l'événement “onInput” pour vérifier la donnée à chaque nouveau caractère.

Par exemple, vous pouvez vérifier que ce qui est saisi commence par “Hello” avec le code suivant :

  1. myInput.addEventListener('input', function(e) {
  2. var value = e.target.value;
  3. if (value.startsWith('Hello ')) {
  4. isValid = true;
  5. } else {
  6. isValid = false;
  7. }
  8. });

Validation plus complexe avec les Regex

Regex permet de vérifier qu'un texte corresponde à une description que l'on a définie. Ainsi, si l'on veut savoir si notre texte commence par la lettre e et est suivi d'au moins 3 chiffres, on écrira la regex suivante :

  1. function isValid(value) {
  2. return /^e[0-9]{3,}$/.test(value);
  3. }

Documentation Regex: https://regexr.com/

Les contraintes HTML5

Depuis HTML version 5, il est possible d'ajouter de la validation directement dans le code HTML, sans avoir besoin d'écrire la moindre ligne de JavaScript.

Pour cela, différents attributs sont ajoutés et permettent d'empêcher la soumission d'un formulaire si toutes les validations ne sont pas respectées.

l'attribut type pour les inputs

Pour valider les informations saisies dans une balise “input” , il est possible d'utiliser l'attribut “type” .

L'attribut “type” de la balise “input” ne prend pas seulement comme valeurs “text” et “password” . Cela peut aussi être “email” , “tel” , “URL” , “date” et bien d'autres.

Lorsque vous ajoutez un élément “input” avec un attribut type=“email” , le navigateur empêchera la soumission du formulaire si ce n'est pas une adresse email correcte.

Les attributs de validations simples

En fonction du “type” de l' “input” , vous pouvez utiliser différents attributs pour perfectionner votre validation :

  • “min” / “max” : fonctionne avec des champs de type nombre ou date. Cela permet de définir une valeur minimum et une valeur maximum autorisées ;
  • “required” : fonctionne avec à peu près tous les types de champs. Cela rend obligatoire le remplissage de ce champ ;
  • “step” : fonctionne avec les dates ou les nombres. Cela permet de définir une valeur d'incrément lorsque vous changez la valeur du champ via les flèches ;
  • “minlength” / “maxlength” : fonctionne avec les champs textuels ( text , url , tel , email …). Cela permet de définir un nombre de caractères minimum et maximum autorisé.
Les patterns

Nous avons vu qu'il était possible d'avoir une validation complexe grâce aux Regex en JavaScript. Eh bien c'est aussi possible directement en HTML5 avec l'attribut “pattern” . Il suffit de définir une Regex dans cet attribut, et vous obligez la valeur du champ correspondant à la respecter.

Par exemple, si on prend le code suivant :

  1. <input type="text" pattern="[0-9]{,3}" />

il empêchera un utilisateur d'entrer autre chose que des chiffres, et limitera leur nombre à 3 chiffres.

Documentation : https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/HTML5/Constraint_validation

Sauvegardez des données sur le service web

Pour envoyer des données a un serveur par l'HTTP ou HTTPS on a les méthodes POST et PUT.

POST

Afin d'envoyer des données à un service web avec la méthode POST via AJAX, nous allons devoir passer par la méthode “send()” en lui passant en paramètres les données à envoyer.

  1. fetch("http://url-service-web.com/api/users", {
  2. method: “POST”,
  3. headers: {
  4. 'Accept': 'application/json',
  5. 'Content-Type': 'application/json'
  6. },
  7. body: JSON.stringify(jsonBody)
  8. });

Comme vous pouvez le voir, nous avons passé le contenu à envoyer au service web à notre fonction fetch() . Étant donné que l'on souhaite envoyer du JSON à notre service web, nous avons d'abord besoin de transformer notre objet JavaScript en JSON (qui, rappelons-le, est un format textuel, c'est-à-dire que c'est simplement du texte, contrairement à un objet JavaScript qui est une structure complexe du langage).

Pour faire cette transformation, nous utilisons la fonction JSON.stringify(json) . Toujours parce que l'on souhaite envoyer du JSON à notre service web, il faut alors le prévenir qu'il va recevoir du JSON. Cela se fait grâce à des headers, qui sont des en-têtes envoyés en même temps que la requête pour donner plus d'informations sur celle-ci. Les headers en question sont :

  • “Content-Type” , avec la valeur application/json,
  • “Accept” , avec la valeur application/json.

Ces options sont envoyées avec la requête grâce au second paramètre de la fonction fetch(). Ce paramètre est un objet qui permet de définir :

  • La méthode HTTP, le body, c'est à dire les données qu'on souhaite envoyer,
  • Les headers qui donnent un peu plus d'information sur notre requête.

PUT

PUT fonctionne exactement de la même manière que POST.

L'utilisation de l'Asynchrone en JavaScript

Définition

Un code Synchrone est un code qui s'execute ligne après ligne, la ligne suivant ne commence que lorsque la précedente à terminer de s'éxécuter. Comme du mono-Thread. Un code Asynchrone est un code qui execute des lignes en parallèle, comme du multy-thread.

Or JavaScript est mono-Thread et Synchrone, cependant le coeur de javaScript fonctionne autour de la technologie Event Loop, permettant de classer les fonctions en plusieurs liste d'attente d'execution , l'une synchrone et l'autre asynchrone, permettant de simuler un multy-thread.

Méthode "setTimeout" pour utiliser l'asynchrone en JavaScript

Cette fonction est très répandue lorsque l'on veut exécuter du code asynchrone sans bloquer le fil d'exécution en cours. Cette fonction prend 2 Paramètres:

  • La fonction à exécuter de manière asynchrone (qui sera donc ajoutée à la file d'attente de l'event loop);
  • le délai, en millisecondes, avant d'exécuter cette fonction.
  1. setTimeout(function() {
  2. console.log("I'm here!")
  3. }, 5000);
  4.  
  5. console.log("Where are you?");

Dans l'exemple ci-dessus, le texte “Where are you?” s'affichera avant “i'm here!”, qui ne sera affiché qu'au bout de 5 secondes.

La fonction “setTimeout” nous retourne une valeur permettant d'identifier le code asynchrone que l'on veut exécuter. Il est possible de passer cet identifiant en paramètre à la fonction “clearTimout”, si vous souhaiez annuler l'exécution asynchrone de la fonction avant qu'elle ne soit exécutée.

Documentation setTimeout: https://www.w3schools.com/jsref/met_win_settimeout.asp

Les autres "setTimeout" pour utiliser l'asynchrone en JavaScript

Il existe d'autres méthodes un peu moins répandues, voire très peu utilisées:

  • setInterval : fonctionne comme “setTimeout” , à ceci près qu'elle exécute la fonction passée en paramètre en boucle à une fréquence déterminée par le temps en millisecondes passé en second paramètre.Il suffira de passer la valeur de retour de setInterval à clearInterval pour stopper l'exécution en boucle de la fonction.
  • setImmediate: Cette fonciton prend en seul paramètre la fonction à exécuter de façon synchrone. La fonction en question sera placée dans la file d'attente de l'event loop, mais va passer devant toutes les autres fonctions, sauf certaines spécifiques au Javascript.

Fonction asynchrone par nature

  • Les evenements: Sont toujours exécutés de façon asynchrone.
  • Les input/output aux sens large sont toujours exécutés de façon asynchrone.
  • Quelques autres… (callBack, Promise, et les Async/Await)

CallBacks

Une callback est simplement une fonction que vous définissez. Le principe de la callback est de la passer en paramètre d'une fonction asynchrone. Une fois que la fonction asynchrone a fini sa tâche, elle va appeler notre fonction callback en lui passant un résultat.

exemple:

  1. element.addEventListener('click', function(e) {
  2. // Do something here ...
  3. });

Les callbacks sont faciles à comprendre et à utiliser, mais elles souffrent d'un gros problème de lisibilité du code, via ce qu'on appelle le callback hell. En effet, on se retrouve régulièrement dans des situations où on va imbriquer plusieurs couches de callbacks , rendant le code difficile à lire et pouvant générer des erreurs.

  1. elt.addEventListener('click', function(e) {
  2. mysql.connect(function(err) {
  3. mysql.query(sql, function(err, result) {
  4. fs.readFile(filePath, function(err, data) {
  5. mysql.query(sql, function(err, result) {
  6. // etc ...
  7. });
  8. });
  9. });
  10. });
  11. });

C'est bien beau de gérer du code asynchrone, mais rien ne vous garantit que tout se soit bien passé. Il nous faut donc un mécanisme pour savoir si une erreur est survenue !

Gerer les erreurs callbacks

Pour gérer les erreurs avec les callbacks, la méthode la plus utilisée est de prendre 2 paramètres dans notre callback. Le 2e paramètre est notre donnée et le 1er est l'erreur. Si elle n'est pas null ou undefined, elle contiendra un message d'erreur indiquant qu'une erreur est intervenue.

Si on reprend l'exemple ci-dessus, on voit par exemple que la lecture d'un fichier avec le module fs peut nous retourner une erreur :

exemple:

  1. fs.readFile(filePath, function(err, data) {
  2. if (err) {
  3. throw err;
  4. }
  5. // Do something with data
  6. });

Promise

Lorsqu'on l'on exécute du code asynchrone, celui-ci va immédiatement nous retourner une “promesse” qu'un résultat nous sera envoyé prochainement.

Cette promesse est en fait un objet “Promise” qui peut être “resolve” avec un résultat, ou “reject” avec une erreur.

Lorsque l'on récupère une “Promise”, on peut utiliser sa fonction “then()” pour exécuter du code dès que la promesse est résolue, et sa fonction “catch()” pour exécuter du code dès qu'une erreur est survenue.

Exemple:

  1. functionThatReturnsAPromise()
  2. .then(function(data) {
  3. // Do somthing with data
  4. })
  5. .catch(function(err) {
  6. // Do something with error
  7. });

Dans l'exemple ci-dessus, la fonction “functionThatReturnsAPromise” nous renvoie une Promise . On peut donc utiliser sa fonction “then()” en lui passant une fonction qui sera exécutée dès qu'un résultat sera reçu (avec le résultat en question passé à notre fonction). On peut aussi utiliser sa fonction “catch()” en lui passant une fonction qui sera exécutée si une erreur est survenue (avec l'erreur en question passée à notre fonction).

Le gros avantage est que l'on peut aussi chaîner les “Promise”.

exemple:

  1. returnAPromiseWithNumber2()
  2. .then(function(data) { // Data is 2
  3. return data + 1;
  4. })
  5. .then(function(data) { // Data is 3
  6. throw new Error('error');
  7. })
  8. .then(function(data) {
  9. // Not executed
  10. })
  11. .catch(function(err) {
  12. return 5;
  13. })
  14. .then(function(data) { // Data is 5
  15. // Do something
  16. });

Dans l'exemple ci-dessus, la fonction “returnAPromiseWithNumber2” nous renvoie une “Promise” qui va être résolue avec le nombre “2”. La première fonction “then()” va récupérer cette valeur. Puis, dans cette fonction on retourne “2+1”, ce qui cré une nouvelle “Promise” qui est immédiatement résolue avec “3”. Puis, dans le “then()” suivant, nous retournons une erreur. De ce fait, le “then()” qui suit ne sera pas appelé et c'est le “catch()” suivant qui va être appelé avec l'erreur en question. Lui-même retourne une nouvelle valeur qui est transformée en “Promise” qui est immédiatement résolue avec la valeur “5”. Le dernier “then()” va être exécuté avec cette valeur.

“catch” intercepte les erreurs des “Promise”.

Async/Await

“async” et “await” sont 2 nouveaux mots clés qui permettent de gérer le code asynchrone de manière beaucoup plus intuitive, en bloquant l'exécution d'un code asynchrone jusqu'à ce qu'il retourne un résultat.

  1. async function fonctionAsynchrone1() {/* code asynchrone */}
  2. async function fonctionAsynchrone2() {/* code asynchrone */}
  3.  
  4. async function fonctionAsynchrone3() {
  5. const value1 = await fonctionAsynchrone1();
  6. const value2 = await fonctionAsynchrone2();
  7. return value1 + value2;
  8. }

Gerer des erreurs async/await

async/await utilisant les “Promise”, la levée d'une erreur se fait aussi par une exception. Pour intercepter cette erreur, par contre, il suffit d'exécuter notre code asynchrone dans un bloc “try{] catch(e){}” , l'erreur étant envoyée dans le “catch”.

Parallélisez plusieurs requêtes HTTP

Enchaînez des requêtes avec les callbacks

On peut formuler plusieurs requêtes serveur en parallèle puis ensuite les suivre avec une requête en séquence avec les callbacks.

Pour cet exemple, nous partons du principe que nous avons accès à 2 fonctions (get et post). Elles font respectivement une requête “GET” et une requête “POST” et elles prennent en paramètre :

  • l'URL de la requête,
  • Une callback à executer quand on a le résultat (avec une variable d'erreur en premier paramètre).
  1. var GETRequestCount = 0;
  2. var GETRequestResults = [];
  3.  
  4. function onGETRequestDone(err, result) {
  5. if (err) throw err;
  6.  
  7. GETRequestCount++;
  8. GETRequestResults.push(result);
  9.  
  10. if (GETRequestCount == 2) {
  11. post(url3, function(err, result) {
  12. if (err) throw err;
  13.  
  14. // We are done here !
  15. });
  16. }
  17. }
  18.  
  19. get(url1, onGETRequestDone);
  20. get(url2, onGETRequestDone);

Afin d'exécuter 2 requêtes “GET” en même temps, nous pouvons appeler 2 fois la fonction “get()”. Etant donné que cette fonction est asynchrone, elle ne bloquera pas l'exécution du code. Ainsi l'autre fonciton “get()” sera aussi appelée alors que la première ne sera pas encore terminée. C'est comme ça qu'on peut avoir 2 requêtes en parallèle.

Par contre, nous voulons exécuter une requête “POST” une fois que les 2 requêtes “GET” sont terminées, et pas avant! Pour ce faire, nous devons savoir si les requêtes “GET” sont terminées. C'est pour ça que la variable “GETRequestCount” est créée. On va l'incrémenter dans la fonction callback que l'on a envoyée aux appels à “get()”, et si on atteint 2 (le nombre de requêtes “GET” qu'on a faites; alors on va exécuter la requête “POST”.

“GETRequestResults” sert à conserver les réponses des requêtes “GET”, car on ne les a pas toutes les 2 en même temps.

Enchaînez des requêtes avec les Promise

Grâce à la fonction “Promise.all”, voyons comment exécuter nos requêtes en parallèle et en séquence avec les “Promise”.

Pour cet exemple, nous partons du principe que nous avons accès à 2 fonctions ( “get” et “post” ) qui font respectivement une requête “GET” et une requête POST quand on leur passe en paramètre l'URL de la requête. Ces fonctions retourneront une Promise avec le résultat de la requête.

  1. Promise.all([get(url1), get(url2)])
  2. .then(function(results) {
  3. return Promise.all([results, post(url3)]];
  4. })
  5. .then(function(allResults) {
  6. // We are done here !
  7. });

Ici, nous utilisons la fonction “Promise.all” qui prend en paramètre une liste de “Promise” (cela peut aussi être de simples valeurs qui sont alors transformées en “Promise” résolues), et qui permet de toutes les exécuter en parallèle et de retourner une nouvelle Promise qui sera résolue quand toutes les Promise seront résolues.

Ainsi, la fonction “then()” recevra les résultats de toutes les “Promise” sous forme d'un tableau.

Afin d'exécuter notre requête POST une fois que les requêtes “GET” sont terminées, nous l'exécutons donc dans la fonction “then()”.

Notez: Notez que dans la fonction “then()”, nous faisons encore une fois appel à la fonction Promise.all en lui passant les résultats des requêtes “GET” et notre requête “POST”. Étant donné que “Promise.all” considère les simples valeurs comme des Promise résolues, cela nous permet, dans le prochain “then()”, de récupérer une liste qui contient les résultats des requêtes “GET” et le résultat de la requête “POST” :“allResults = [ [ getResult1, getResult2 ], postResult ]”.

Enchaînez des requêtes avec les async/await

Finalement, voyons comment exécuter le même code mais avec async / await .

Pour cet exemple, nous partons du principe que nous avons accès à 2 fonctions ( “get” et “post” ) qui font respectivement une requête “GET” et une requête “POST” quand on leur passe en paramètre l'URL de la requête. Ces fonctions sont asynchrones (avec le mot clé “async”).

  1. async function requests() {
  2. var getResults = await Promise.all([get(url1), get(url2)]);
  3. var postResult = await post(url3);
  4. return [getResults, postResult];
  5. }
  6.  
  7. requests().then(function(allResults) {
  8. // We are done here !
  9. });

Nous utilisons aussi la fonction “Promise.all” dans ce code, car c'est comme ça que l'on peut exécuter des fonctions asynchrones en parallèle (rappelez-vous que “async” correspond en arrière-plan à une “Promise”).

Par contre, ici, nous utilisons “await” devant “Promise.all” afin d'attendre la fin de l'exécution des 2 requêtes “GET”, puis nous utilisons “await” devant la requête “POST” afin d'attendre son résultat. Puis nous renvoyons un tableau avec tous les résultats.

Lorsque nous appelons la fonction “requests()”, ici, nous utilisons “then()” pour récupérer tous les résultats (mais vous auriez aussi pu utiliser “await” au sein d'une autre fonction avec le mot clé “async”).

Optimisation du code

Linter, minifier, bundler, transpiler

  1.  
code_language/javascript.1762097453.txt.gz · Dernière modification: 2025/11/02 15:30 de 74.7.227.242