<!DOCTYPE html>
<html>
<head>
<script> // Exécuté en premier
console.log("Script in head");
</script>
</head>
<body>
JS Demo
<script> // À la fin, lorsque la page est chargée
console.log("Script at the end of body");
</script>
</body>
</html>
<!--
Le navigateur interprète le fichier du haut vers le bas
les scripts seront executé au moment lu dans le fichier
-->
<!DOCTYPE html>
<html>
<head>
<script src="head.js"></script>
</head>
<body>
External JS Demo
<script src="body.js"></script>
</body>
</html>
console.log("External script in head");
console.log("External script in body");
document
.
getElementById('id');
document.getElementById('header');
// Autres fonctions pouvant être appliquées au document OU autre element
ELEMENT.getElementsByClassName('paragraph'); // []
ELEMENT.getElementsByTagName('p'); // []
ELEMENT.querySelector('#title'); // 1 element
ELEMENT.querySelectorAll('div .paragraph'); // []
ELEMENT.children; // []
ELEMENT.parent; // 1 element
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<div id="container">
<p id="p1">First paragraph.</p>
<p id="p2">Another paragraph.</p>
<a href="/page.html">A link</a>
</div>
<script>
//
// Pourquoi on ne declare PAS le <script> dans le head?
//
const parentContainer = document.getElementById('container');
// DOCUMENT.getElementById
// const parentContainer = document.querySelector('#container');
console.log(parentContainer);
console.log(`${parentContainer.children.length} elements dans le container`);
const paragraphs = parentContainer.getElementsByTagName('p');
// ELEMENT.getElementSByTagName
// const paragraphs = parentContainer.querySelectorAll('p');
console.log(`${paragraphs.length} paragraphes: `);
for (let i = 0; i < paragraphs.length; i++) {
console.log(paragraphs[i]);
}
</script>
</body>
</html>
let firstParagraph = document.getElementById('p1');
firstParagraph.textContent = 'New <b>text</b>!'; // Texte BRUT de la balise
firstParagraph.innerHTML = '<button>Click here!</button>'; // Contenu HTML de la balise
firstParagraph.style.backgroundColor = 'blue'; // != background-color
firstParagraph.className = 'myClass'; // != class
document.getElementById('logo').src = '/img/logo.jpg';
<!DOCTYPE html>
<html>
<body>
<div id="container">
<p>First paragraph.</p>
<p>Another paragraph.</p>
<a id="link" href="/page.html">A link</a>
</div>
<script>
const secondParagraph = document.getElementsByTagName('p')[1]; // querySelectorAll('p')[ ... ]
secondParagraph.innerHTML = 'Second paragraph edited.';
secondParagraph.style.color = 'red';
const link = document.getElementById('link');
link.href = 'https://shawinigan.info';
</script>
</body>
</html>
let newParagraph = document.createElement('p');
newParagraph.innerHTML = 'Le texte...';
PARENT_ELEMENT.appendChild(newParagraph);
PARENT_ELEMENT.insertBefore(newParagraph, ELEMENT);
ELEMENT.remove();
PARENT_ELEMENT.replaceChild(newParagraph, ELEMENT);
<!DOCTYPE html>
<html>
<body>
<div id="container">
<p id="p1">First paragraph.</p>
<p id="p2">Second paragraph.</p>
<p id="p3">Another paragraph.</p>
<p id="p4">Last paragraph.</p>
</div>
<script>
const newParagraph = document.createElement('p');
newParagraph.innerHTML = 'New paragraph: ';
const link = document.createElement('a');
link.innerHTML = 'Shawi-info';
link.href = 'https://shawinigan.info';
newParagraph.appendChild(link);
const parent = document.getElementById('container');
parent.appendChild(newParagraph);
const first = parent.children[0];
const last = parent.children[3];
parent.replaceChild(last, first);
document.getElementById('p2').remove();
const another = parent.children[1];
parent.removeChild(another);
</script>
</body>
</html>
Par défaut, le navigateur fourni également 3 boîtes de dialogue
alert("Hey!");
const ok = confirm("Are you sure?");
console.log(`Confirm = ${ok}`);
const name = prompt("What is your name?");
console.log(`Prompt = ${name}`);
// Quelle est la différence entre annuler le prompt et confirmer sans rien écrire?
<!DOCTYPE html>
<html>
<body>
<script>
function go() {
// Message uniquement
alert("Hey!");
// 2 boutons, cancel et ok
// on peut recuperer le choix de l'utilisateur
const ok = confirm("Are you sure?");
console.log(`Confirm = ${ok}`);
// Permet a l'utilisateur d'ecrire dans un champ texte
const name = prompt("What is your name?");
console.log(`Prompt = ${name}`);
}
</script>
<button onclick="go()">Go!</button>
</body>
</html>
Pour les besoins du cours, nous nous concentrerons sur le navigateur web Google Chrome. En général, les navigateurs récents fournissent un ensemble similaire d'outils développeur :
📚 Chrome DevTools, Chrome DevTools pour JavaScript
📚 Outils développeur de Chrome et Firefox
La console, accessible dans les outils pour développeur, permet un déboguage simple et rapide
console.log( ) | info( ) | debug( ) | warn( ) | error( )
// Et avec style! %c
console.log("%cHello %cWorld", "color: red; font-size: xx-large", "color: blue;")
console.table(["a", "b", "c"])
console.assert(condition, "affiche seulement si condition est FAUX")
console.clear()
ℹ️ Plus d'options pour l'affichage à la Console
On peut utiliser console.log
pour comprendre le chemin emprunté par notre code
Les navigateurs web modernes supportent le mécanisme de points d'arrêts
debugger;
directement dans le code// Utiliser VS Code pour créer vos fichiers HTML et JS
// On doit ouvrir le fichier HTML dans le navigateur
// Le JS sera executé lors de l'interpretation du HTML
// Ne pas oublier de recharger la page après chaque changement au code!
// Ouvrir la Console des outils développeur pour surveiller les erreurs JS
// Dans le HTML, on inclut le JavaScript
// Il est preferable de séparer le JS dans un fichier distinct
// <script src="script.js"/>
// Il faut choisir judicieusement l'endroit de chargement de notre script
// Dans le head pour les utilitaires
// A la fin du body si le JS manipule le DOM au chargement
// Intégrer le JS suivant, dans le head
function logBody() {
console.log('Function logBody');
console.log(document.body);
}
console.log('Execution au chargement');
console.log(document.body);
// Appeler manuellement la fonction via la Console
// La console offre un environnement d'execution JavaScript complet,
// comme si le code faisait partie de notre fichier
// Tester à nouveau en déplaçant à la fin du body
// On peut ajouter un point d'arrêt et inspecter les valeurs des variables
function sum(number) {
debugger; // point d'arret
let total = undefined;
// 1 + 2 + 3 + ... + number
if (Number.isInteger(number) && number > 0) {
total = 0;
for(let i = 1; i <= number; i++) {
total += i;
}
}
return total;
}
//
// Manipulation DOM
//
// Modifier la fonction sum() pour construire un affichage dans le DOM
// Si le paramètre reçu n'est PAS un entier supérieur à 0, afficher un message en rouge
// Sinon, afficher en bleu le résultat du calcul
// Tester script dans le head vs body
// Appeler la fonction pour accélérer le développement
function sum(number) {
let p = document.getElementById('result');
if (p == null) {
p = document.createElement('p');
p.id = 'result';
document.body.appendChild(p);
}
let total = undefined;
// 1 + 2 + 3 + ... + number
if (Number.isInteger(number) && number > 0) {
total = 0;
for(let i = 1; i <= number; i++) {
total += i;
}
}
if (total == undefined) {
p.innerHTML = 'Pas un nombre superieur a 0!';
p.style.color = 'red';
} else {
p.innerHTML = `Résultat = ${total}`;
p.style.color = 'blue';
}
}
sum(10);