Annuaire › Code ouvert
Code publié par son auteur, en lecture seule. « Copier dans mon espace » crée un nouveau site à vous (non publié) que vous pouvez modifier librement.
js/stockage.js · 2.9 Ko
/* ============================================================
Fichier : js/stockage.js
Rôle : petit module de sauvegarde qui NE PLANTE JAMAIS.
Il essaie localStorage ; s'il est interdit, il garde
les données en mémoire (perdues au rechargement).
Dépend de : rien (aucun autre fichier).
Utilisé par : js/app.js (qui doit être chargé APRÈS ce fichier).
Expose : l'objet global « Stockage » avec lire(), ecrire(), mode().
------------------------------------------------------------
POURQUOI CE FICHIER ?
Les sites du Portail tournent dans un « bac à sable » (sandbox) :
la page a une origine « opaque » et le navigateur refuse l'accès à
localStorage en levant une SecurityError (même lire la propriété
window.localStorage peut échouer !). Un programme qui ne prévoit pas
ce cas s'arrête net. Ici, chaque accès est protégé par try/catch.
============================================================ */
/* On utilise une IIFE (fonction exécutée immédiatement) :
les variables à l'intérieur restent PRIVÉES ; seul l'objet renvoyé
à la fin est visible de l'extérieur. */
const Stockage = (function () {
/** Mémoire de secours : un simple objet { clé: texte }. */
const memoire = {};
/** true tant que localStorage fonctionne ; passe à false au premier échec. */
let navigateurDisponible = true;
/**
* Écrit une valeur (texte) sous une clé.
* @param {string} cle - le nom sous lequel on range la donnée
* @param {string} valeur - le texte à ranger
* @returns {void}
*/
function ecrire(cle, valeur) {
memoire[cle] = valeur; // on écrit TOUJOURS en mémoire : c'est la copie de secours
if (!navigateurDisponible) { return; }
try {
window.localStorage.setItem(cle, valeur);
} catch (erreur) {
// SecurityError (bac à sable), QuotaExceededError (stockage plein)…
navigateurDisponible = false;
}
}
/**
* Lit la valeur rangée sous une clé.
* @param {string} cle - le nom de la donnée
* @returns {string|null} le texte trouvé, ou null s'il n'y a rien
*/
function lire(cle) {
if (navigateurDisponible) {
try {
const valeur = window.localStorage.getItem(cle);
if (valeur !== null) { return valeur; }
} catch (erreur) {
navigateurDisponible = false;
}
}
// Repli : la mémoire (undefined si rien -> on renvoie null pour rester cohérent)
return Object.prototype.hasOwnProperty.call(memoire, cle) ? memoire[cle] : null;
}
/**
* Indique où sont réellement gardées les données.
* Attention : ne pas appeler avant un premier lire()/ecrire(), car
* la disponibilité n'est connue qu'après un premier essai.
* @returns {string} "navigateur" ou "memoire"
*/
function mode() {
return navigateurDisponible ? "navigateur" : "memoire";
}
// Ce que l'on rend public :
return { lire: lire, ecrire: ecrire, mode: mode };
})();