Découvrir JavaScript

Objectifs

  • Savoir associer un programme JavaScript à une page HTML

  • Connaître la syntaxe de base de JavaScript

  • Savoir sélectionner un élément de la page en fonction de ses attributs id ou class et associer un comportement lorsqu'on interagit avec celui-ci (par exemple afficher une fenêtre de dialogue lorsqu'un utilisateur clic sur un élément de la page)

  • Savoir modifier un élément de la page lorsqu'un événement se produit (par exemple le cacher lorsqu'on clique dessus)

Associer un JS à une page HTML

DéfinitionJavaScript

JavaScript est un troisième langage qui vient compléter HTML et CSS. Un programme JavaScript (JS) est un fichier qui peut être associé à une page HTML afin de permettre la programmation des interactions avec l'utilisateur.

Il permet notamment de :

  • réagir à des événements produits par l'utilisateur, par exemple afficher un message lorsqu'il appuie sur une touche du clavier,

  • modifier la page affichée, par exemple masquer un div HTML lorsque l'utilisateur clique dessus.

Syntaxe

On peut déclarer dans une page HTML quel fichier JS utiliser en mobilisant l'élément <script src="script.js" defer></script> dans la partie head.

<!DOCTYPE html>
<html lang="fr">
    <head>
      <title>...</title>
      <meta charset="utf-8">
      <script src="script.js" defer></script>
    </head>
    <body>
      ...
    </body>
</html>

ExempleFichier script.js

// Select an element in the HTML page
let p = document.querySelector('p.say-hello')
// Link the event "click" to the function "sayHello" on the element "p.say-hello"
p.addEventListener('click', sayHello)
// Code to execute when element "p.say-hello" is clicked
function sayHello() {
  alert('Hello World')
}

Exemple

<!DOCTYPE html>
<html lang="fr">
    <head>
      <title>Say Hello</title>
      <meta charset="utf-8">
      <script src="script.js" defer></script>
    </head>
    <body>
      <h1>JavaScript</h1>
      <p>JavaScript (qui est souvent abrégé en « JS ») est un langage de script léger, orienté objet, principalement connu comme le langage de script des pages web. </p>
      <p>Le standard pour JavaScript est ECMAScript. En 2012, tous les navigateurs modernes supportent complètement ECMAScript 5.1.</p>
      <p class="say-hello"><b>Cliquez-moi pour dire bonjour</b></p>
      <p><a href="https://developer.mozilla.org/fr/docs/Web/JavaScript">[source]</a></p>
    </body>
</html>

ComplémentTester le programme

Changeling

Le fichier JavaScript ci-après permet :

  • d'afficher une bordure autour d'un div doté d'une classe main lorsque la souris passe dessus,

  • et de la supprimer lorsqu'on retire la souris.

let p = document.querySelector('div.main')
p.addEventListener('mouseover', addBorder)
p.addEventListener('mouseout', removeBorder)
function addBorder() {
  this.style.border = 'solid'
}
function removeBorder() {
  this.style.border = 'none'
}

Réaliser un fichier HTML qui affiche cet extrait de la chanson The Changeling des Doors.

I'm a Changeling

See me change

I'm a Changeling

See me change

<!DOCTYPE html>
<html lang="fr">
  <head>
    <meta charset="utf-8">
    <title>Exercice</title>
    <script src="script.js" defer></script>
  </head>
  <body>
    <div class="main">
      <p>I'm a Changeling</p>
      <p>See me change</p>
      <p>I'm a Changeling</p>
      <p>See me change</p>
    </div>
  </body>
</html>

Les bases de la syntaxe JS

JavaScript est un langage interprété, c'est à dire un langage qui est exécuté par un autre programme : l'interpréteur.

L'interpréteur fonctionne de la façon suivante :

  • il lit une ligne de code, l'analyse, l'exécute si elle est correcte et passe à la suivante ;

  • il répète ce processus pour chaque instruction du programme.

DéfinitionInstruction

