Anis Boubaker, Ph.D.
Prof. Enseignant en informatique
Le seul langage de programmation qui s'exécute dans un navigateur! mais aussi...
Sondage StackOverflow 2022, mené auprès des développeurs
...
Cliquez ici!
...
<script type="text/javascript">
alert("Bonjour le monde!");
</script>
Le mot clé let permet de déclarer une variable.
Les variables sont typées dynamiquement.
La fonction typeof permet de déterminer le type inféré:
On peut aussi déclarer des variables avec le mot clé var:
On déclare une constante avec le mot clé const:
Il est possible de modifier les propriétés d'un objet, même si c'est const!
let
.
Type | Exemples de valeurs |
---|---|
Number | 42, 3.24, Infinity, -Infinity, NaN (Not a Number) |
BigInt | 9007199254740991n |
Boolean | true, false |
String | "Hello, world!", 'TCH056' |
Undefined | Variable non définie (voir plus loin) |
null | null= absence intentionnelle de valeur d'objet |
En Javascript, le type boolean existe et peut prendre la valeur true ou false
MAIS... Toute valeur "véridique" (truthy) sera considérée comme vraie et une valeur "non-véridique" (falsy) sera considérée comme fausse
void
)Les fonctions Boolean(), Number() et String() permettent de convertir entre type de données (type casting):
Expression | Résultat |
---|---|
a && b | b si Boolean(a) est true, sinon a. |
a || b | a si Boolean(a) est true, sinon b. |
==
==
`
===
===
` donnera une valeur vraie si les deux valeurs sont égales ET de même type
===
pour tester l'égalité, sauf exception où le comportement du `==` est souhaitable.Un objet est un ensemble de propriétés de type clé-valeur. On peut définir un objet à l'aide d'un littéral en notation JSON { ... }
On accède aux propriétés d'un objet à l'aide de la notation xxx.yyy:
En JS, un tableau est une structure pouvant contenir plusieurs éléments pas forcément du même type
Plusieurs méthodes sont disponibles pour manipuler les chaines de caractères
toLowerCase | toUpperCase | indexOf |
lastIndexOf | includes | startsWith |
endsWith | slice | substring |
substr | localeCompare |
Plusieurs façon d'en déclarer:
En JS, une fonction est une donnée qu'on peut affecter...
On peut même retourner une fonction...
Et passer une fonction en paramètre...
Map | Reduce | Filter | forEach |
Ensemble de fonctions disponibles pour:
Il existe plusieurs DOM (HTML, SVG, XML), mais ils partagent tous la même API normalisée par le W3C.
Quatre approches/méthodes de sélection (démontrées en classe)
const conteneur = document.getElementById('conteneur');
const hots = document.getElementsByClassName('hot');
//NOTE: `hots` est un tableau!!
const paragraphes = document.getElementsByTagName('p');
//NOTE: paragraphes est un tableau!!
const lesHot = document.querySelector('#conteneur p.hot');
//NOTE: Un seul élément est sélectionné (le premier
// qui est satisfaisant)
const lesHot = document.querySelectorAll('#conteneur p.hot');
//NOTE: Tous les éléments satisfaisants au sélecteur seront
// retournés (dans un tableau)
const conteneur = document.getElementById('conteneur');
const paragraphes = conteneur.getElementsByTagName('p');
//NOTE: Seuls les paragraphes descendants du div#conteneur
//seront sélectionnées!
const lien = document.querySelector('div p a');
const leSpan = lien.parentNode;
const conteneur = document.querySelector('div#conteneur');
const enfants = conteneur.childNodes;
//Contient les noeuds p.para.hot, p#texte et div.hot
const conteneur = document.querySelector('div#conteneur');
const premier = conteneur.firstChild; //p.para.hot
const dernier = conteneur.lastChild; //div.hot
const conteneur = document.querySelector('p#texte');
const premier = conteneur.previousSibling; //p.para.hot
const dernier = conteneur.nextSibling; //div.hot
Trois méthodes pour lire le contenu d'un élément (et pour le modifier!)
>> Démonstration
//Création d'un nouveau paragraphe
const nouveauParagraphe = document.createElement("p");
//Définition du contenu du paragraphe
nouveauParagraphe.textContent =
"Ceci est le contenu du nouveau paragraphe";
>> Démonstration
const elt = document.querySelector("#mon_element");
elt.remove(); //L'élément disparaît de l'écran
const conteneur = document.querySelector("#conteneur");
//On supprime le 3e enfant de conteneur
const supprime =
conteneur.removeChild( conteneur.childNode[2] );
Deux façons pour modifier les attributs d'un élément:
const a = document.createElement('a');
a.href = "https://www.etsmtl.ca";
a.target = "_blank";
let valeur = a.target;
className
)data-extra-info
)Deux façons pour modifier les attributs d'un élément:
setAttribute
:
const a = document.createElement('a');
a.setAttribute('href', "https://www.etsmtl.ca");
a.setAttribute('target', "_blank");
getAttribute
pour la lectureremoveAttribute
:
const para = document.createElement('p');
para.id="un-identifiant";
para.removeAttribute('id');
null
ne supprime pas un attribut.className
class
de l'élément
const para = document.createElement('p');
//Définit les classes 'important' et 'citation' au
//nouvel élément créé
para.className = "important citation";
//équivalent à:
//para.setAttribute('class', "important citation");
classList
d'un élémentadd
, remove
et replace
pour changer les classes de l'élément
const conteneur = document.querySelector("#conteneur");
//Ajoute la classe `large` à conteneur
conteneur.classList.add('large');
//Supprime la classe `demo` de conteneur
conteneur.classList.remove('demo');
toggle
est utile pour désactiver et réactiver une classe.style
regroupe toutes les déclarations de style définies en-ligne sur un élément
const conteneur = document.querySelector("#conteneur");
conteneur.style.width = '100fr';
conteneur.style.backgroundColor = 'lightgreen';
//Au lien de:
//conteneur.style.background-color = 'lightgreen'; //INCORRECT
>> Démonstration
Note: L'introduction récente des WebWorkers permet d'effectuer un vrai parallélisme (pas au programme)
>> Illustration
setTimeout
et setInterval
)setTimeout
Fonction qui permet de programmer une exécution différée d'un traitement après un délai en ms
Prend deux arguments:
let faireQqeChose = function(){
alert("Délai écoulé!");
}
//Exécution après 2 secondes
setTimeout(faireQqeChose, 2000);
setTimeout
- Fonction anonyme
//Exécution après 2 secondes
setTimeout(function(){
alert("Délai écoulé!");
}, 2000);
//Exécution après 2 secondes
setTimeout( () => alert("Délai écoulé!") , 2000);
setTimeout
- Question
//Exécution après 2 secondes
setTimeout( () => alert("Délai écoulé!") , 2000);
let resultat = 0n;
for(let i=0; i < 600000000; i++){
resultat += BigInt(i);
}
console.log(`Le résultat est: ${resultat}`);
>> Illustration
Exemple: le timeout, défini avec setTimeout, est un événement qui se produit lorsque le délai du timeout est expiré.
Note: Cette liste est loin d'être exhaustive!
addEventListener()
permet d'ajouter un gestionnaire d'événement pour un événement spécifique.removeEventListener()
permet de supprimer un gestionnaire d'événement pour un événement spécifique.addEventListener
reçoit, par défaut, deux paramètres: (1) le type d'événement à écouter et (2) la fonction de rappel
let mon_bouton = document.querySelector('button#mon-bouton');
mon_bouton.addEventHandler(
'click',
function(){alert("Bouton cliqué!")}
);
//La fonction anonyme sera exécutée à chaque fois qu'on
//clique sur le bouton.
Comme toute librairie Javascript, il est possible de:
jQuery déclare sa fonction principale $
qui agit comme sélecteur et est le point d'entrée à toutes les fonctionnalités offertes.
En javascript, le caractère "$
" est un caractère permis pour nommer une fonction/variable.
//Cache tous les éléments de type p
$("p").hide();
$(selecteur)
$('#conteneur div>p')
$(document)
get
pour obtenir le noeud du DOM correspondant à un objet jQuery.
Défilez vers le bas pour voir un exemple de code.
let header_jq = $('header#top_page');
let header_dom = $('header#top_page').get();
//Pour changer le contenu de top_page:
header_jq.text("Allô"); //méthode 1: jQuery
header_dom.textContent = "Allô"; //méthode 2: DOM
//Si le sélecteur retourne plusieurs éléments,
//la méthode get prend un indice (0 par défaut)
let paragraphe3_dom = $('p').get(2);
jQuery
vs querySelector
document.querySelector()
retourne uniquement le premier élément qui correspond au
sélecteur. Si on souhaite retenir tous les éléments, il faut utiliser document.querySelectorAll()
//Toutes les div de classe "solution" seront cachées
$('div.solution').hide();
$('.maClasse').css('color', 'red').show();
$('p#id1').html('Nouveau contenu');
$('p').text('Texte mis à jour');
$("input#prenom[type='text']").val('Marie');
$('img.missing').attr('src', '/images/missing.jpg');
let alt = $('a#accueil').attr('alt');
//Supprime l'attribut "title" de tous les éléments de type "a"
//de la page
$('a').removeAttr('title');
$("p.important").addClass("surbrillance bienVisible");
//Le chaînage est très utile!
$("a.externe").removeClass("a-rouge").addClass("a-bleu");
/$('div').toggleClass('encadre');
//change la couleur du texte de tous les div en rouge
$('div').css('color', 'red');
//applique plusieurs styles en même temps
$('div').css({'background-color': 'blue',
'font-size': '14px'});
//Cache un élément si il a été cliqué
$('p').on('click', function() { $(this).hide(); });
$('p').on({
mouseenter: function() { $(this).css('color', 'red'); },
mouseleave: function() { $(this).css('color', 'black'); }
});
$('#monBouton').off('click');
Source: jquery.com
$( "#list" ).on( "click", "a[href^='http']",
function( event ) {
$( this ).attr( "target", "_blank" );
}
);
Quelques fonctions permettent de créer des effets d'affichage simplement
$('#monElement').hide();
$('#monElement').show();
$('#monElement').toggle();
$('#monElement').fadeIn();
$('#monElement').fadeOut();
$('#monMenu').slideDown();
$('#monMenu').slideUp();
Naviguez vers le bas pour afficher un exemple de code avec .ajax()
.ajax()
$.ajax({
url: 'https://monapi.com/utilisateurs/123',
type: 'PUT',
data: JSON.stringify({
nom: 'Valjean',
prenom: 'Jean'
}),
//Type de donnée envoyé
contentType: 'application/json; charset=utf-8',
//Type de donnée attendu du serveur
dataType: 'json',
//Fonction de rappel exécutée (async) en cas de succès
success: function(response) {
// Traitement en cas de succès
// Supposons que la réponse contienne un objet utilisateur
// mis à jour, avec un attribut 'message' de confirmation
console.log("Mise à jour réussie:", response.message);
// Affiche également le nom et le prénom mis à jour
console.log("Informations mises à jour:", response.nom,
response.prenom);
// Par exemple, si vous voulez mettre à jour le contenu
// d'un élément HTML
$('#infoUtilisateur').html('Mise à jour réussie: '
+ response.message +
+ '. Nom: '
+ response.nom
+ ', Prénom: '
+ response.prenom
+ '.
');
},
//Fonction de rappel (async) exécutée en cas d'erreur
error: function(xhr, status, error) {
// Traitement en cas d'échec
console.error("Erreur lors de la mise à jour",
status,
error);
}
});
axios.get('https://api.exemple.com/data')
.then(function (response) {
// Traite la réponse
console.log(response.data);
})
.catch(function (error) {
// Gère l'erreur
console.error(error);
});
Note: Le contenu de response.data sera automatiquement traité et converti en fonction de
l'entête 'Content-Type'
envoyée par le serveur
Il n'est donc pas nécessaire de faire JSON.parse(response.data) si le Content-type est envoyé correctement par le serveur.
catch
axios.get('https://api.exemple.com/data-inexistante')
.then(function (response) {
// Ce code ne sera pas exécuté si le serveur répond avec
// un statut d'erreur (non 2xx)
console.log("Réponse réussie:", response.data);
})
.catch(function (error) {
// Ce code est exécuté si le serveur répond avec un
// statut d'erreur (non 2xx)
if (error.response) {
// La requête a été faite et le serveur a répondu
// avec un statut d'erreur
console.log("Erreur! Statut:", error.response.status);
} else if (error.request) {
// La requête a été faite mais aucune réponse
// n'a été reçue
console.log("Erreur de requête:", error.request);
} else {
// Une erreur s'est produite lors de la mise en
// place de la requête
console.log("Erreur:", error.message);
}
});
axios.post('https://api.exemple.com/data', {
nom: 'Valjean',
prenom: 'Jean'
})
.then(function (response) {
console.log(response.data);
})
.catch(function (error) {
console.error(error);
});
axios.put('https://api.exemple.com/utilisateurs/123', {
nom: 'Martin',
prenom: 'Luc'
})
.then(function (response) {
console.log(response.data);
})
.catch(function (error) {
console.error(error);
});
axios.delete('https://api.exemple.com/utilisateurs/123')
.then(function (response) {
console.log("Ressource supprimée avec succès.");
})
.catch(function (error) {
console.error(error);
});