Cours⚓︎
Cours tiré très largement du manuel NSI 1re Spécialité - Ed. 2021 Hachette et de https://frederic-junier.gitlab.io/parc-nsi
1. Introduction⚓︎
Dans le chapitre précédent, on a présenté des exemples de pages Web dynamiques générées par des programmes en PHP, Python ou Node.js. Chaque mise à jour de la page nécessite donc un nouveau cycle requête/réponse entre le client et le serveur. C’est indispensable s’il s’agit de modifier l’état d’une ressource côté serveur (une base de données par exemple), mais les changements peuvent n’être que temporaires et n’affecter que des éléments de la page côté client.
Javascript est un langage interprété qui répond à ce besoin qui s’exécute dans le navigateur du client. Javascript s’est imposé depuis son apparition en 1995 dans le navigateur Netscape comme le principal langage de développement Web en frontend (côté client) et depuis une dizaine d’années, sa variante Node.js concurence les langages de développement backend (côté serveur) comme PHP ou Python.
Une page Web moderne, reçue par un client, comporte au moins trois composants logiciels :
- HTML pour la structure du document.
- CSS pour le paramétrage de l’apparence des éléments et leur positionnement.
- Javascript pour la définition de programmes qui vont réagir à des événements déclenchés par l’utilisateur de la page et modifier la structure de données de la page ( éléments HTML et styles CSS) à travers le DOM. Le DOM est une représentation de l’ensemble de la structure de la page Web sous la forme d’un arbre : les noeuds sont les éléments HTML et ils ont une liste de propriétés : contenu, style, événements associés . . .
2. Elements de syntaxe⚓︎
Programme NSI
Il ne s'agit pas de connaitre cette syntaxe (Hors programme) mais de pouvoir modifier du code existant.
types
Types | Exemples |
---|---|
Nombres | entiers (123 ) ou réels (123.67 ) |
Chaines | 'texte' ou "texte" |
Booléens | true ou false |
Tableaux | t = [1, 6, 7] ; t[1] ; t.length |
instructions
Instructions | Exemples |
---|---|
Déclaration | let var |
Affectation | var = expression |
Conditionnelle | if (expression) { instructions } ouif (expr) { instr } else { instr } |
Boucle bornée | for (i = 0; i < n; i+=1) { instructions } |
Boucle non bornée | while (expression) { instructions } |
Fonction | function f(parametres) { instructions } |
Valeur de retour | return expression |
Commentaires | // commentaire |
Python vs Javascript
Comparé à Python, une différence importante est que les blocs d’instructions ne sont pas délimités par l’indentation, mais par des accolades.
Opérateur booléen et de comparaison (différents de python)
Opérateur | Syntaxe |
---|---|
et | && |
ou | || |
égalité | == ou === (plus strict) |
inégalité | != |
3. Utilisation⚓︎
On peut écrire du code JavaScript:
- dans les balises
html
directement :<p onclick="alert('Salut')">Bonjour</p>
- directement dans une page Web à l’intérieur d’un élément
<script>
, en général à l’intérieur de l’élément<head>
. -
dans du code JavaScript stocké séparément, en indiquant son URL avec l’attribut src de l’élément
<script>
:<script src="moncode.js" defer></script>
defer
L'attribut
src
donne le chemin vers le fichier contenant le code Javascript et l'attributdefer
précise que le chargement du Javascript doit se faire après que la page HTML soit totalement chargée. En effet, Javascript peut modifier la page à travers l'interface DOM, donc il faut ordonnancer le chargement des différentes ressources.
3.1 Modifier une page Web⚓︎
Le langage HTML permet de représenter le contenu d’une page Web sous forme textuelle.Lorsque le navigateur chargeune page HTML, il construit une représentation de la page avec un type construit complexe appelé DOM («Document Object Model»). Pour modifier le contenu de la page Web, on modifie le DOM grâce à un ensemble de fonctions JavaScript et le navigateur met à jour l’affichage de la page.
Tout élément HTML peut avoir un identifiant unique, que l’on spécifie grâce à l’attribut id
. La fonction JavaScript document.querySelector
permet de trouver un élément à partir d'une balise, d'une classe ou d'un identifiant (comme du CSS le ferait):
Code HTML | Code JavaScript |
---|---|
<p id="msg">...</p |
e = document.querySelector('#msg') |
Une fois un élément identifié, on peut accéder, en lecture et en écriture, à certains de ses attributs:
Attribut | Description |
---|---|
e.hidden | booléen qui indique si l’élément est visible ou caché |
e.value | valeur d’un champ d’entrée (élément <input> ) |
e.innerHTML | le code HTML du contenu de l’élément |
e.outerHTML | le code HTML de l’élément et de son contenu |
e.classList | la liste des classes de l’élément (attribut class) |
exemple : hidden
L’attribut hidden permet de cacher ou de montrer un élément (et son contenu).
L’instruction suivante permet de cacher l’élément s’il est visible, sinon de le cacher:
e.hidden = !e.hidden
exemple : innerHTML
On peut modifier le contenu de la page en ajoutant ou en retirant du code HTML. La méthode la plus simple consiste à remplacer le contenu d’un élément e:
e.innerHTML = 'Nous somme le ' + Date()
De façon similaire e.outerHTML
remplace l’élément et son contenu. Il existe de nombreuses autres méthodes pour parcourir et modifier le contenu de la page.
exemple : classList
Comme on l’a vu dans la présentation de CSS, l’attribut class d’un élément est utilisé en liaison avec la feuille de style pour contrôler son aspect. Dans le DOM, l’attribut e.classList
permet de modifier la liste des classes de l’élément e
et ainsi de changer son aspect en ajoutant ou en enlevant une classe. Par exemple, l’instruction e.classList.toggle('important')
permet d’ajouter ou d’enlever la classe important de l’élément e
, ce qui, grâce à la feuille de style vue plus haut, lui ajoute ou lui enlève un cadre rouge. Les principales méthodes de e.classList
sont les suivantes:
Attribut | Description |
---|---|
e.classList.add(cls) | ajoute cls à la liste de classes |
e.classList.remove(cls) | retire cls de la liste de classes |
e.classList.toggle(cls) | ajoute cls si elle est présente, sinon la retire |
e.classList.replace(c1, c2) | remplace c1 par c2, si c1 existe |
e.classList.contains(cls) | retourne true si cls est présente, false sinon |
exemple : d'autres manières de sélectionner des élement du DOM
Enfin, les fonctions getElementsByTagId
, getElementsByTagName
ou getElementsByClassName
permet d’obtenir et d’énumérer tous les éléments qui ont le même Id, le même type ou la même classe. Par exemple, le code suivante rend visible tous les paragraphes qui ont la classe important:
for(let e of document.getElementsByTagName('p')){
if (e.classList.contains('important'))
e.hidden = false
}
3.2 Les événements⚓︎
Le langage JavaScript permet de réagir aux événements lorsque l’utilisateur interagit avec la page Web.
Pour associer une fonction de rappel à un élément, il suffit de lui ajouter un attribut correspondant à l’événement, par exemple onclick, dont la valeur est l’appel d’une fonction JavaScript.
Dans cet exemple, un clic sur le paragraphe «Bonjour» affiche une boîte d’alerte (fonction alert
) avec le message «Salut»:
<p onclick="alert('Salut')">Bonjour</p>
Les évenements
Il existe de nombreux événements. Voici les plus utilisés:
Évenement (<élément> ) |
Condition de son émission |
---|---|
keydown, keyup | appui/relâchement d’une touche du clavier |
click, dbleclick | clic ou double clic de la souris |
mouseenter, mouseleave | survol d’un élément par le curseur de la souris |
mousedown, mouseup | appui/relâchement du bouton de la souris |
mousemove, mouseover | déplacement de la souris |
change (<input> ) |
changement de valeur d’un champ de saisie |
submit (<form> ) |
envoi d’un formulaire |
load (<body> ) |
fin de chargement de la page |
La réaction à un événement peut être définie dans le code HTML de l’élément concerné, comme on l’a vu ci-dessus avec l’attribut onclick. Dans ce cas, le nom de l’événement doit être précéde de on et sa valeur est une expression JavaScript:
<p onmouseenter="this.classList.add('important')" onmouseleave="this.classList.remove('important')"></p>
On peut également définir la fonction de rappel dans le code JavaScript, avec la méthode e.addEventListener(ev, f)
. La fonction f
est alors appelée lorsque l’événement ev
se produit, avec en paramètre l’événement. La définition de la fonction de rappel doit se faire une fois que la page est complètement chargée, en utilisant l’événement load de l’élément <body>
:
<head>
<script>
function important(ev) {// ev.target est l'élément qui a reçu l'événement
ev.target.classList.add("important")
}
function pasImportant(ev) {
ev.target.classList.remove("important")
}
function init() {// appelée au chargement de la page
e = document.getElementById("para")
e.addEventListener("mouseenter", important)
e.addEventListener("mouseleave", pasImportant)
}
</script>
</head>
<body onload="init()">
<p id="para"></p>
</body>