Une instruction est une ligne de code qui effectue une action : un affichage, un calcul, etc.

Les instructions sont exécutées séquentiellement, c'est-à-dire dans l'ordre et une par une.

DéfinitionVariables

Une instruction peut utiliser des variables, des objets auxquels on peut attribuer une valeur (un nom, une date, un nombre, etc.) et que l'on déclare avec le mot clé let. Sa valeur peut changer au cours du programme.

SyntaxeDéclaration de variables en JavaScript

let month = 'Avril'
let dat = 12

DéfinitionExpression

Une expression est un morceau de code qui produit un résultat, par exemple une addition. Le résultat d'une expression peut être stockée dans une variable.

ExempleInstruction avec expression

let sum = 5 + 6 

DéfinitionFonctions

Une fonction est un morceau de code qu'un autre morceau de code peut appeler.

Les fonctions servent notamment à ne pas réécrire le code si on l'utilise plusieurs fois dans le programme..

ExempleFonction d'affichage

Pour afficher des choses dans la console, on utilise la fonction prédéfinie console.log().

console.log('Hello World')
console.log(4)

FondamentalRègles de syntaxe

Le JavaScript impose :

  • d'aller à la ligne entre deux instructions ;

  • de respecter la casse, c'est à dire les majuscules et minuscules (console.Log() n'équivaut pas à console.log()) ;

  • de respecter les espaces (le nom d'une variable ne peut pas en contenir, en revanche elles sont nécessaires après des mots clés comme let).

Exemple

const hello = 'Hello'
const world = 'World'
console.log(hello, world)

ComplémentcamelCase

La convention de casse utilisée en JavaScript est le camelCase.

ComplémentExécuter du JavaScript dans un navigateur

On peut exécuter du JavaScript dans la console web du navigateur :

  • sur Chrome : Clic droit > Inspecter ou Ctrl+Shift+i, puis onglet Console,

  • sur Firefox : Clic droit > Examiner l'élément ou Ctlr+Shift+k, puis onglet Console.

On peut alors exécuter du code dans le champ de la console.

ComplémentRepl.it

Il existe des interpréteur JavaScript en ligne, comme Repl.it.

Calculate

Soit les fichiers HTML et JS suivants permettant d'effectuer des additions.

<!DOCTYPE html>
<html lang="fr">
  <head>
    <meta charset="utf-8">
    <title>Exercice</title>
    <script src="script.js" defer></script>
  </head>
  <body>
    <div><label>x : </label><input id="x"/></div>
    <div><label>y : </label><input id="y"/></div>
    <div>x + y = <span id="xy"/>?<span></div>
  </body>
</html>
let inputX = document.querySelector('#x')
let inputY = document.querySelector('#y')
let spanXY = document.querySelector('#xy')
inputX.addEventListener('change', calculate)
inputY.addEventListener('change', calculate)
function calculate() {
  let x = parseInt(inputX.value)
  let y = parseInt(inputY.value)
  spanXY.textContent = x + y
}

Faites fonctionner le programme.

Écrivez une page web et un programme JS qui permettent de calculer, à partir d'un rayon : le diamètre, le périmètre et la surface du cercle, ainsi que le volume de la sphère.

Interagir avec les événements

JavaScript permet de capter les événements qui se produisent en interaction à la page HTML et d'exécuter des fonctions lorsqu'ils se déclenchent.

Rappel

Il est possible d'associer un attribut class et/ou id aux éléments HTML, afin de les identifier :

MéthodeIdentifier un élément avec document.querySelector

On peut stocker dans une variable l'adresse d'un élément HTML que l'on aura trouvé avec la fonction querySelector.

// Identify an element with a class
let element1 = document.querySelector('element1.class1')
// Identify an element with an id
let element2 = document.querySelector('element1#id1')

Exemple

<!DOCTYPE html>
<html lang="fr">
    <head>
      <title>Say Hello</title>
      <meta charset="utf-8">
      <script src="script.js" defer></script>
    </head>
    <body>
      <h1>JavaScript</h1>
      <p id="first-p">JavaScript (qui est souvent abrégé en « JS ») est un langage de script léger, orienté objet, principalement connu comme le langage de script des pages web. </p>
      <p>Le standard pour JavaScript est ECMAScript. En 2012, tous les navigateurs modernes supportent complètement ECMAScript 5.1.</p>
      <p class="say-hello"><b>Cliquez-moi pour dire bonjour</b></p>
      <p><a href="https://developer.mozilla.org/fr/docs/Web/JavaScript">[source]</a></p>
    </body>
</html>
let p1 = document.querySelector('#first-p')
let p2 = document.querySelector('p.say-hello')
alert(p1.textContent)
alert(p2.textContent)

MéthodeAssocier un événement avec addEventListener.

On peut associer des événements à des éléments HTML avec la fonction addEventListener.

// Call function1 when element1 receive event1
element1.addEventListener('event1', function1)

Exemple

let p1 = document.querySelector('#first-p')
let p2 = document.querySelector('p.say-hello')
let body = document.querySelector('body')
p1.addEventListener('dblclick', printP1)
p2.addEventListener('click', sayHello)
body.addEventListener('keypress', printBody)
function sayHello() {
  alert('Tu as cliqué sur moi.')
}
function printP1() {
  alert('Merci de ne pas trop cliquer sur moi...')
}
function printBody() {
  alert('Hey, pas avec le clavier !')
}
<!DOCTYPE html>
<html lang="fr">
    <head>
      <title>Say Hello</title>
      <meta charset="utf-8">
      <script src="script.js" defer></script>
    </head>
    <body>
      <h1>JavaScript</h1>
      <p id="first-p">JavaScript (qui est souvent abrégé en « JS ») est un langage de script léger, orienté objet, principalement connu comme le langage de script des pages web. </p>
      <p>Le standard pour JavaScript est ECMAScript. En 2012, tous les navigateurs modernes supportent complètement ECMAScript 5.1.</p>
      <p class="say-hello"><b>Cliquez-moi pour dire bonjour</b></p>
      <p><a href="https://developer.mozilla.org/fr/docs/Web/JavaScript">[source]</a></p>
    </body>
</html>

ComplémentQuelques événements classiques

  • click, dblclick : quand l'utilisateur clique sur la souris

  • mouseover, mouseout : quand l'utilisateur passe au entre et sort d'un élément avec sa souris

  • keypress : quand l'utilisateur appuie sur une touche du clavier

  • change : quand un élément HTML change de valeur (par exemple un élément d'un formulaire)

  • load : quand la page HTML est totalement chargée

ComplémentTous les événements JavaScript

ComplémentPour récupérer l'événement dans la fonction

element1.addEventListener('event1', (e) => function1(e))

ComplémentPour passer d'autres paramètres à la fonction

element1.addEventListener('event1', (e) => function1(e, x))

Ping pong

Compléter le programme JS ci-après afin qu'il ait comme comportement :

  • lorsque l'on clique sur Ping alors le cadre Ping s'allume en rouge et le cadre Pong d'éteint en noir

  • lorsque l'on clique sur Pong alors le cadre Pong s'allume en rouge et le cadre Ping d'éteint en noir

<!DOCTYPE html>
<html lang="fr">
  <head>
    <meta charset="utf-8">
    <title>Exercice</title>
    <link rel="stylesheet" type="text/css" href="style.css">
    <script src="script.js" defer></script>
  </head>
  <body>
    <div class="ping">Ping</div>
    <div></div>
    <div class="pong">Pong</div>
  </body>
</html>
body {
  display: flex;
}
div {
  flex: 1;
}
.ping, .pong {
  flex: 1;
  font: 300% sans-serif;
  text-align: center;
  background-color: #d1d1d1;
  border-style: dotted;
}
// something missing here...
ping.addEventListener('click', playPing)
pong.addEventListener('click', playPong)
function playPing() {
  ping.style.color = 'red'
  pong.style.color = 'black'
}
function playPong() {
  //TODO
}
let ping = document.querySelector('.ping')
let pong = document.querySelector('.pong')
ping.addEventListener('click', playPing)
pong.addEventListener('click', playPong)
function playPing() {
  ping.style.color = 'red'
  pong.style.color = 'black'
}
function playPong() {
  ping.style.color = 'black'
  pong.style.color = 'red'
}

Modifier dynamiquement la page

Manipuler la page HTML avec le DOM

Avec JavaScript, la structure de la page est représentée par un arbre appelé DOM (pour Document Object Model), qui décrit la hiérarchie des balises au sein du document.

JavaScript fournit des fonctions pour manipuler les éléments du DOM. Par exemple, la méthode document.querySelector('h1') renvoie le premier élément h1 de la page, que l'on pourra lire ou modifier.

Exemple

let element1 = document.querySelector('#first-p')
element1.textContent = 'Here I am'
element1.style.color = 'green'

Méthode

Il est possible de combiner les actions sur le DOM avec les événements afin de créer une page interactive.

Exemple

<!DOCTYPE html>
<html lang="fr">
    <head>
      <title>Say Hello</title>
      <meta charset="utf-8">
      <script src="script.js" defer></script>
    </head>
    <body>
      <h1>JavaScript</h1>
      <p id="first-p">JavaScript (qui est souvent abrégé en « JS ») est un langage de script léger, orienté objet, principalement connu comme le langage de script des pages web. </p>
      <p>Le standard pour JavaScript est ECMAScript. En 2012, tous les navigateurs modernes supportent complètement ECMAScript 5.1.</p>
      <p class="say-hello"><b>Cliquez-moi pour dire bonjour</b></p>
      <p><a href="https://developer.mozilla.org/fr/docs/Web/JavaScript">[source]</a></p>
    </body>
</html>
let p1 = document.querySelector('#first-p')
let p2 = document.querySelector('p.say-hello')
p1.addEventListener('click', hideMe)
p2.addEventListener('click', displayHello)
function hideMe() {
  this.hidden = true
}
function displayHello() {
  this.textContent = 'Salut Monde'
}

Cards

Soit les trois fichiers HTML, CSS et JS suivants.

<!DOCTYPE html>
<html lang="fr">
  <head>
    <meta charset="utf-8">
    <title>Exercice</title>
    <link rel="stylesheet" type="text/css" href="style.css">
    <script src="script.js" defer></script>
  </head>
  <body>
    <section class="cards"></section>
    <button id="add">Ajouter</button>
  </body>
</html>
.cards {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  padding: 0 20px;
}
div {
  padding: 70px 50px;
  margin: 20px;
  border-radius: 5%;
  color: white;
  font-weight: bold;
}
.green {
  background: green;
}
.blue {
  background: blue;
}
.red {
  background: red;
}
.yellow {
  background: yellow;
}
button {
  background: white;
  border: solid 1px black;
  padding: 10px;
  border-radius: 10px;
}
// Add a card to the section
function add() {
  const colors = ["green", "red", "yellow", "blue"]
  const cards = document.querySelector(".cards");
  const num = Math.trunc(Math.random() * 9);
  const randomColor = Math.trunc(Math.random() * 4);
  const newCard = document.createElement("div");
  newCard.classList = colors[randomColor];
  newCard.innerText = num;
  newCard.addEventListener('click', hide)
  cards.appendChild(newCard);
}
// This lazy function does nothing
function hide() {
  // Empty function
}
// Call function add once to display first card
add()
// When button is clicked, function add is called
button = document.querySelector('#add')
button.addEventListener('click', add)

Enregistrez et faites fonctionner ces fichiers.

Modifier le code JavaScript afin de permettre d'effacer une carte lorsque l'on clique dessus.

Il suffit de modifier la fonction hide() qui est appelée lorsqu'on clique sur une carte.

function hide() {
  this.hidden = true
}

L'attribut Class

Rappel

En HTML, l'attribut class peut être ajouté à tous les éléments : il permet d'associer une catégorie logique à un élément.

Syntaxe
<p class="nom-de-la-classe">...</p>
Exemple
<!DOCTYPE html>
<html>
    <head>
      <title>W3C Cascading Style Sheets home page</title>
      <meta charset="utf-8">
      <link rel="stylesheet" href="style.css">
    </head>
    <body>
      <h1 class="page-title">What is CSS?</h1>
        <p>Cascading Style Sheets (CSS) is a simple mechanism for adding style (e.g., fonts, colors, spacing) to Web documents.</p>
        <p>These pages contain information on how to learn and use CSS and on available software. They also contain news from the CSS working group.</p>
        <p class="source"><a href="https://www.w3.org/Style/CSS/Overview.en.html">[source]</a></p>
    </body>
</html>
Définition

On peut utiliser cet attribut class pour associer des styles différents à plusieurs éléments HTML identiques.

Syntaxe
element.classe {
  property: value;
  ...
}
Exemple
h1 {
  font-family: Arial;
  font-size: 150%;
}
p {
  font-family: Monospace;
}
p.source {
  font-weight: bold;
}
Remarque

Il est possible de définir un style commun à plusieurs éléments différents qui ont la même classe.

.classe {
  ...
}
.page-title {
  font-family: Arial;
  font-size: 150%;
}

Ici tous les éléments qui ont comme classe page-title activeront cette règle.

ComplémentKebab Case

On utilise la casse kebab case pour nommer les classes en HTML.

https://en.wikipedia.org/wiki/Letter_case

Compléments

SyntaxeAssocier un style à un élément unique (attribut id)

Il est possible en HTML d'associer un identifiant unique à un élément et en CSS de le référencer en utilisant un croisillon (#) à la place du point utilisé pour cibler une classe.

<p id="personal-opinion">I don't like patent trolls.</p>
p#personal-opinion {
  display: none;
}
ComplémentAller plus loin avec les sélecteurs
SyntaxeGérer les unités de longueur

Pour exprimer des longueurs en CSS, il existe de nombreuses unités, les plus courantes sont :

  • % et em représentent une valeur relative à une valeur héritée d'un élément ancêtre (100% ou 1em représente la taille d'un paragraphe standard) ;

  • mm, cm, px et pt représentent des tailles relatives à l'espace d'affichage (taille et résolution de l'écran).

ComplémentComprendre la gestion des unités
ComplémentAller plus loin avec les polices
AttentionIl est déconseillé d'utiliser des tableaux pour gérer la mise en page
  1. Les tableaux de mise en page diminuent l'accessibilité aux malvoyants.

  2. Les tables produisent de la bouillie de balises (les pages ne sont plus humainement lisibles).

  3. Les tableaux ne s'adaptent pas automatiquement aux terminaux.

Les tableaux HTML ne doivent être utilisés que pour des données tabulaires.

Utiliser les tableaux pour la mise en page au lieu des techniques des CSS est une mauvaise idée.

(Quand NE PAS utiliser de tableaux en HTML ?, developer.mozilla.org/fr/docs/Apprendre/HTML/Tableaux/Basics)

MéthodeDisposition spatiale

CSS intègre deux techniques pour gérer la mise en page : flexbox et grid.

ComplémentZen Garden (des exemples avancés)
Liste des raccourcis clavier

Liste des fonctions de navigation et leurs raccourcis clavier correspondant :

  • Bloc Suivant : flèche droite, flèche bas, barre espace, page suivante, touche N
  • Bloc Précédent : flèche gauche, flèche haut, retour arrière, page précédente, touche P
  • Diapositive Suivante : touche T
  • Diapositive Précédente : touche S
  • Retour accueil : touche Début
  • Menu : touche M
  • Revenir à l'accueil : touche H
  • Fermer zoom : touche Échap.