Javascript
Javascript
Introduction à JavaScript
133A-JavaScript-Support-de-cours-2020.pdf 1MB
PDF
Compétence
Développer, réaliser et tester une application, selon la donnée, avec un langage de scripts côté client.
Objectifs opérationnels
1. Analyser la donnée, développer les fonctionnalités de l’application et s'assurer de la compatibilité des navigateurs.
2. Développer des applications avec les langages HTML, CSS et JavaScript.
5. Valider les données saisie par l'utilisateur et l'informer des erreurs et corrections a apporter.
6. Commenter la solution de façon compréhensible dans le code source.
7. Appliquer un jeu de test pour valider le bon fonctionnement de la solution.
Environnement de développement
Afin de faciliter le développement d’applications JavaScript, il existe différents outils qui vous permettront d'automatiser certaines tâches tout en
maintenant la qualité qualité de votre code. Ci-après une liste de quelques outils incontournables.
WebStorm
JetBrains
Git
Node.js
Node.js
Serveur JavaScript
Vue.js
Vue est un framework JS évolutif pour construire des interfaces utilisateur HTML/CSS/JS
C'est un langage léger qui doit faire partie d'un environnement hôte (un navigateur web par exemple) pour qu'il puisse être utilisé sur les
objets de cet environnement.
Langage interprété
Sensible à la casse
Confusion fréquente avec Java
Ou écrire du JavaScript
1. Ouvrir la console de votre navigateur command + option + J (Mac) ou control + shift + J (Windows, Linux, Chrome OS) pour
ouvrir la console.
2. Sélectionner l'onglet Console.
Le code JavaScript contenu dans les balises <script> est interprété instruction par instruction comme les éléments HTML.
<h1>Titre de ma page</h1>
<script>
alert("Bonjour depuis une page HTML !");
</script>
Généralement on écrit le code JavaScript dans des fichiers portant l'extension .js . Exemple : panier-achats.js
Pour intégrer un fichier JavaScript dans un document HTML on utilisera l'élément <script> et l'attribut src . Exemple :
<script src="panier-achats.js"></script>
On peut placer la balise <script> dans l'entête du document <head> ou dans le corpts <body> .
La meilleure pratique consite a placer ses scripts à la fin du document juste avant la balise de fermeture du corps du document </body> .
<!DOCTYPE html>
<html lang="fr">
<head>
<title>Panier d'achats</title>
</head>
<body>
<h1>Votre panier d'acahts</h1>
<p>Cette semaine promotion sur les loutres blanches du Gabon</p>
Lorsqu'il rencontre un élément <script> il va charger tout son contenu avant de passer à l’élément suivant.
d'afficher rapidement quelque chose à l’écran. Le navigateur ne doit pas attendre le chargement des scripts avant d'interpréter les autres
éléments HTML.
de manipuler les éléments HTML de la page car tous créés avant l'importation du script.
Appliquer "use strict" à tous vos scripts afin d'éviter les auto-correction des navigateurs. Il vaut mieux stopper un script erroné le plus
rapidement possible.
On peut placer la directive au début d'un script ou au début d'une fonction.
Les deux exemples suivant généreront un erreur et le script sera stoppé, car la variable msg n'a pas été correctement déclarée.
<script>
"use strict";
msg = "Bonjour";
alert(msg);
</script>
function maFonction() {
"use strict";
msg = "Bonjour";
}
https://google.github.io/styleguide/jsguide.html
https://github.com/airbnb/javascript
https://github.com/standard/standard
Il existe également des outils permettant d'analyser votre code comme ESLint & JSLint.
A vous de trouvez celui qui vous convient le mieux. Peut importe votre choix, l'important c'est de choisir un style et de le respecter.
/*
Ceci est un bloc
de commentaires
*/
Entête de document
/**
* @author Steve Fallet <[email protected]>
* @version 1.6 (Version actuelle)
* @since 2018-03-31 (Date de création)
*/
Entête de fonction
/**
* Additionne deux nombres.
* @param {number} a - nombre a.
* @param {number} b - nombre b.
* @return {number} résultat de a + b.
*/
function add(a, b) {
return a + b;
}
Entête de classe
/** Classe représentant un point. */
class Point {
/**
* Crée un point.
* @param {number} x - coordonnée x.
* @param {number} y - coordonnée y.
*/
constructor(x, y) {
// ...
}
/**
* Retourne la coordonée x
* @return {number} La coordonée x.
*/
getX() {
// ...
}
/**
* Retourne la coordonée y
* @return {number} La coordonée y.
*/
getY() {
// ...
}
/**
* Converti en point une chaine contenant deux nombres séparés par un virgule.
* @param {string} str - La chaine contenant les deux nombres séparés par une virgule.
* @return {Point} Un objet Point.
*/
static fromString(str) {
// ...
}
}
Variables et constantes
Conventions
Noms des constantes en MAJUSCULE avec mots clés séparés par un souligné : AGE_MAX
Une variable doit porter un nom représentatif de ce qu'elle contient
// Variables
var personneNom = "Dinateur";
let personneAge = 22;
// Constantes
const URL = "http://kode.ch";
const AGE_MAX = 65;
const langues = ['FR','EN'];
const personne = { age: 20 };
Bonne pratique
Ecrire en :
minuscule les constantes contenant des références : const ids = [12, 44];
Types de données
Il existe deux instructions pour déclarer des variables depuis la sixième édition du standard ECMAScript (ES6 en abrégé).
let permet de déclarer une variable dont la portée est celle du bloc courant.
var quant à lui, permet de définir une variable globale ou locale à une fonction (sans distinction des blocs utilisés dans la fonction).
// Avec var
function varTest() {
var x = 1;
if (true) {
var x = 2; // c'est la même variable !
console.log(x); // 2
}
console.log(x); // 2
}
// Avec let
function letTest() {
let x = 1;
if (true) {
let x = 2; // c'est une variable différente
console.log(x); // 2
}
console.log(x); // 1
}
Types de données
symbol pour les symboles, apparus avec ECMAScript 2015 (ES6). Ce type est utilisé pour représenter des données immuables et uniques.
Function
Array
Date
RegExp
L'opérateur typeof renvoie une chaîne qui indique le type de son opérande.
let nombre = 1;
let chaine = 'some Text';
let bools = true;
let tableau = [];
let objet = {};
let pasUnNombre = NaN; //NaN (Not A Number) est une valeur utilisée pour représenter une quantité qui n'est pas un nombre
let vide = null;
let nonDefini;
Comment s'assurer qu'une variable est du type number et que c'est un nombre ?
Réponse, utiliser la fonction isNaN() qui retourne true si la valeur passée en paramètre n'est pas un nombre.
Les chaînes de caractères sont utiles pour stocker des données qui peuvent être représentées sous forme de texte. Parmi les opérations les plus
utilisées pour manipuler les chaînes de caractères, on a : la vérification de leur longueur avec length , la construction et la concaténation avec les
opérateurs + et += , la recherche de sous-chaîne avec les méthodes includes() ou indexOf() ou encore l'extraction de sous-chaînes avec
la méthode substring() .
Il est possible de créer des chaînes de caractères comme des valeurs primitives ou comme des objets avec le constructeur String() :
Les valeurs littérales pour les chaînes de caractères peuvent être indiquées avec des simples quotes ('), des doubles quotes (") ou encore par
des accents graves (`).
Cette dernière forme permet de définir un littéral de gabarit de chaîne de caractères avec lequel on pourra interpoler des expressions dans une
chaîne de caractères.
Accéder à un caractère
Il existe deux façons d'accéder à un caractère dans une chaîne. La première façon consiste à utiliser la méthode charAt() :
La seconde méthode, introduite avec ECMAScript 5, est de manipuler la chaîne comme un tableau, où les caractères sont les éléments du tableau
et ont un indice correspondant à leur position :
En utilisant la seconde notation, il est impossible de supprimer ou d'affecter une valeur à ces propriétés. En effet, les propriétés concernées ne sont
ni accessibles en écriture ni configurables. Pour plus d'informations, voir la page de Object.defineProperty() .
Les développeurs C utilisent la fonction strcmp() pour comparer des chaînes de caractères. En JavaScript, il est possible d'utiliser les
opérateurs inférieur et supérieur :
let a = "a";
let b = "b";
if (a < b) { // true
console.log(a + " est inférieure à " + b);
} else if (a > b) {
console.log(a + " est supérieure à " + b);
} else {
console.log(a + " et " + b + " sont égales.");
}
On peut obtenir un résultat semblable avec la méthode localeCompare() qui permet de prendre en compte la locale utilisée et qui est héritée
par toutes les instances de String .
On notera que a == b compare les chaînes de caractères a et b de façon sensible à la casse. Si on souhaite comparer des chaînes sans être
sensible à la casse, on pourra utiliser une fonction semblable à :
On utilise ici une conversion en majuscules plutôt qu'en minuscules, car cela cause certains problèmes de conversion pour certains caractères
UTF-8.
En dehors des caractères classiques, des caractères spéciaux peuvent être encodés grâce à l'échappement :
Code Résultat
\0 Caractère nul
\n nouvelle ligne
\r retour chariot
\v tabulation verticale
\t tabulation
\b retour arrière
\f saut de page
Number
L'objet Number est une enveloppe objet (wrapper) autour du type primitif numérique. Autrement dit, il est utilisé pour manipuler les nombres
comme des objets. Pour créer un objet Number , on utilise le constructeur Number() .
Syntaxe
new Number(valeur);
var a = new Number('123'); // a === 123 donnera false
var b = Number('123'); // b === 123 donnera true
a instanceof Number; // donnera true
b instanceof Number; // donnera false
Paramètres
valeur
Description
L'objet Number est principalement utilisé dans les cas de figure suivants :
Dans un contexte de fonction simple (quand il n'est pas utilisé comme un constructeur avec l'opérateur new ), Number peut être utilisé afin
d'effectuer des conversions.
Propriétés
Number.EPSILON
Le plus petit intervalle entre deux valeurs qu'il est possible de représenter en JavaScript.
Number.MAX_SAFE_INTEGER
Number.MAX_VALUE
Number.MIN_SAFE_INTEGER
Number.MIN_VALUE
La plus petite valeur qu'on peut représenter en JavaScript, c'est-à-dire le plus petit nombre positif (le nombre le plus près de zéro qui n'est pas égal
à zéro et qu'on peut représenter en JavaScript).
Number.NaN
Une valeur spéciale pour représenter les valeurs non-numériques (NaN correspond à « *not a number* » en anglais, qui signifie « n'est pas un
nombre »).
Number.NEGATIVE_INFINITY
Number.POSITIVE_INFINITY
Number.prototype (en-US)
Cet objet permet d'ajouter des propriétés aux instances de Number .
Méthodes
Number.isNaN()
Number.isFinite()
Cette méthode permet de déterminer si la valeur numérique passée en argument est un nombre fini.
Number.isInteger()
Number.isSafeInteger()
Cette méthode permet de déterminer si la valeur passée en argument peut correctement être représentée comme un entier en JavaScript (savoir si
elle est comprise entre -(2^53 - 1) et 2^53 - 1 ).
Number.toInteger()
Cette méthode est utilisée afin d'évaluer et de convertir la valeur passée en argument en entier (ou en l'infini). Cette méthode a été supprimée.
Number.parseFloat(string)
Number.parseInt(string, [radix])
Number.prototype.toFixed()
Toutes les instances de Number héritent de Number.prototype (en-US). Il est possible de modifier le prototype du constructeur Number
pour affecter toutes les instances de Number .
Méthodes
Number.prototype.toExponential(fractionDigits)
Number.prototype.toFixed(digits)
Number.prototype.toLocaleString([locales [, options]])
Retourne une chaîne avec une représentation sensible à la langue de ce nombre. Surcharge la méthode
Object.prototype.toLocaleString() .
Number.prototype.toPrecision(precision)
Retourne une chaîne représentant le nombre avec une précision donnée en notation virgule fixe ou exponentielle.
Number.prototype.toString([radix])
Retourne une chaîne représentant le nombre dans une base numérique (radix) donnée. Surcharge la méthode
Object.prototype.toString() .
Number.prototype.valueOf()
Retourne la valeur primitive de l'objet spécifié. Surcharge la méthode Object.prototype.valueOf() .
Exemples
Utiliser l'objet Number pour affecter des valeurs numériques à des variables
Dans l'exemple suivant, on utilise les propriétés de l'objet Number pour affecter des valeurs à des variables numériques :
Dans l'exemple suivant, on illustre les valeurs numériques maximales et minimales (exclues) qu'on peut représenter avec un nombre en JavaScript
(pour plus de détails, voir le chapitre 6.1.6 du standard ECMAScript) :
Lorsqu'on analyse et convertit des données JSON, les valeurs en dehors de cet intervalle peuvent entraîner des erreurs ou des corruptions de
valeurs lors de leurs conversions. Selon les objets qu'on souhaite représenter, on peut utiliser String dans certains cas pour représenter
certaines valeurs.
Dans l'exemple suivant, on convertit un objet Date en une valeur numérique grâce à la fonction Number :
Number("123"); // 123
Number("12.3"); // 12.3
Number("12.00"); // 12
Number("123e-1"); // 12.3
Number(""); // 0
Number("0x11"); // 17
Number("0b11"); // 3
Number("0o11"); // 9
Number("toto"); // NaN
Number("100a"); // NaN
Number("-Infinity"); // -Infinity
String()
.toString()
Opérateur + concaténation
parseInt(string, base)
parseFloat(string)
// Conversion en base 2
parseInt("01010",2); // 10
Opérateur + unaire
Une autre méthode pour récupérer un nombre à partir d'une chaîne de caractères consiste à utiliser l'opérateur + .
Not A Number
TODO - ...
Opérateurs
Les valeurs sont affectées à l'aide de = et il existe également des opérateurs d'affectation combinés comme += et -= .
Vous pouvez utiliser ++ et -- respectivement pour incrémenter et pour décrémenter. Ils peuvent être utilisés comme opérateurs préfixes ou suffixes
let x = 10;
let y = 0;
y = x++; // y = 10 et x = 11
let x = 10;
let y = 0;
y = ++x; // y = 11 et x = 11
Si vous additionnez une chaîne à un nombre (ou une autre valeur), tout est d'abord converti en une chaîne. Ceci pourrait vous surprendre :
"3" + 4 + 5; // "345"
3 + 4 + "5"; // "75"
L'ajout d'une chaîne vide à quelque chose est une manière utile de la convertir en une chaîne.
let texteYoda = "La peur est le chemin vers le côté obscur : " +
"la peur mène à la colère, " +
"la colère mène à la haine, " +
"la haine mène à la souffrance.";
// "La peur est le chemin vers le côté obscur : la peur mène à la colère, la colère mène à la haine, la haine mène à la souffranc
L'égalité est un peu moins évidente. L'opérateur double égal effectue une équivalence si vous lui donnez des types différents, ce qui donne parfois d
résultats intéressants :
Pour éviter les calculs d'équivalences de types, utilisez l'opérateur triple égal :
if... else
// If Else
let a = 1;
let b = 2;
if (a < b) {
console.log('Juste !');
} else {
console.log('Faux !');
}
// Multi If Else
let a = 1;
let b = 2;
let c = 3;
if (a > b) {
console.log('A plus grand que B');
} else if (a > c) {
console.log('Mais A est plus grand que C');
} else {
console.log('A est le plus petit');
}
Cet opérateur est fréquemment utilisé comme raccourci pour la déclaration if… else
switch (fruit) {
case 'Oranges':
console.log('Les oranges sont à 2.55€ le kilo');
break;
case 'Mangues':
case 'Bananes':
console.log('Les mangues et bananes sont à 7.70€ le kilo');
break;
default:
console.log('Désolé, nous ne vendons pas de ' + fruit + ' !');
}
function ditBonjour() {
console.log("Bonjour !");
}
ditBonjour(); // undefined
// Dans la console : "Bonjour !"
Paramètres
ditBonjour("James"); // undefined
ditBonjour("James"); //undefined
Fonctions anonymes
En JavaScript, les fonctions sont des objets, on peut donc stocker des fonctions dans une variable.
Utiliser un max les fonctions avec des noms, cela vous facilitera la vie lors du débogage.
Si une fonction anonyme déclenche une erreur, dans la console vous aurez comme information :
(function () {
// Placer tout le code de votre application ici...
console.log("Auto-exécution");
})();
Boucles
While
let i = 0;
while (i < 4) {
console.log(i);
i += 1 // Eviter l'utilisation de "i++". Préférer "++i" ou "i += 1"
}
// 0
// 1
// 2
// 3
Do...while
let i = 0;
do {
console.log(i);
i += 1 // Eviter l'utilisation de "i++". Préférer "++i" ou "i += 1"
} while (i < 4)
// 0
// 1
// 2
// 3
For
// 0
// 1
// 2
// 3
For..of
L'instruction for...of permet de créer une boucle qui parcourt un objet itérable (Array, Map, Set, String, TypedArray, etc.) et qui permet
d'exécuter une ou plusieurs instructions pour la valeur de chaque propriété.
// 🐔
// 🐷
// 🐑
// 🐇
For...in
L'instruction for...in permet d'itérer sur les propriétés d'un objet.
// Ajouter un propriété
personne.prenom = 'Laure';
personne['nom'] = 'Dinateur'; //Autre syntaxe pour l'ajout
Parcourir un tableau
instruction for
// 🐔
// 🐷
// 🐑
// 🐇
Avec index
const animaux = [ '🐔', '🐷', '🐑', '🐇'];
// 0 🐔
// 1 🐷
// 2 🐑
// 3 🐇
instruction for...of
// 🐔
// 🐷
// 🐑
// 🐇
Méthode forEach()
// 🐔
// 🐷
// 🐑
// 🐇
Exemples
ED I T ON
JS Result
Run Pen
Array.prototype.join()
La méthode join() crée et renvoie une nouvelle chaîne de caractères en concaténant tous les éléments d'un tableau (ou d'un objet semblable à
un tableau). La concaténation utilise la virgule ou une autre chaîne, fournie en argument, comme séparateur.
console.log(elements.join());
// "Fire,Air,Water"
console.log(elements.join(''));
// "FireAirWater"
console.log(elements.join('-'));
// "Fire-Air-Water"
Interactions avec l'utilisateur
A l'exécution, une première boîte de dialogue apparaît pour demander la saisie du prénom.
Cette boîte est le résultat de l'exécution de l'instruction JavaScript prompt("Entrez votre prénom :") .
La valeur saisie dans la première boîte de dialogue a été stockée dans une variable de type chaîne nommée prenom . Ensuite, l'instruction
JavaScript alert() a déclenché l'affichage de la seconde boîte, contenant le message d'accueil.
Nous avons vu dans les précédents chapitres que l'instruction JavaScript console.log() permettait d'afficher une information.
On peut donc utiliser soit console.log() , soit alert() pour afficher des informations à l'utilisateur. Contrairement à alert() ,
console.log() ne bloque pas l'exécution du programme, ce qui en fait souvent un meilleur choix.
Il est possible d'utiliser console.log() pour afficher plusieurs valeurs simultanément, en les séparant par des virgules.
Saisie de nombres
Quel que soit le texte saisi, l'instruction prompt() renvoie toujours une valeur de type chaîne. Il faudra penser à convertir cette valeur avec
l'instruction Number() , parseInt() ou parseFloat() , si vous souhaitez ensuite la comparer à d'autres nombres ou l'utiliser dans des
expressions mathématiques.
Il est possible de combiner les deux opérations (saisie et conversion) en une seule ligne de code, pour un résultat identique :
const nb = Number(prompt("Entrez un nombre : "));
Ici, le résultat de la saisie utilisateur est directement converti en une valeur de type nombre par l'instruction Number() et affecté à la variable nb .
Timers & Intervalles
setTimeout()
setTimeout(function, delai) permet de définir un « minuteur » (timer) qui exécute une fonction ou un code donné après la fin du délai
indiqué en millisecondes.
function bonjour() {
alert('Bonjour !');
}
Exemple
<button onclick="startBonjour();">
Affiche une alerte après 3 secondes...
</button>
<button onclick="stopBonjour();">
Annuler l'affichage
</button>
<script>
let timerBonjour;
function bonjour() {
alert("Bonjour !");
}
ED I T ON
HTML JS Result
Run Pen
setInterval()
setInterval(function, delai) appelle une fonction de manière répétée, avec un certain délai fixé entre chaque appel.
function bonjour() {
alert('Bonjour !');
}
Exemple
<div>
<p>pin-pon, pin-pon, pin-pon ...</p>
</div>
<button onclick="changeCouleur();">Start</button>
<button onclick="stopChangeCouleur();">Stop</button>
<script>
let intervalleCouleur;
function flashText() {
// Récupère 1er paragraphe du document
let para = document.querySelector("p");
// Annule l'intervalle
function stopChangeCouleur() {
clearInterval(intervalleCouleur);
}
</script>
ED I T ON
HTML JS Result
Run Pen
Dans cet objet, le document Document y est représenté comme un arbre nodal, chaque nœud Node représentant une partie du document.
Exemple
Ci-après le code source d'un document HTML et sa repésentation sous forme d'arbre nodal de type DOM.
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Geek Power</title>
</head>
<body>
<h1>Vive le Kode</h1>
<p>J'aime le <a href="http://www.kode.ch">Kooode</a> !</p>
</body>
</html>
Le DOM sous forme d'un arbre nodal du DOM
La deuxième méthode est plus efficace, puisqu'elle ne nécessite pas un parcours complet du document.
document.getElementById()
Ne peut être appelée qu'avec l'objet document .
Renvoie un objet Element représentant l'élément dont l' id correspond à la chaîne de caractères passée en paramètre.
Element.getElementsByClassName()
Peut être appelée avec l'objet document ou un objet de type Element .
Retourne un tableau (HTMLCollection) contenant une référence sur tous les éléments ayant les noms de classes passés en paramètre.
ED I T ON
HTML JS Result
Run Pen
Element.getElementsByTagName()
Peut être appelée avec l'objet document ou un objet de type Element .
Retourne un tableau (HTMLCollection) contenant une référence sur tous les éléments portant le nom de balise donné passé en paramètre.
// Renvoie un tableau de tous les éléments <li> du document
const elementsDeListes = document.getElementsByTagName("li");
Element.querySelector()
Peut être appelée avec l'objet document ou un objet de type Element .
Retourne le premier Element dans le document correspondant au sélecteur CSS - ou groupe de sélecteurs - spécifié(s), ou null si aucune
correspondance n'est trouvée.
// Renvoi le champ texte "login" contenu dans une div avec la classe ".utilisateur"
const inputLogin = document.querySelector('div.utilisateur input[name="login"]');
Element.querySelectorAll()
Peut être appelée avec l'objet document ou un objet de type Element .
Retourne un tableau (NodeList) contenant une référence sur tous les éléments correspondent au sélecteur CSS - ou groupe de sélecteurs -
spécifié(s).
// Retourne tous les paragraphes présents dans une div avec la classe "article"
const parasAticle = container.querySelectorAll("div.article > p");
Il existe deux propriétés pour récupérer ou modifier le contenu d'un élément HTML :
La méthode, insertAdjacentHTML() permet elle d'ajouter du HTML à différents emplacement d'un élément.
innerHTML
Récupère ou définit le contenu HTML d'un élément et de ses descendants.
<p id="intro">
Je suis un <strong>joli</strong> paragraphe !
</p>
<script>
// Récupère le paragraphe #intro
const introPara = document.getElementById("intro");
// Récupère le contenu HTML du paragraphe
let contenu = introPara.innerHTML; //Je suis un <strong>joli</strong> paragraphe !
ED I T ON
HTML JS Result
Run Pen
innerText
Représente le contenu textuel, le rendu visuel d'un élément. Il fait donc abstraction des balises HTML.
Utilisé en lecture, il renvoie une approximation du texte que l’utilisateur ou utilisatrice obtiendrait s’il ou elle sélectionnnait le contenu d’un élément
avec le curseur, et le copiait dans le presse-papier.
<p id="intro">
Je suis un <strong>joli</strong> paragraphe !
</p>
<script>
// Récupère le paragraphe #intro
const introPara = document.getElementById("intro");
ED I T ON
HTML JS Result
Run Pen
insertAdjacentHTML(position, text);
Permet d'ajouter du text HTML à une position donnée autours ou à l'intérieur d'un element existant.
<h2>Mon titre</h2>
<p>Un peu de texte</p>
<!-- beforebegin -->
<p id='intro'>
<!-- afterbegin -->
Et encore un peu de texte
<!-- beforeend -->
</p>
<!-- afterend -->
<p>Et encore et toujours du texte</p>
<h3>Mon sous-titre</h3>
Exemple
<ul id="liste1">
<li>élément de #liste1</li>
</ul>
<ul id="liste2">
<li>élément de #liste2</li>
</ul>
<script>
// Ajouter un nouveau contenu entre #liste1 et #liste2
const liste2 = document.getElementById('liste2');
ED I T ON
HTML JS Result
Run Pen
Element.style
La propriété style d'un élément représente son attribut HTML style="color:red;" . Elle représente donc la déclaration de style en-ligne
qui a la priorité la plus haute dans la cascade CSS.
Cependant, elle n'est pas utile pour connaître le style de l'élément en général, puisqu'elle ne représente que les déclarations CSS définies dans
l'attribut style de l'élément, et pas celles qui viennent d'autres règles de style.
Pour obtenir les valeurs de toutes les propriétés CSS pour un élément, il faut utiliser window.getComputedStyle(element) .
Pour ajouter ou modifier une déclaration CSS dans l'attribut style d'un élément on écrira
Element.style.propriétéCSS = "valeur"
les traits d'union - des propriétés CSS composées de plusieurs mots-clés comme border-color , sont remplacés par une
camélisation borderColor .
Element.style.backgroundColor =
background-color: red;
"red";
Element.style.borderTopWidth =
border-top-width : 2px;
"2px";
Exemple
window.getComputedStyle(element)
La méthode window.getComputedStyle() retourne un objet contenant la valeur calculée finale de toutes les propriétés CSS d'un élément.
Exemple
// Récupère #intro
const intro = document.getElementById('intro');
// Récupère le style CSS de #intro
let styleIntro = window.getComputedStyle(intro);
// Affiche la valeur de la propriété CSS top de #intro
console.log( styleIntro.getPropertyValue('top') ); // "40px"
ED I T ON
HTML CSS JS Result
Run Pen
Les attributs standard HTML sont accessible comme propriété de l'objet représentant l'élément HTML. On peut donc y accéder en lecture et écriture
en écrivant : elementHTML.nomAttribut
<script>
const delemont = document.getElementById("delemont");
delemont.href = "http://www.delemont.ch";
delemont.target = "_blank";
ED I T ON
HTML JS Result
Run Pen
/* Alternance :
Si #menu a la classe .rouge toggle('rouge') la retire
Si #menu n'a pas la classe .rouge toggle('rouge') l'ajoute */
menu.classList.toggle('rouge');
4. Récupérer un élément existant du DOM : voir chapitre Accéder aux éléments de la DOM
5. Attacher le nouvel élément à l'élément existant du DOM : appendChild(element)
Voici comment ajouter le nouvel élément <li>2kg de Pain</li> à la fin de la liste #fondue .
<ul id="fondue">
<li>2kg de Fromage</li>
<li>1L de Kirsh</li>
</ul>
<script>
// 1. Création du nouvel élément <li>
const newLi = document.createElement('li');
// 4. Récupération de la liste
const listeFondue = document.getElementById('fondue');
Résultat
<ul id="fondue">
<li>2kg de Fromage</li>
<li>1L de Kirsh</li>
<li>2kg de Pain</li>
</ul>
elementParent.insertBefore(nouvelElement, elementEnfantExistant);
Cette méthode permet d'ajouter à un élément existant elementParent un élément enfant nouvelElement juste avant l'élément enfant
spécifié elementEnfantExistant .
Exemple : Ajouter un élément au début d'une liste
Voici comment ajouter le nouvel élément <li>2kg de Pain</li> au début de la liste #fondue .
<ul id="fondue">
<li>2kg de Fromage</li>
<li>1L de Kirsh</li>
</ul>
<script>
// 1. Création du nouvel élément <li>
const newLi = document.createElement('li');
Résultat
<ul id="fondue">
<li>2kg de Pain</li>
<li>2kg de Fromage</li>
<li>1L de Kirsh</li>
</ul>
Supprimer, remplacer et cloner
Supprimer un élément
<div>
<h1>Un Titre</h1>
<p>Petit paragraphe<p>
</div>
<script>
// Récupération du 1er paragraphe de la 1re div du document
const p1 = document.querySelector("div p");
// Suppression du 1er paragraphe
p1.remove();
</script>
Edit in JSFiddle
JavaScript
<div>
<h1>Un Titre</h1>
<p>Petit paragraphe<p>
</div>
<script>
// Récupération de la 1re div du document
const div = document.querySelector("div");
// Récupération du 1er <p> de la DIV
const p1 = div.querySelector("p");
// Suppression du 1er paragraphe
div.removeChild(p1);
</script>
ED I T ON
HTML JS Result
Run Pen
Remplacer un élément
<div>
<h1>Un Titre</h1>
<p>Petit paragraphe<p>
</div>
<script>
// Récupération de la 1re div du document
const div = document.querySelector("div");
// Récupération du 1er <p> de la DIV
const ancienPara = div.querySelector("p");
// Création d'un nouveau <p>
const nouveauPara = document.createElement("p");
// Modification du texte du nouveau <p>
nouveauPara.innerText = "Nouveau paragraphe";
// Remplace l'ancien <p> par le nouveau
div.replaceChild(nouveauPara, ancienPara);
</script>
ED I T ON
HTML JS Result
Run Pen
Cloner un élément
<ul id="liste1">
<li>Fromage</li>
<li>Thé</li>
</ul>
<ul id="liste2">
<li>Eau</li>
<li>Sucre</li>
</ul>
<script>
// Récupération du dernier fils de #liste1 <li>Thé</li>
const dernierFilsListe1 = document.querySelector("#liste1 :last-child");
// Clone, copie, le dernier fils et son contenu, sa descendance
const cloneDernierFils = dernierFilsListe1.cloneNode(true);
// Ajoute le clone à la fin de #liste2
document.getElementById("liste2").appendChild(cloneDernierFils);
</script>
ED I T ON
HTML JS Result
Run Pen
Les événements permettent de déclencher une fonction pour une action spécifique, comme par exemple le clic ou le survol d'un élément, le
chargement du document HTML ou encore l'envoi d'un formulaire.
Avec la méthode "on-event", chaque objet ne peut avoir qu'un seul gestionnaire d'événement pour un événement donné. C'est pourquoi
addEventListener() est souvent le meilleur moyen d'être averti des événements.
On-event
Les gestionnaires d'événements "on-event" sont nommées selon l'événement lié : onclick , onkeypress , onfocus , onsubmit , etc.
En JavaScript, afin d'affecter la fonction bonjour() et non son résultat, on n'ajoute pas les parenthèses après le nom de la fonction.
function citationLeia() {
alert("Plutôt embrasser un Wookie");
}
addEventListener()
La méthode addEventListener() permet de définir une fonction à appeler chaque fois que l'événement spécifié est détecté sur l'élément ciblé.
ElementCible.addEventListener("nomEvenement", nomFonction);
newElement.onclick = function() {
console.log('clicked');
};
window.onload = function() {
console.log('Im loaded');
};
index.html
<button>Bouton 1</button>
<button>Bouton 3</button>
<button>Bouton 3</button>
styles.css
button {
cursor: pointer;
color: #7f8c8d;
font-weight: bold;
background-color: #ecf0f1;
padding: 1em 2em;
border: 2px solid #7f8c8d;
}
button.rouge {
border-color: #c0392b;
background-color: #e74c3c;
color: #ecf0f1;
}
ED I T ON
HTML CSS JS Result
Run Pen
L'objet event
Un objet event est automatiquement passé comme premier paramètre de la fonction affectée à un événement. Pour le récupérer il suffit d'ajouter
un paramètre à la fonction liée. Le nom de ce paramètre est libre mais on le nomme régulièrement event ou plus simplement e .
<button>Clique moi !</button>
<script>
// Récupère le 1er boutons du document
const bouton = document.querySelector("button");
// Ajoute événement click avec une fonction avec paramètre event
bouton.addEventListener("click", function (event) {
// Affiche le type d'événement envoyé
alert(event.type); // click
});
</script>
ED I T ON
HTML JS Result
Run Pen
On appelle "cible" l'objet ou 'élément qui a envoyé l'événement. Pour récupérer la cible on utiliser la propriété target de l'événement.
<script>
// Récupère le 1er boutons du document
const bouton = document.querySelector("button");
// Ajoute événement click avec une fonction avec paramètre event
bouton.addEventListener("click", function (event) {
// Récupère l'élément qui a envoyé l'événement, la cible
let cible = event.target;
// Modifie la taille du texte de la cible
cible.style.fontSize = "2em";
// Affiche le contenu texte de la cible
alert(cible.innerText); // Clique moi !
});
</script>
ED I T ON
HTML JS Result
Run Pen
<div id="div1">
<p id="p1">I am Bubbling</p>
</div><br>
<div id="div2">
<p id="p2">I am Capturing.</p>
</div>
<script>
document.getElementById("p1").addEventListener("click", function() {
alert("You clicked the P element!");
}, false);
document.getElementById("div1").addEventListener("click", function() {
alert("You clicked the DIV element!");
}, false);
document.getElementById("p2").addEventListener("click", function() {
alert("You clicked the P element!");
}, true);
document.getElementById("div2").addEventListener("click", function() {
alert("You clicked the DIV element!");
}, true);
</script>
ED I T ON
HTML JS Result
Run Pen
A lire...
"Naviguer dans la DOM", représente l'action de se déplacer, ou récupérer un noeud parent, enfant ou adjacent.
node.firstChild
Node
Premier fils element.firstElementCh
Element
ild
node.lastChild
Node
Dernier fils element.lastElementChi
Element
ld
Comme on peut le voir, certaines actions sont réalisables avec deux propriétés différentes.
Les propriétés de type Node , pour naviguer dans tous les types de noeuds : éléments, textes ou commentaires
Les propriétés de type Element , pour naviguer uniquement dans les éléments
Dans l'exemple ci après, on récupère le premier fils de la div avec la propriété firstChild , avec la propriété firstElementChild .
<script>
// Récupère la première <div> du document
const div = document.querySelector("div");
<script>
// Récupère le premier élément strong du document
const strongElement = document.querySelector("strong");
// Noeud parent
moneElement.parentNode; // <div>
// Premier fils
monElement.firstChild; // "le "
// Dernier fils
monElement.lastChild; // <em>
// Frêre suivant
monElement.nextSibling; // "!"
// Frêre précédent
monElement.previousSibling; // "Bonjour "
</script>
<script>
// Récupère la première liste non triée du document
const listeAnimaux = document.querySelector("ul");
// Noeud parent
listeAnimaux.parentNode; // <div id="animaux">...</div>
// Premier fils
listeAnimaux.firstElementChild; // <li>🐔</li>
// Dernier fils
listeAnimaux.lastElementChild; // <li>🐷</li>
</script>
Formulaires
Envoyer des formulaires
// Envoyer un formulaire
formulaire.submit();
// Réinitialiser un formulaire
formulaire.reset();
Événement submit
L'événement submit permet de déclencher une fonction lors de l'envoi du formulaire.
formulaire.addEventListener('submit', function(){
console.log("Formulaire envoyé !");
});
Si l'on veut désactiver, stopper l'envoi du formulaire il faut utiliser la méthode preventDefault() de l'événement.
Exemple
<form action="https://kode.ch/getpost/" method="post">
<label for="nom">Votre nom</label>
<input type="text" id="nom" name="nom">
<button>Envoyer</button>
</form>
<script>
// 1er formulaire du document
const formulaire = document.querySelector("form");
// Champ texte nom
const inputNom = document.getElementById("nom");
// Evénement submit => Lors de l'envoi du formulaire
formulaire.addEventListener("submit", function(event) {
// Envoie le formulaire
formulaire.submit();
});
</script>
ED I T ON
HTML JS Result
Run Pen
Champs de saisie
Propriété value
Pour récupérer ou modifier la valeur entrée par le visiteur dans un champs de saisie texte ( input , password , textarea , hidden , email )
on utilise la propriété .value .
Liste déroulantes
Propriété value
Pour récupérer la valeur de l'option sélectionnée d'une liste, on utilise la propriété .value .
monElementSelect.value;
Le sélecteur :checked vous permet de récupérer l'option actuellement sélectionnée avec querySelector .
<script>
const liste = document.getElementById("pays");
const optionSelectionnee = liste.querySelector("option:checked");
console.log(optionSelectionnee.innerText); // Italie
</script>
Evénement change
L'événement change est souvent associé aux listes. Il se déclenche lorsque le visiteur sélectionne une autre option dans la liste.
Exemple
<select name="pays" id="pays">
<option selected value="">-- Sélectionnez un pays --</option>
<option value="FR">France</option>
<option value="IT">Italie</option>
<option value="CH">Suisse</option>
</select>
<div>
Code du pays : <span class="code"></span>
</div>
<script>
// Récupère la liste déroulante #pays et le span .code
const listePays = document.getElementById("pays");
const codeSelectionne = document.querySelector("span.code");
ED I T ON
HTML JS Result
Run Pen
Cases à cocher
Propriété checked
La propriété checked vous permet de savoir si une case est cochée true ou non false
Exemple
<form action="https://kode.ch/getpost/" method="post">
<input type="checkbox" id="copie" name="copie">
<label for="copie">Recevoir une copie</label>
<button>Envoyer</button>
</form>
<script>
// 1er formulaire du document
const formulaire = document.querySelector("form");
// Case à cocher "copie"
const chkCopie = document.getElementById("copie");
ED I T ON
HTML JS Result
Run Pen
La variable qui contient le résultat du querySelectorAll() n'est pas "dynamique", les nouvelles cases cochées ne s'y ajouteront
pas automatiquement.
Exemple
<form action="https://kode.ch/getpost/" method="post">
<input type="checkbox" name="couleurs[]" id="rouge" value="rouge">
<label for="rouge">Rouge</label>
<button>Envoyer</button>
</form>
<script>
// 1er formulaire du document
const formulaire = document.querySelector("form");
ED I T ON
HTML JS Result
Run Pen
Exemple
<form action="https://kode.ch/getpost/" method="post">
<input type="radio" name="genre" id="h" value="Homme">
<label for="h">Homme</label>
<button>Envoyer</button>
</form>
<script>
// 1er formulaire du document
const formulaire = document.querySelector("form");
alert(genre.value);
});
</script>
ED I T ON
HTML JS Result
Run Pen
Ci-après un exemple classique de validation de formulaire avec création d'un message d'erreur.
HTML
<ul class="message"></ul>
<form action="https://kode.ch/getpost/" method="post">
<ul>
<li>
<label for="nom">Votre nom</label>
<input type="text" id="nom" name="nom">
</li>
<li>
<label for="age">Votre age</label>
<input type="text" id="age" name="age">
</li>
<li>
<button type="submit">Envoyer</button>
</li>
</ul>
</form>
Untitled
/**
* Valide le nom et l'âge d'une personne et retourne un tableau d'erreurs
* @return {Array} Tableau de messages d'erreur
*/
function validerPersonne(nom, age) {
// Initialisation du tableau des erreurs
const erreurs = [];
// Si le nom vide
if (nom === "") {
erreurs.push("Entrez un nom !");
}
return erreurs;
}
/**
* Ajoute le contenu d'un tableau à la fin d'une liste HTML
* @param {HTMLElement} eleListe - Liste HTML (ol ou ul) à remplir
* @param {Array} erreurs - tableau de String
*/
function ajouterFinListe(eleListe, erreurs) {
// Parcours les messages d'erreur
for (message of erreurs) {
// Ajoute un li au contenu de la liste
eleListe.innerHTML += "<li>" + message.toString() + "</li>";
}
}
// Si il y a des erreurs
if (erreurs.length > 0) {
// Ajoute les erreurs à la fin de ul.message
ajouterFinListe(eleMessage, erreurs);
} else {
// Envoi du formulaire
eleFormulaire.submit();
}
});
CSS
body {
font-family: "Trebuchet MS", Helvetica, sans-serif;
}
ul.message {
color: #ecf0f1;
background-color: #e74c3c;
}
ul.message li {
padding: .5em 0;
}
form ul {
list-style-type: none;
padding: 0;
}
form ul li {
padding: 0 0 1em 0;
}
form ul li label {
display: block;
font-weight: bold;
}
ED I T ON
JavaScript
HTML CSS JS
Moderne Result
Run Pen
Les bases
Les fonctions fléchées ont été introduites dans ES6. Elles permettent d'écrire un de fonction de manière raccourcie :
// Fonction régulière
hello = function() {
return "Hello World!";
}
En bref, les fonctions fléchées n'injecte pas l'objet this , donc ne l'utilisez pas !
Dans les fonctions régulières, this représente l'objet qui appelle la fonction, qui peut être la fenêtre, le document, un bouton ou autre.
Dans les fonctions fléchées, this représente toujours l'objet qui a créé la fonction fléchée, s'il y en a eu un.
Comme le présente l'exemple ci-après, l'objet this est undefined dans la fonction fléchée.
Run Pen
Les Template literals permettent d'écrire des chaines de caractètes multilignes contenant des expressions.
Ces chaines spéciales sont délimitées par des accents graves `ma chaine` .
Les expressions commencent par un $ et sont délimitées par des accolades : ${expression}
document.write(ficheClient);
ED I T ON
JS Result
Run Pen
Les ensembles Set est un nouveau type d'objet arrivé avec ES6 (ES2015), qui permet de créer des collections de valeurs uniques.
Voici un exemple simple montrant un ensemble de base et quelques-unes des méthodes disponibles comme add , size , has , forEach ,
delete et clear .
animals.add('🐷');
animals.add('🐼');
animals.add('🐢');
animals.add('🐿');
console.log(animals.size); // 4
animals.add('🐼');
console.log(animals.size); // 4
console.log(animals.has('🐷')); // true
animals.delete('🐷');
console.log(animals.has('🐷')); // false
animals.forEach(animal => {
console.log(`Hey ${animal}!`);
});
// Hey 🐼!
// Hey 🐢!
// Hey 🐿!
animals.clear();
console.log(animals.size); // 0
myAnimals.add(['🐨', '🐑']);
myAnimals.add({ name: 'Rud', type: '🐢' });
console.log(myAnimals.size); // 4
myAnimals.forEach(animal => {
console.log(animal);
});
// 🐷
// 🐢
// ["🐨", "🐑"]
// Object { name: "Rud", type: "🐢" }
Strings are a valid iterable so they can also be passed-in to initialize a set:
On top of using forEach on a set, for…of loops can also be used to iterate over sets:
let moreAnimals = new Set(['🐺', '🐴', '🐕', '🐇']);
// Howdy 🐺
// Howdy 🐴
// Howdy 🐕
// Howdy 🐇
console.log(items.next());
console.log(items.next());
console.log(items.next());
console.log(items.next().done);
// Object {
// done: false,
// value: "🍕"
// }
// Object {
// done: false,
// value: "🍾"
// }
// Object {
// done: false,
// value: "🎊"
// }
// true
Paramètres par défaut