Les fichiers sont disponibles dans l’archive DIU-EIL-WEB-fichiers.zip
. Téléchargez puis ouvrez les fichiers DIU-EIL-WEB.html
dans firefox et les fichiers DIU-EIL-WEB.js
et DIU-EIL-WEB.css
avec votre éditeur.
Voir la section dans dans la présentation
console.log(fibonacci(10));
. Expliquez le résultat.DIU-EIL-WEB.js
puis actualiser la page (F5) et l’afficher dans la console..css
typeof "John";
typeof 3.14;
typeof NaN;
typeof false;
typeof {};
typeof {name:'John', age:34};
({}) instanceof Object;
typeof [1,2];
[1,2] instanceof Array;
[1,2] instanceof Object;
typeof new Date();
new Date() instanceof Date;
new Date() instanceof Object
typeof function () {};
typeof (() => {});
(() => {}) instanceof Function;
(() => {}) instanceof Object;
typeof un_truc;
typeof null;
typeof undefined;
let n = 42;
let b = false;
let s = "test";
let o = {name : "Romuald", age : 37};
let a = [0,1,1,2,3,5,8];
let f = function () {return 42;};
function test1(num, bool, str, obj, arr){
num++;
bool = !bool;
str += "foo";
obj.name = "Olivier";
arr.push(13);
console.log(num, bool, str, obj, arr);
}
// test1(n,b,s,o,a);
function test2(obj, arr, fun){
obj= {foo : "bar"};
arr = [42];
fun = function () {return 0;};
console.log(obj, arr, fun());
}
// test2(o,a,f);
for
écrire la fonction range(stop, [start], [step])
qui prend trois arguments en paramètre et renvoie le tableau des entiers compris entre start
(inclus) et stop
(exclu) avec un pas de step
:
start
n’est pas défini, sa valeur par défaut est 0;step
n’est pas défini, sa valeur par défaut est 1;stop
est inférieur ou égal à start
, alors le tableau vide est retourné.range(10, 0) == range(10) == [0,1,2,3,4,5,6,8,9]
range(10, 4, 2) == [4,6,8]
range(-2, 0)=[]
DIU-EIL-WEB-test.html
et DIU-EIL-WEB-test.js
, regardez comment sont écrits les tests de la fonction fibonacci(n)
automatisés avec https://mochajs.orgfibonacci(n)
qui calcule le nième terme de la suite de Fibonacci, e.g., fibonacci(7) = 13
et vérifier que votre code passe tous les tests existants. Utilisez Number.isInteger
pour vérifier le type des argumentsrange(stop, [start], [step])
dans votre suite de tests et testez là.fibonacci
et range
eslint-config-airbnb-base
debugger;
vous permet de placer des points d’arrêt dans votre code et d’utiliser le debugger de Firefox."#"
à tous les items du menu de gauche. Vous utiliserez pour cela document.querySelectorAll
avec le bon sélecteur css et et l’attribut Element.innerHTML
range
.addEventListener
est recommandée.this
Cette partie consiste à mettre en place un affichage pour des nouvelles stockées dans une structure JSON. On devra définir les traitements sur la collection nouvelles_exemple
puis associer ces traitements aux boutons de l’interface HTML pour les déclencher.
On recommande fortement, d’écrire les programmes dans le style le plus fonctionnel possible, sans variables globales, avec un maximum de d’initialisation const
(sans affectation donc) et en utilisant les fonctions map
et filter
des tableaux au lieu des boucles (for
et while
). Ce n’est pas toujours possible, il s’agit de faire au mieux et de savoir ce que l’on fait.
On souhaite afficher la liste des nouvelles classées par ordre de date décroissante. Pour y parvenir, il est proposer de suivre les étapes suivantes:
nouvelles_exemple
.trie_nouvelles_date
qui prend un tableau de nouvelles et renvoie un nouveau tableau trié par date décroissante.formate_titre
qui prend une nouvelle et renvoie une chaîne de caractères contenant le titre de la nouvelle entouré d’une balise <li>
.liste_nouvelles_html
qui utilisera les méthodes des tableaux et les fonctions définies précédemment pour générer une chaîne de caractères contenant le code HTML des titres de nouvelles classées par ordre de date décroissante.<div id="div-news"></div>
pour y insérer le résultat de liste_nouvelles_html
lors de l’événement DOMContentLoaded
et vérifiez que l’affichage est correctjoin
pour regrouper les éléments d’un tableau en une chaînesort
des tableaux qui peut prendre en paramètre une fonction de comparaison.String
en Date
ou utiliser l’ordre lexicograpĥique des dates au format ISO 8601Date
(ce qui est recommandé), vous pourrez utiliser toLocaleDateString
pour un affichage agréableinput
on peut utiliser le champ value
.On souhaite maintenant rendre plus interactif l’affichage des nouvelles dans <div id="div-news"></div>
en filtrant selon le mois et l’année sélectionnés deux menus déroulants (éléments select
). La spécification du comportement est la suivante :
Tout d’abord on réalise un premier filtrage simple de la liste de nouvelles
filtre_mois_annee(nouvelles, mois, annee)
qui filtre une liste de nouvelles selon le mois et l’année passés en arguments.maj_liste_nouvelles(nouvelles)
qui sera le handler onchange
de l’élément select-month
(c’est le pendant du onclick
des boutons), ce handler aura le comportement suivant :
select
dont l’id
est select-year
filtre_mois_annee
liste_nouvelles_html
id
est elt-nouvelles
Maintenant, il faut initialiser correctement les listes déroulantes
extraire_annees(nouvelles)
qui extrait les années qui apparaissent dans une liste de nouvelle.extraire_mois_de_annee(nouvelles, annee)
qui extrait les mois d’une année donnée qui apparaissent dans la liste de nouvellesinit_select_annees(nouvelles)
qui va générer les options
de l’élément select-year
init_select_mois(nouvelles, annee)
qui fait la même chose pour les mois de l’année sélectionnéevalue
d’un élément select
contient la valeur de l’option sélectionnée.selected
d’un élément option
vaut true
, c’est cette valeur qui sera présélectionnée dans le menu déroulant.Set
peuvent être utilisés pour éviter les doublons. Voir l’exemple ci-dessous qui prend un tableau, le transforme en ensemble puis en tableau à nouveau.function eliminer_doublons(liste) {
const asSet = new Set(liste);
return Array.from(asSet.values());
}
On souhaite se passer de nouvelles_exemple
et remplacer la constante par un téléchargement asynchrone des nouvelles. La fonction get_news(callback)
vous est fournie pour cela. Cette fonction accède via HTTP à un fichier JSON sur un serveur web,interprète le contenu du fichier puis exécute la fonction callback
passée en paramètre sur ce résultat.
La fonction get_news(callback)
utilise l’API fetch
qui est asynchone. On ne sait pas quand le serveur interrogé va renvoyer la donnée et on ne veut pas bloquer l’exécution du script (et donc te toute la page) à attendre sa réponse. La fonction get_news(callback)
ne renvoie pas le contenu du fichier on doit lui passer en paramètre le traitement à effectuer dans le futur quand les données seront disponibles.
Ce style de programmation assez particulier empèche moralement l’utilisation de return
: les fonctions ne renvoient plus de valeurs (ou en tous cas, pas le résultat du calcul) mais prennent en paramètre des fonctions appelées callbacks.
get_news(console.log)
dans la console. Dans l’onglet Network des outils de développement vous devriez voir l’appel XHR correspondant, le serveur répondant un code 200 avec Content-Type: application/json
, le corps de la réponse étant le fichier JSON.nouvelles_exemple
et repérez les erreurs associées.nouvelles_exemple
en un callback passé en paramètre de get_news()
.nouvelles_exemple
vous aideront.Pour le moment, on affiche juste la liste des titres des nouvelles. On souhaite en afficher aussi le contenu, mais seulement lorsque l’on clique sur le titre de la nouvelle. On souhaite également que l’affichage d’un contenu masque les autres contenus. Pour cela on propose de procéder de la manière suivante:
formate_titre
pour que chaque élément de la liste contiennent un élément div
avec le contenu de la nouvelle.id
unique à chacun de ces divs ainsi qu’à chacun des élément qui sont des titres de nouvelles, cela permettra de les manipuler via document.getElementById
. Le plus pratique pour cela est de modifier la liste des nouvelles pour donner à chacune d’elle sCes identifiants en ajoutant des champs idx_li
et idx_ctn
aux nouvelles.masque_affiche_contenus
ci-après pour réagir au clic sur un titre. Il faudra bien enregistrer une fonction pour chaque titre.display
de tous les contenus à none
.// prend une liste d'ID HTML id_contenus et les rens invisibles sur la page
// puis rend visible l'ID id_contenu_a_afficher (s'il existe)
function masque_affiche_contenus(id_contenus, id_contenu_a_afficher) {
id_contenus.map((idc) => {
document.getElementById(idc).style.display = 'none';
return idc;
});
if (id_contenu_a_afficher !== undefined) {
document.getElementById(id_contenu_a_afficher).style.display = 'block';
}
}
style
des éléments contient lui-même un champ display
qui représente la valeur du style CSS display
.map
), la fonction passée en argument peut prendre en plus de l’élément à traiter, un deuxième argument correspondant à son index dans le tableau.Dans la feuille de style, une classe dot
permet d’afficher un point. On va utiliser cette classe pour traquer le curseur de la souris en affichant le point dessous.
div
avec la classe dot
follow_mouse()
qui aura le comportement suivant :
mouse_pos
qui va stocker la position courante de la sourismousemove
un handler qui met à jour mouse_pos
setInterval
une fonction qui lit mouse_pos
et positionne le point sous le curseur en modifiant les attributs CSS left
et top
du div