Comme dans les TP précédents, il faut télécharger et ouvrir localement les fichiers suivants, l’ensemble des fichiers est disponible dans l’archive LIFAP5-TP3-fichiers.zip
.
On aura également besoin des fichiers de données suivantes disponible sur le serveur :
Ce TP 3/4 est sur deux séances, il fait suite au TP2. Le point de départ correspond à peu près au résultat attendu en fin de TP2, où on a une page d’affichage des nouvelles avec un filtre sur le mois et l’année souhaités.
L’objectif du TP 3/4 est de réorganiser le code pour pouvoir gérer un tableau de nouvelle obtenu de façon asynchrone, alors que dans le TP2 ces nouvelles étaient stockés dans une constante.
Globalement, il s’agit d’écrire un programme le plus fonctionnellement possible :
const
, sans utiliser d’affectation ou de let
(et sans var
qui est de toute façon à bannir);map
, reduce
et filter
des tableaux sans utiliser de boucles for
ou while
.Cet exercice est une prise en main du code de départ.
elimine_doublons_trie
est pourquoi elle est utile dans le code ;mois_de_annee
;maj_annees
et change_annee
et quand elles sont utilisées ;liste_to_options
en style fonctionnel (dans le style de mois_de_annee
par exemple) ;maj_mois
pour la liste des mois ne contiennent que les mois de l’année sélectionnée en utilisant liste_to_options
et mois_de_annee
.Au lieu d’utiliser une liste de nouvelles statique, fournie directement dans le code JavaScript par la constante globale donnees_exemple
, on va vouloir charger dynamiquement les nouvelles depuis un fichier téléchargé par le navigateur.
La fonction fournie charge_donnees(url, callback)
charge, de façon asynchrone, le fichier json à l’adresse url
, puis appelle la fonction callback
en lui passant en argument le contenu du fichier chargé.
Cette fonction utilise l’API fetch
vue en cours et pourra servir d’exemple pour les exercices suivants. Vous pouvez aussi vous servir directement de fetch
en utilisant les promesses, sans passer par charge_donnees
.
charge_donnees(nouvellesUrl, console.log);
dans la console et observer le résultat.maj_annees(donnees_exemple)
dans init_menus
pour charger les nouvelles contenues dans le fichier nouvelles.json
en utilisant charge_donnees
. On utilisera maj_annees
dans le callback passé en paramètre de charge_donnees
et on s’interdira de faire une affectation sur la constante donnees_exemple
. Vous pourrez utiliser pour valeur de nouvellesUrl
l’adresse suivante : https://perso.liris.cnrs.fr/emmanuel.coquery/enseignement/lifap5/TP3/getjson.php?file=nouvelles.json (remarquez la présence du script PHP dans l’URL. Ce script permet de résoudre les problèmes liés aux erreurs “Cross-Origin Request Blocked”).A ce stade, le téléchargement doit fonctionner mais l’affichage des nouvelles filtrées n’est pas encore correct. Ne passez pas à la suite si vous ne comprenez pas pourquoi.
donnees_exemple
donnees_exemple
dans le fichier LIFAP5-TP3-test.js
. Sa valeur n’est plus disponible dans LIFAP5-TP3.js
: la page ne sera plus fonctionnelle et des erreurs JavaScript seront affichées dans la console.donnees_exemple
pour les rendre paramétriques et corriger les appels à ces fonctions pour passer le paramètre. Suivez les erreurs de la console pour y parvenir.À la fin de cet exercice, l’affichage des nouvelles doit être fonctionnel et utiliser les bonnes données chargées dynamiquement sans utiliser de variables globales.
Attention à la gestion des événements: il faut bien réfléchir à ce que l’on range dans les champs onchange
des menus : on y place une fonction qui n’attend pas d’arguments et qui sera empilée dans la task queue du navigateur.
Comme cette fonction doit accéder aux nouvelles courantes, il faut utiliser une fermeture qui va capturer ces nouvelles.
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 <div>
ainsi qu’à chacun des éléments <li>
qui le contient, cela permettra de les manipuler via document.getElementById
.masque_affiche_contenus
pour réagir au clic sur un titre (i.e. faire une affectation sur le champ onclick
de l’élément contenant le titre). Il faudra bien enregistrer une fonction pour chaque titre.display
de tous les contenus à “none”.Il est attendu d’arriver à cet exercice en fin de la première séance de TP. Si ce n’est pas le cas, le faire entre les deux séances.
<li>
et des <div>
est de modifier la liste des une bonne foi pour toute en leur donnant comme identifiant leur position dans le tableau.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.document.getElementById
peut être utilisé pour accéder à un élément en fonction de son id
.Document.querySelectorAll()
permet de retrouver tous les éléments qui sont sélectionné par un sélecteur CSS comme par exemple document.querySelectorAll("#elt-nouvelles ul li > div")
. Question : que fait ce sélecteur ?style
des éléments contient lui-même un champ display
qui représente la valeur du style CSS display
.ParentNode.children
, attention, la colelction retournée est un pseudo tableau, qui n’a pas de méthode map
: il faut le transformer avec par exemple Array.from()
On ne peut pas faire cet exercice sans avoir terminé le précédent, vu qu’il s’agit d’une extension.
Le fichier annuaire.json
contient une structure JSON avec des liens vers des listes de nouvelles.
annuaire.json
. Un choix dans ce menu déclenchera le chargement des données correspondant à la bonne liste de nouvelles, comme dans les exercices précédentscatch
des promessesAfin d’afficher un message d’erreur à l’utilisateur en cas de problème de chargement, on utilisera directement l’API fetch
vue en cours au lieu de la fonction charge_donnees
.