# Interaction dans une page Web grâce à JavaScript
Ce document a été produit en grande partie par ChatGPT, qui a été utilisé pour résumer le cours correspondant et accessible [ici](interaction-avec-javascript)
---
# Introduction
<img class="r-stretch centre image-responsive" alt="logo JS" src="data/js.png" width="150">
- JavaScript créé en 1995 par Brendan Eich.
- Langage de scripts pour pages web interactives.
- Utilisation côté client et serveur (Node.js).
- Côté client : le JS est interprété et exécuté par le navigateur web
---
# Premiers pas avec JavaScript
- Intégration dans une page HTML.
- Deux façons d'écrire le code JS :
- Directement dans le HTML avec la balise `<script>`.
- Dans un fichier séparé au format `.js`.
---
## Directement dans le HTML
- Syntaxe obsolète mais encore présente dans certaines pages.
**Exemple :**
<iframe height="350" style="width: 100%;" scrolling="no" title="JS dans HTML (obsolète)" src="https://codepen.io/gbecker/embed/preview/jOJPgWe?default-tab=html%2Cresult&editable=true&theme-id=light" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
See the Pen <a href="https://codepen.io/gbecker/pen/jOJPgWe">
JS dans HTML (obsolète)</a> by Becker (<a href="https://codepen.io/gbecker">@gbecker</a>)
on <a href="https://codepen.io">CodePen</a>.
</iframe>
----
- **Avantages :**
- Simple pour les petits essais.
- **Inconvénients :**
- Mélange de code JS et HTML (non recommandé).
- Pas maintenable pour des applications conséquentes.
---
## Dans un fichier séparé (.js)
- Recommandé pour la maintenabilité.
**Exemple :**
<iframe height="320" style="width: 100%;" scrolling="no" title="Fichier JS externe (recommandé)" src="https://codepen.io/gbecker/embed/preview/mdoJNVw?default-tab=html%2Cresult&editable=true&theme-id=light" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
See the Pen <a href="https://codepen.io/gbecker/pen/mdoJNVw">
Fichier JS externe (recommandé)</a> by Becker (<a href="https://codepen.io/gbecker">@gbecker</a>)
on <a href="https://codepen.io">CodePen</a>.
</iframe>
----
- **Avantages :**
- Séparation du code JS et HTML (maintenabilité).
- Possibilité de réutiliser le fichier JS pour plusieurs pages.
- **Inconvénients :**
- Nécessité de créer et maintenir deux fichiers.
---
# Les événements
- Événements = actions détectables (que l'on peut « écouter ») et auxquelles on peut répondre (en exécutant un code bien défini)
- Exemples d'événements : `click`, `mouseover`, `keydown`, etc.
---
## Définir des gestionnaires d'événements
- Trois méthodes :
1. Attributs HTML (obsolète).
2. Propriétés JavaScript liées aux événements.
3. `addEventListener()` (recommandé).
---
### Attributs HTML (obsolète)
- Utilisation de l'attribut `onclick` (ou `onmouseover`, `onkeydown`, etc.)
**Exemple** :
<iframe height="300" style="width: 100%;" scrolling="no" title="Gestionnaire d'événements - Attribut HTML (obsolète)" src="https://codepen.io/gbecker/embed/preview/JjzYNbr?default-tab=html%2Cresult&editable=true&theme-id=light" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
See the Pen <a href="https://codepen.io/gbecker/pen/JjzYNbr">
Gestionnaire d'événements - Attribut HTML (obsolète)</a> by Becker (<a href="https://codepen.io/gbecker">@gbecker</a>)
on <a href="https://codepen.io">CodePen</a>.
</iframe>
----
```html
<button onclick="afficheMsg()">Clic</button>
```
- ajout de l'attribut `onclick` au bouton
- la valeur de l'attribut est la fonction JS contenant le code à exécuter
- inconvénient : mélange HTML et JS
---
### Propriétés JS liées aux événements
**Exemple** :
<iframe height="300" style="width: 100%;" scrolling="no" title="Gestionnaire d'événements - Propriétés JS liées aux événements" src="https://codepen.io/gbecker/embed/preview/jOJbmBE?default-tab=html%2Cresult&editable=true&theme-id=light" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
See the Pen <a href="https://codepen.io/gbecker/pen/jOJbmBE">
Gestionnaire d'événements - Propriétés JS liées aux événements</a> by Becker (<a href="https://codepen.io/gbecker">@gbecker</a>)
on <a href="https://codepen.io">CodePen</a>.
</iframe>
----
- Dans le HTML : on donne un attribut `id` à notre bouton
```html
<button id="btn">Clic</button>
```
- Dans le JS :
- sélection du bouton grâce à son `id` avec `querySelector`
- la dernière ligne indique quelle fonction appeler lorsqu'un clic est détecté
```js
var bouton = document.querySelector('#btn');
function afficheMsg() {
alert("Hello World !");
}
bouton.onclick = afficheMsg;
```
---
### Méthode `addEventListener()` (recommandée)
**Exemple** :
<iframe height="300" style="width: 100%;" scrolling="no" title="Gestionnaire d'événements - addEventListener (recommandé)" src="https://codepen.io/gbecker/embed/preview/PoLPmjL?default-tab=html%2Cresult&editable=true&theme-id=light" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
See the Pen <a href="https://codepen.io/gbecker/pen/PoLPmjL">
Gestionnaire d'événements - addEventListener (recommandé)</a> by Becker (<a href="https://codepen.io/gbecker">@gbecker</a>)
on <a href="https://codepen.io">CodePen</a>.
</iframe>
----
- Principe similaire à la méthode précédente
- Syntaxe légèrement différente : utilisation de la fonction `addEventListener` qui possède deux paramètres :
- le nom de l'événement (ici `click`)
- le nom de la fonction a exécuter en réponse à cet événement
**JS :**
```js
var bouton = document.querySelector('#btn');
bouton.addEventListener('click', afficheMsg);
```
---
# Modifier les éléments de la page
---
✍️ Faire les **défis** accessibles en cliquant sur [ce lien](/premiere_nsi/web/defis-js)
---
- Exemples de modification :
- Style d'un élément.
- Texte d'une balise.
- Utilisation des champs de saisie.
---
## Modifier le style d'un élément
**HTML :**
```html
<body>
<h1 id="monTitre">Généralités sur JS</h1>
<p id="monPara">Voici une page Web interactive grâce à JavaScript.</p>
<button id="btn">Cliquez ici</button>
<script src="script.js"></script>
</body>
```
**JS :**
```js
function changeStyles() {
var para = document.querySelector("#monPara");
var corps = document.querySelector("body");
para.style.color = "red";
para.style.fontWeight = "bold";
corps.style.backgroundColor = "rgb(255,255,0)";
}
```
----
<iframe height="300" style="width: 100%;" scrolling="no" title="Modifier les styles" src="https://codepen.io/gbecker/embed/preview/ExGxERm?default-tab=html%2Cresult&editable=true&theme-id=light" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
See the Pen <a href="https://codepen.io/gbecker/pen/ExGxERm">
Modifier les styles</a> by Becker (<a href="https://codepen.io/gbecker">@gbecker</a>)
on <a href="https://codepen.io">CodePen</a>.
</iframe>
---
## Changer le texte d'une balise
**HTML :**
```html
<body>
<h1 id="monTitre">Généralités sur JS</h1>
<p id="monPara">Voici une page Web interactive grâce à JavaScript.</p>
<button id="btn">Cliquez ici</button>
<script src="script.js"></script>
</body>
```
**JS :**
```js
function changeTexte() {
var para = document.querySelector("#monPara");
para.innerHTML = "Bonjour tout le monde !";
}
```
----
<iframe height="300" style="width: 100%;" scrolling="no" title="1NSI_change_texte" src="https://codepen.io/gbecker/embed/preview/rNoNrZj?default-tab=html%2Cresult&editable=true&theme-id=light" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
See the Pen <a href="https://codepen.io/gbecker/pen/rNoNrZj">
1NSI_change_texte</a> by Becker (<a href="https://codepen.io/gbecker">@gbecker</a>)
on <a href="https://codepen.io">CodePen</a>.
</iframe>
---
## Utiliser des champs de saisie
**HTML :**
```html [4]
<body>
<h1 id="monTitre">Généralités sur JS</h1>
<p id="monPara">Voici une page Web interactive grâce à JavaScript.</p>
<input type="text" id="zoneDeSaisie"/>
<button id="btn">Cliquez ici</button>
<script src="script.js"></script>
</body>
```
**JS :**
```js
function disBonjour() {
var saisie = document.querySelector("#zoneDeSaisie");
var para = document.querySelector("#monPara");
let prenom = saisie.value;
let texte = "Bonjour " + prenom;
para.innerHTML = texte;
}
```
----
<iframe height="320" style="width: 100%;" scrolling="no" title="1NSI_recuperer_donnee_saisie" src="https://codepen.io/gbecker/embed/preview/yLGLqZJ?default-tab=html%2Cresult&editable=true&theme-id=light" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
See the Pen <a href="https://codepen.io/gbecker/pen/yLGLqZJ">
1NSI_recuperer_donnee_saisie</a> by Becker (<a href="https://codepen.io/gbecker">@gbecker</a>)
on <a href="https://codepen.io">CodePen</a>.
</iframe>
---
# Bilan
- Les internautes interagissent avec les pages web grâce à JavaScript.
- Interface Homme-Machine (IHM) basée sur la gestion d'événements.
- **Événement** : action détectable et à laquelle on peut répondre.
- Langage JavaScript essentiel pour implémenter la gestion des événements.
- Recommandation : utiliser `addEventListener()` pour gérer les événements.
---
Germain Becker & Sébastien Point, Lycée Emmanuel Mounier, Angers
![Licence Creative Commons BY-SA](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)