IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

sessionStorage et localStorage


Sujet :

JavaScript

  1. #1
    Membre éprouvé Avatar de Olivier P.
    Homme Profil pro
    Développeur Front-End chez un éditeur logiciel
    Inscrit en
    Octobre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Front-End chez un éditeur logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2012
    Messages : 83
    Par défaut sessionStorage et localStorage
    Bonjour,

    Je travaille sur une application web exploitant le multi-onglet. La communication inter-onglets se fait principalement via le localStorage.

    Remarque : Je privilégie le localStorage car l'utilisateur est souvent amené à ouvrir un nouvel onglet par action manuelle sur le navigateur.
    Or dans ce cas là, il n'y a aucune recopie du sessionStorage d'un onglet à l'autre.

    Je voudrai pouvoir ré-initialiser le localStorage en cas de fermeture du navigateur. Mais je voudrai couvrir les 2 cas suivants :

    - Fermeture demandée par l'utilisateur (==> j'utilise pour cela l'évènement onbeforeunload)
    - Fermeture par un crash ou kill Task...

    Or je ne trouve aucune solution pour le deuxième cas....

    Pourtant le sessionStorage sait très bien le gérer visiblement...

    Comment le sessionStorage y arrive t'il ? Quelqu'un saurait-il me répondre ?

    Merci d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    il existe certainement une metode setInterval qui boucle ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre éprouvé Avatar de Olivier P.
    Homme Profil pro
    Développeur Front-End chez un éditeur logiciel
    Inscrit en
    Octobre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Front-End chez un éditeur logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2012
    Messages : 83
    Par défaut
    Merci pour ta réponse.

    Elle ferait quoi cette function exactement ?

    L'autre souci que je rencontre, c'est sur l'évènement onbeforeunload. En effet, je me rend compte que lorsque je ferme seulement 1 onglet (alors que plusieurs sont ouverts), le onbeforeunload est appelé ... Or je ne veux pas reset mon cache uniquement si 1 onglet est fermé et qu'il en reste d'autres ouverts...

    Incroyable qu'il n'y ai pas une solution propre, gérant tous les cas de fermeture onglet/navigateur ... Si qqun a une telle librairie, je suis preneur

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Euh, ce serait pas simplement parce que sessionStorage redémarre à chaque fois qu'on ouvre un nouvel onglet ? Autrement dit, ce n'est pas à la fin qu'il se réinitialise, c'est au début.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éprouvé Avatar de Olivier P.
    Homme Profil pro
    Développeur Front-End chez un éditeur logiciel
    Inscrit en
    Octobre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Front-End chez un éditeur logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2012
    Messages : 83
    Par défaut
    Le sessionStorage est unique par onglet, mais par contre, il se copie d'un onglet à l'autre si le nouvel onglet est ouvert à travers une interaction sur le premier (bouton, lien, ...).
    Il ne se copie pas si le deuxième onglet est ouvert via le navigateur (ouverture d'une nouvel onglet + navigation vers l'appli via URL)

    Si je ferme un onglet et que j'utilise le onbeforeunload pour clear le localStorage, il sera clear pour mes autres onglets encore actifs... pas bon

  6. #6
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    Colle un script sur ta page qui modifie le localStorage dans une bouycle setInterval ...
    Certes un peu gourmand, mais on n'a rien sans rien
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  7. #7
    Membre éprouvé Avatar de Olivier P.
    Homme Profil pro
    Développeur Front-End chez un éditeur logiciel
    Inscrit en
    Octobre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Front-End chez un éditeur logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2012
    Messages : 83
    Par défaut
    euh... Désolé je comprend pas bien ...

    Le setInterval permet de déclencher une function tous les n milli-secondes... on est d'accord ?

    Là, en l'occurence, je veux pouvoir clear le localStorage si le browser tombe...

    Que suggères tu que fasse la function dans mon cas ?

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par Olivier P. Voir le message
    Là, en l'occurence, je veux pouvoir clear le localStorage si le browser tombe...

    Que suggères tu que fasse la function dans mon cas ?
    Là comme ça je dirais, maintenir un timestamp de dernier moment où le storage a été utilisé, et si ce timestamp est trop vieux la prochaine fois que tu lis le storage, tu le clear entièrement pour recommencer.

    Citation Envoyé par Olivier P. Voir le message
    Incroyable qu'il n'y ai pas une solution propre, gérant tous les cas de fermeture onglet/navigateur ...
    Pas particulièrement... La communication multionglet c'est pas quelque chose qui vient tellement à l'esprit, tout comme l'absolue nécessité qu'il faut absolument repartir de zéro juste parce qu'on réouvre le navigateur au lieu de juste reprendre là où on en était.

    Ce qu'il te faudrait c'est simplement quelque chose comme sessionStorage, c'est à dire qui vit dans la mémoire du navigateur mais n'est pas sauvegardé, mais qui se partage entre onglets. Et il n'y en a pas.
    Avec le multiécran, il est possible que la notion de session, définie par onglets uniques, ne soit pas idéale et que tu sois sur une idée novatrice. Mais bon, au départ c'est un mouton à cinq pattes ton bazar, donc c'est lui qui est incroyable.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre éprouvé Avatar de Olivier P.
    Homme Profil pro
    Développeur Front-End chez un éditeur logiciel
    Inscrit en
    Octobre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Front-End chez un éditeur logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2012
    Messages : 83
    Par défaut
    Bien vu le coup du Timestamp, je vais creuser dans ce sens...

    L'application en question permet l'ouverture de grilles et de graphiques.
    Par souci de clarté, l'utilisateur peut ouvrir plusieurs onglets contenant chacun des graphiques/grilles (à l'image d'un Excel par exemple).
    L'application a besoin de maintenir des données inter-onglets...

    Ce genre d'usage ne me parait pas si incroyable en 2016 ... :p

    En outre, le Storage se décline en 2 modes :
    - le localStorage, persistent en multi-onglet et persistent en fermeture/crash du browser.
    - le sessionStorage, non persistent.

    Donc, le "core" sait correctement gérer tous les cas. A quand un simple mixe des 2 pour un storage persistent inter-onglets, mais non persistent en fermeture/crash du browser.

    Vu les discussions et les usines à gaz montées pour gérer cette problématique de crash browser, je suis loin d'être le seul à avoir ce besoin...

    Je vais peut-être l'écrire la librairie tiens ^^

  10. #10
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    bascule ta variable de localstorage dans une variable js au démarrage, puis efface le localstorage ?
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  11. #11
    Membre éprouvé Avatar de Olivier P.
    Homme Profil pro
    Développeur Front-End chez un éditeur logiciel
    Inscrit en
    Octobre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Front-End chez un éditeur logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2012
    Messages : 83
    Par défaut
    Donc au final... Voilà ce que j'ai fait. Si ca peut servir à d'autres ...

    setInterval est déclenché toutes les 500ms. Il SET la date du moment dans le localStorage.

    Sur le onload, je compare la date du moment avec le dernier tic. Si c'est supérieur à 1scde je considère qu'il y a eu
    une fermeture/crash du browser. Alors, je reset le storage.

    Ca marche très bien.

    Merci à vous


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     
    window.onload = function (e) {
        var now = new Date().getTime();
        var lastTic = localStorage.getItem('lastTic');
     
        if ((now - lastTic) > 1000) {
            localStorage.clear();
        }
        startInterval();
    }
     
    function startInterval() {
        window.setInterval(intervalCallback, 500);
    }
     
     function intervalCallback() {
         localStorage.setItem('lastTic', new Date().getTime());
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. localStorage, IE8, IE9 et ajax
    Par yan dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 20/06/2012, 10h35
  2. Webview et localstorage pour html 5
    Par otomatik dans le forum Composants graphiques
    Réponses: 0
    Dernier message: 04/05/2011, 18h43
  3. [1.x] sessionStorage et forward() depuis une classe de routing
    Par trefle dans le forum Symfony
    Réponses: 4
    Dernier message: 22/02/2011, 18h39
  4. localStorage et utilisation hors-ligne
    Par Yorick dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 04/10/2010, 20h58
  5. [AJAX] localStorage avec requête AJAX
    Par JeffPalmier dans le forum AJAX
    Réponses: 1
    Dernier message: 16/08/2010, 16h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo