Écouteurs d'événements en JavaScript
Écouteurs d'événements en JavaScript
Programmation Web 2
JavaScript
4. Événements JavaScript
f. Les écouteurs d'événements (Event Listeners)
4. Événements JavaScript
f. Les écouteurs d'événements (Event Listeners)
4. Événements JavaScript
f. Les écouteurs d'événements (Event Listeners)
Les paramètres:
event: type d'événement.
function: fonction d'écoute.
useCapture: booléen supplémentaire (facultatif spécifie s'il faut utiliser le bullage
ou la capture d'événements : bubbling or capturing events).
4. Événements JavaScript
e. Les écouteurs d'événements (Event Listeners)
Comprendre les écouteurs d'événements
4. Événements JavaScript
f. Les écouteurs d'événements (Event Listeners)
Par exemple:
4. Événements JavaScript
f. Les écouteurs d'événements (Event Listeners)
4. Événements JavaScript
f. Les écouteurs d'événements (Event Listeners)
4. Événements JavaScript
f. Propagation des événements JavaScript (Event Propagation)
Comprendre la propagation des événements
Supposons que vous ayez assigné un gestionnaire d'événements de clic à un lien
hypertexte imbriqué dans un paragraphe.
<p>
<a href="#" onclick="alert('You have clicked a link!');">Click Me</a>
</p>
Si vous cliquez sur ce lien, le gestionnaire sera exécuté.
Si on l’assigne au paragraphe qui contient ce lien.
<p onclick="alert('You have clicked a link!');">
<a href="#" >Click Me</a>
</p>
Un clic sur le lien déclenchera le gestionnaire d'événements de clic de l’élément p.
Les événements n'affectent pas seulement l'élément cible (a) qui les a généré, mais ils
parcourent l'arborescence DOM pour atteindre leur cible(p).
C'est ce qu'on appelle la propagation
Prof. d'événements.
NABIL Mohamed 158
JavaScript
4. Événements JavaScript
f. Propagation des événements JavaScript (Event Propagation)
<form onclick="alert('form')">FORM
<div onclick="alert('div')">DIV
<p onclick="alert('p')">P </p>
</div>
</form> Prof. NABIL Mohamed 159
JavaScript
4. Événements JavaScript
f. Propagation des événements JavaScript (Event Propagation)
4. Événements JavaScript
f. Propagation des événements JavaScript (Event Propagation)
4. Événements JavaScript
f. Propagation des événements JavaScript (Event Propagation)
4. Événements JavaScript
f. Propagation des événements JavaScript (Event Propagation)
4. Événements JavaScript
f. Propagation des événements JavaScript (Event Propagation)
Comprendre la propagation des événements
[Link] et this
<!DOCTYPE html> div, p, a{
<html> padding: 15px 30px;
<head> display: block;
<meta charset="utf-8"> border: 2px solid #000;
<link rel="stylesheet" href="[Link]"> background: #fff;
</head> }
<body>
A click shows both [Link] and this to compare: let div = [Link]("wrap");
<div id="wrap">DIV [Link] = function(event) {
<p class= "hint">P [Link] = "lightblue";
<a href= "#">A </a> setTimeout(() => {
</p> alert("target = " + [Link] + ",
</div> this = " + [Link]);
<script src="[Link]"></script> [Link] = ''
</body> }, 0);
Prof. NABIL
} Mohamed 164
</html>
JavaScript
4. Événements JavaScript
f. Propagation des événements JavaScript (Event Propagation)
4. Événements JavaScript
f. Propagation des événements JavaScript (Event Propagation)
Comprendre la propagation des événements
Arrêter le bubbling: [Link]()
<!DOCTYPE html> div, p, a{
<html> padding: 15px 30px;
<head> display: block;
<meta charset="utf-8"> border: 2px solid #000;
<link rel="stylesheet" href="[Link]"> background: #fff;
</head> }
<body>
<div id="wrap">DIV function showAlert(event) {
<p class= "hint">P alert("You clicked: "+ [Link]);
<a href= "#">A </a> [Link]();
</p> }
</div>
<script src="[Link]"></script> let elems = [Link]("div, p, a");
</body> for(let elem of elems) {
</html> [Link]("click", showAlert);
Prof. NABIL
} Mohamed 166
JavaScript
4. Événements JavaScript
f. Propagation des événements JavaScript (Event Propagation)
4. Événements JavaScript
f. Propagation des événements JavaScript (Event Propagation)
Comprendre la propagation des événements
Arrêter le bubbling: stopImmediatePropagation()
<!DOCTYPE html> div, p, a{
<html> padding: 15px 30px;
<head> display: block;
<meta charset="utf-8"> border: 2px solid #000;
<link rel="stylesheet" href="[Link]"> background: #fff;
</head> }
<body> function sayHi() {
<div onclick="alert('You clicked: ' + [Link])">DIV alert("Hi, there!");
<p onclick="alert('You clicked: ' + [Link])">P [Link]();
<a href= "#" id=“link">A </a> }
</p> function sayHello() {
</div> alert("Hello World!");
<script src="[Link]"></script> }
</body> let link = [Link]("link");
</html> [Link]("click", sayHi);
Prof. NABIL Mohamed
[Link]("click", sayHello); 168
JavaScript
4. Événements JavaScript
f. Propagation des événements JavaScript (Event Propagation)
4. Événements JavaScript
f. Propagation des événements JavaScript (Event Propagation)
Comprendre la propagation des événements
Empêcher l'action par défaut: preventDefault()
<body>
<form action="/examples/html/[Link]" method="post" id="users">
<label>First Name:</label>
<input type="text" name="first-name" id="firstName">
<input type="submit" value="Submit" id="submitBtn">
</form>
<script>
let btn = [Link]("submitBtn");
[Link]("click", function(event) {
let name = [Link]("firstName").value;
alert("Sorry, " + name + ". The preventDefault() won't let you submit this form!");
[Link](); // Prevent form submission
});
</script>
</body> Prof. NABIL Mohamed 170
JavaScript
4. Événements JavaScript
f. Propagation des événements JavaScript (Event Propagation)
Par exemple, si l'utilisateur clique sur un lien hypertexte, cet événement de clic
passera par l'élément <html>, l'élément <body> et l'élément <p> contenant le lien.
4. Événements JavaScript
f. Propagation des événements JavaScript (Event Propagation)
4. Événements JavaScript
f. Propagation des événements JavaScript (Event Propagation)
4. Événements JavaScript
f. Propagation des événements JavaScript (Event Propagation)
Comprendre la propagation des événements
Capturing
<!DOCTYPE html> div, p, a{
<html> padding: 15px 30px;
<head> display: block;
<meta charset="utf-8"> border: 2px solid #000;
<link rel="stylesheet" href="[Link]"> background: #fff;
</head> }
<body>
<div id="wrap">DIV function showTagName() {
<p class= "hint">P alert(« capturing: "+ [Link]);
<a href= "#">A </a> }
</p>
let elems = [Link]("div, p, a");
</div>
for(let elem of elems) {
<script src="[Link]"></script> [Link]("click", showTagName, true);
</body>
}
</html> Prof. NABIL Mohamed 174
JavaScript
4. Événements JavaScript
f. Propagation des événements JavaScript (Event Propagation)
d'invoquer une fonction comme s'il /* The objB doesn't have say() method, but it can
s'agissait d'une méthode d'un autre borrow it from objA */
[Link](objB, "Hello"); // Displays: Hello, object B
objet.
Prof. NABIL Mohamed 176
JavaScript
let objA = {
La syntaxe de la méthode apply() est
name: "object A",
quasiment identique à celle de say: function(greet) {
alert(greet + ", " + [Link]);
call(). }
La seule différence réside dans le }
fait que la méthode call() utilise une [Link]("Hi"); // Displays: Hi, object A
liste d'arguments comme
let objB = {
call(thisObj, arg1, arg2, ...). name: "object B"
}
Tandis que la méthode apply()
utilise un tableau d'arguments /* The objB doesn't have say() method, but it can borrow
it from objA */
comme apply(thisObj, [argsArray]). [Link](objB, ["Hello"]); // Displays: Hello, object
B
Prof. NABIL Mohamed 177
JavaScript
(…) offre un moyen plus rapide // Defining function to find maximum value
la méthode apply().
{ {
let message = "Hello"; // only visible in this block var message = "Hello"; // only visible in this block
alert(message); // Hello alert(message); // Hello
} }
alert(message); // Error: message is not defined alert(message); // Hello
{
// show message // show message // show message
let message = "Hello"; let message = "Hello"; var message = "Hello";
alert(message); alert(message); alert(message);
} // show another message // show another message
let message = "Goodbye"; var message = "Goodbye";
{ // Error: variable already declared // Goodbye
// show another message alert(message); alert(message);
let message = "Goodbye";
alert(message);
}
Prof. NABIL Mohamed 181
JavaScript
Pour if, for, while et ainsi de suite, les variables de type let déclarées dans {...} ne
sont également visibles qu'à l'intérieur :
function makeCounter() {
La variable counter ne peut pas être
// Local variable
manipulée de l'extérieur, car elle est locale à
let counter = 0;
la fonction makeCounter().
// Manipulating the 'counter' variable
Alors, sa valeur n'augmentera pas après un
return counter += 1;
appel de fonction ultérieur, car chaque appel
}
de la fonction réinitialise sa valeur.
// Calling the function
La fermeture JavaScript peut résoudre ce
[Link](makeCounter()); // Prints: 1
problème.
[Link](makeCounter()); // Prints: 1
Une fermeture (closure) est une fonction interne qui a accès à la portée de la fonction
parente, même après la fin de l’exécution de cette fonction parente.
Cela se fait en créant une fonction à l'intérieur d'une autre fonction.
function makeCounter() {
let counter = 0;
La fonction interne make() est renvoyée par la
// Nested function
function make() { fonction externe makeCounter().
counter += 1; La valeur de myCounter est donc la fonction
return counter;
}
interne make(), et l'appel de myCounter
return make; appelle effectivement make().
}
let myCounter = makeCounter();
[Link](myCounter()); // Prints: 1
[Link](myCounter()); // Prints: 2 Prof. NABIL Mohamed 184
JavaScript
JSON est un format d'échange de données extrêmement léger, facile et rapide à analyser
et à générer, permettant l'échange de données entre le serveur et le client.
Comme XML, JSON est un format textuel facile à écrire et à comprendre (pour les
développeurs et ordinateurs).
Contrairement à XML, les structures de données JSON utilisent moins de bande passante
que leurs versions XML.
JSON repose sur deux structures de base qui sont Objet et tableau.
En JSON, les noms de propriétés ou clés sont toujours des chaînes, tandis que la valeur
peut être une chaîne, un nombre, true ou false, null, ou meme un objet ou un tableau.
Les chaînes doivent être entourées de guillemets doubles "" et peuvent contenir des
caractères d'échappement tels que \n, \t et \.
Prof. NABIL Mohamed 187
JavaScript
Les modèles littéraux sont créés à l'aide d'un accent grave (` `) au lieu des guillemets
doubles (" ") ou simples (' ') habituels.
Les modèles littéraux offrent un moyen simple et clair de créer des chaînes
multilignes et d'effectuer des interpolations de chaînes.
Il est désormais possible d'intégrer des variables ou des expressions dans une chaîne
à n'importe quel endroit, sans difficulté.
// Converting JSON object to JS object // Printing all the values from the resulting object
let obj = [Link](json); printValues(obj);
// Define recursive function to print nested values [Link]("<hr>");
function printValues(obj) { // Printing a single value
for(let k in obj) { [Link](obj["book"]["author"] + "<br>");
if(obj[k] instanceof Object) { // Prints: J. K. Rowling
printValues(obj[k]); [Link](obj["book"]["characters"][0] +
} else { "<br>"); // Prints: Harry Potter
[Link](obj[k] + "<br>"); [Link](obj["book"]["price"]["hardcover
}; "]); // Prints: $20.32
}
}; Prof. NABIL Mohamed 193
JavaScript
Lors de l’interaction avec une page web, nous pouvons envoyer au serveur un objet ou
une valeur JavaScript.
JavaScript propose à cet effet la méthode [Link]() qui convertit une valeur
JavaScript en chaîne JSON.
La chaîne JSON résultante est appelée « objet JSON codé, sérialisé ou stringifié».
Pour plus d’information: [Link]
Prof. NABIL Mohamed 194
JavaScript
Lorsque le paramètre Rest est le seul paramètre d'une fonction, il obtient tous les
arguments passés à la fonction,
Sinon il obtient le reste des arguments qui dépasse le nombre de paramètres nommés.
function addNumbers(a, b, c) {
return a + b + c;
}
let numbers = [5, 12, 8];
// ES5 way of passing array as an argument of a function
alert([Link](null, numbers)); // 25
// ES6 spread operator
alert(addNumbers(...numbers)); // 25
Prof. NABIL Mohamed 197
JavaScript
L'opérateur de propagation peut également être utilisé pour insérer les éléments d'un
tableau dans un autre tableau sans utiliser les méthodes de tableau telles que push(),
unshift() concat(), etc.
// ES6 syntax
let fruits = ["Apple", "Banana", "Mango"];
let [a, ...r] = fruits;
alert(a); // Apple
alert(r); // Banana,Mango
alert([Link](r)); // true
9. Classes
Dans ES5 et les versions antérieures, les
classes n'existaient pas en JavaScript. class Rectangle {
// Class constructor
Les classes ont été introduites dans ES6, qui constructor(length, width) {
ressemblent à celles d'autres langages [Link] = length;
orientés objet (Java, PHP, etc.), mais leur [Link] = width;
fonctionnement diffère. }
// Class method
Les classes ES6 facilitent la création d'objets, getArea() {
l'implémentation de l'héritage grâce au mot- return [Link] * [Link];
clé extends et la réutilisation du code. }
}
Nous pouvons déclarer une classe en
utilisant le mot-clé class suivi d'un nom de
classe. let rectangle = new Rectangle(10, 5);
alert([Link]()); // 50
Par convention, le nom de classe commence
par une majuscule.
Prof. NABIL Mohamed 202
JavaScript
Il arrive que votre code JavaScript ne s'exécute pas aussi bien que prévu, ce qui
entraîne une erreur.
Plusieurs raisons peuvent être à l'origine d'une erreur, par exemple :
• Un utilisateur a peut-être saisi une valeur non valide dans un champ de
formulaire.
• Le référencement d'objets ou de fonctions inexistants.
• Des données incorrectes ont été envoyées ou reçues du serveur web.
• Etc.
Ces types d'erreurs sont appelées erreurs d'exécution, car elles se produisent lors de
l'exécution du script.
Une application professionnelle doit être capable de gérer correctement ces erreurs
d'exécution.
Cela implique généralement d'informer l'utilisateur du problème de manière plus
claire et plus précise.
Prof. NABIL Mohamed 204
JavaScript
try {
// Code that may cause an error
} catch(error) {
// Action to be performed when an error occurs
}
Si une erreur survient à un moment quelconque du bloc try, l'exécution du code est
immédiatement transférée du bloc try au bloc catch.
Si aucune erreur ne survient dans le bloc try, le bloc catch est ignoré et le programme continue
son exécution après l'instruction try-catch.
Prof. NABIL Mohamed 205
JavaScript
try {
let greet = "Hi, there!";
[Link](greet);
// Trying to access a non-existent variable
[Link](welcome);
// If error occurred following line won't execute
alert("All statements are executed successfully.");
} catch(error) {
// Handle the error
alert("Caught error: " + [Link]);
}
// Continue execution
[Link]("<p>Hello World!</p>");
Prof. NABIL Mohamed 206
JavaScript
Nous avons vu jusqu'à présent les erreurs générées automatiquement par l'analyseur
JavaScript en cas d'erreur.
Cependant, il est également possible de générer une erreur manuellement à l'aide de
l'instruction throw.
La syntaxe générale de cette instruction est : throw expression.
L'expression peut être un objet ou une valeur de n'importe quel type de données.
Il est toutefois préférable d'utiliser des objets, de préférence avec les propriétés name
et message.
Le constructeur JavaScript intégré Error() offre un moyen pratique de créer un objet
d'erreur.
L'objet Error est le type de base de toutes les erreurs et possède deux propriétés
principales qui sont:
name : spécifie le type d'erreur.
message : contient un message décrivant l'erreur en détail.
try {
[Link](mohamed'); // SyntaxError: missing ) after argument list
} catch(e) {
[Link]([Link] + ": " + [Link]);
}
Programmation Synchrone
[Link]("Début");
const data = getData();
// Imaginons que ça prend 3 secondes: tout s’arrête pendant son exécution
[Link](data);
[Link]("Fin");
Début
data
Fin Prof. NABIL Mohamed 215
JavaScript
[Link]("Début");
setTimeout( function() {[Link]("Données reçues");}, 2000);
// Affiché après 2 secondes
[Link]("Fin");
Début
Fin
Données reçues
Le programme ne se bloque pas pendant les 2 secondes, il continue !
Les applications réelles doivent gérer des tâches telles que : Récupérer des
données depuis une API, Lire des fichiers, Répondre aux saisies utilisateur.
• Async/Await
<body>
<button type="button" id="myBtn">Click Me</button>
<p id="demo">pp</p>
<script>
sum = (a,b)=>(a+b); // function sum(a,b){return a+b;}
product = (a,b)=>(a*b); // function product(a,b){return a*b;}
function operation(a, b, callback){
[Link]("demo").innerHTML = callback(a,b);
}
operation(5, 3, sum);
</script>
</body> Prof. NABIL Mohamed 219
JavaScript
function asyncFunction1(callback) {
[Link]("Async Function 1 Done");
callback();
asyncFunction1(function(){
}
asyncFunction2(function(){
function asyncFunction2(callback) { asyncFunction3(function(){
[Link]("Async Function 2 Done"); [Link]("All Async Functions Completed");
callback();
});
}
});
function asyncFunction3(callback) { });
[Link]("Async Function 3 Done");
callback();
}
Prof. NABIL Mohamed 221
JavaScript
access a Promise
Promise
Promise
Promise
gets
gets
rejected
resolved
Prof. NABIL Mohamed 222
JavaScript
Promise
Une Promise est comparable au message automatisé (Hello! thank you for contacting
….). Elle représente un état d'attente qui doit être honoré ultérieurement.
L'agent humain indiquant que le modèle de téléphone est disponible est similaire à la
méthode resolve(), qui indique que la Promesse est honorée.
L'agent vous informant que vous contactez le mauvais magasin est similaire à la
méthode reject(), qui indique que la Promesse ne peut être honorée en raison d'une
erreur.
Promise
let promis = new Promise( function(resolve, reject) { Lors de la création d'un nouvel objet
let isTrue = true; Promise, nous devons passer une
// "Producing Code" (May take some time) fonction callback qui sera appelée
if (isTrue) {
immédiatement avec deux arguments :
resolve('Promise resolved'); // when successful
les fonctions resolve() et reject().
} else {
Selon le résultat de la Promise, la
reject('Promise rejected'); // when error
fonction resolve() ou reject() sera
}
}); appelée pour mettre fin à l'état
// "Consuming Code" (Must wait for a fulfilled Promise) d'attente.
[Link]( Pour gérer l'objet Promise, vous devez
function(value){[Link](value);}, chaîner l'appel de fonction avec les
function(error){[Link](error);} fonctions then() et catch().
); Prof. NABIL Mohamed 224
JavaScript
Promise
let promis = new Promise( function(resolve, reject) { Lors de la création d'un nouvel objet
let isTrue = true; Promise, nous devons passer une
if (isTrue) { fonction callback qui sera appelée
resolve('Promise resolved'); immédiatement avec deux arguments :
} else { les fonctions resolve() et reject().
Selon le résultat de la Promise, la
reject('Promise rejected');
fonction resolve() ou reject() sera
}
appelée pour mettre fin à l'état
});
d'attente.
promis
Pour gérer l'objet Promise, vous devez
.then(function(value){[Link](value);})
chaîner l'appel de fonction avec les
.catch(function(error){[Link](error);});
fonctions then() et catch().
Prof. NABIL Mohamed 225
JavaScript
//Promise
let promis = new Promise( function(resolve, reject) {
setTimeout(function(){ resolve("This is promise object!"); }, 2000);
});
[Link](function(value) {
[Link]("demo").innerHTML = value;
}); Prof. NABIL Mohamed 226
JavaScript
async garantit que la fonction renvoie une promesse et y encapsule les non-
promesses. Prof. NABIL Mohamed 227
JavaScript
Le mot-clé await est autorisé dans le corps de la fonction, ce qui permet d'écrire un
comportement asynchrone basé sur les promesses dans un style plus clair et d'éviter
la nécessité de configurer explicitement les chaînes de promesses.
ES6 introduit les modules basés sur des fichiers, où chaque module est représenté par
un fichier .js distinct.
Les modules JavaScript vous permettent de diviser votre code en fichiers distincts.
[Link]
import { greet, PI, multiplyNumbers } from './[Link]';
alert(greet); // Hello World!
alert(PI); // 3.14
alert(multiplyNumbers(6, 15)); // 90 Prof. NABIL Mohamed 231
JavaScript