0

Parce que StorageEvent does not work here, je souhaite implémenter un gestionnaire d'événements par localStorage.Implémenter un StorageEvent par localStorage

Supposons que nous ayons une page Web comme suit. Tout changement dans le champ de saisie déclenchera un événement, nous sauvegardons la nouvelle valeur dans localStorage. JSBin

<html ng-app="app"> 
    <head> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"></script> 
    </head> 
    <body ng-controller="Ctrl"> 
    <input type="text" ng-model="text"></input> 
    <div id="console"></div> 
    <script> 
     var app = angular.module('app', []); 
     app.controller('Ctrl', ["$scope", function ($scope) { 
     $scope.$watch('text', function (newValue, oldValue) { 
      var x = "nV: " + newValue; 
      localStorage.setItem("messages", localStorage.getItem("messages") + " " + x) 
      debug(localStorage.getItem("messages")) 
     }, false) 
     }]) 

     function debug(msg) { 
     document.getElementById("console").innerHTML += msg + "<br/>"; 
     } 
    </script> 
    </body> 
</html> 

Et nous avons une autre page Web qui écoute. Il analyse localStorage par setInterval. Il s'agit en fait d'un tube : plusieurs messages peuvent être stockés dans localStorage, et nous devons tous les traiter, puis vide localStorage. JSBin

<html> 
    <body> 
    <div id="console"></div> 
    <script> 
     var listen = setInterval(function() { 
     var m = localStorage.getItem("messages"); 
     if ((m !== "") && (m !== undefined)) { 
      localStorage.setItem("messages", "") 
      treatMessages(m); 
     } 
     }, 100) 

     function treatMessages(messages) { 
     debug(messages) 
     } 

     function debug(msg) { 
     document.getElementById("console").innerHTML += msg + "<br/>"; 
     } 
    </script> 
    </body> 
</html> 

Mais ce qui est important, est que nous devons nous assurer que aucun message est manqué par le récepteur. Malheureusement, ce n'est pas le cas pour le moment, par exemple, j'ai tapé rapidement 123456789 dans le champ de saisie, puis 12345 manquait sur le côté du récepteur. C'est probablement parce que l'expéditeur a généré 12345 juste après que le destinataire a lu le localStorage et avant que le destinataire vide le localStorage.

Est-ce que quelqu'un sait comment résoudre ce problème? Devrions-nous avoir un sémaphore pour localStorage ou y a-t-il une autre solution?

enter image description here

Edit 1: J'ai essayé d'ajouter un sémaphores par lock et waitfor: the sender et the receiver, mais il peut encore manquer des messages. Par exemple, 123456 est manquant dans l'exemple ci-dessous. Ce n'est pas surprenant, je pense que c'est parce que quand lock est free, nous avons entré simultanément le rappel du 2 waitfor, puis il a foiré.

enter image description here

Edit 2: J'ai fait un autre coup de feu qui est censé fonctionner mieux, mais je ne sais pas pourquoi les deux pages ne peuvent aligner leur valeur localStorage: the sender et the receiver

+0

Donc, juste pour obtenir ce tout droit, vous voulez capturer toutes ces valeurs sur le site web 2: 1,12,123,1234,12345,123456,1234567,12345678,123456789. Et non: 1,2,3,4,5,6,7,8,9 droite ?? Ou voulez-vous juste 123456789? –

+0

Oui, tous les «1,12,123,1234,12345,123456,1234567,12345678,123456789» que l'expéditeur envoie ... – SoftTimur

+0

Encore une question. Est-ce que cette hypothèse est correcte: Vous souhaitez attacher un gestionnaire d'événements à une zone de texte dans une autre fenêtre, en utilisant le stockage local? –

Répondre

1

Essayez le plus récent IndexedDB. https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Using_IndexedDB. C'est plus sophistiqué/complexe. Il est maintenant largement soutenu: http://caniuse.com/#search=indexeddb.

Je crois qu'il peut résoudre votre problème ci-dessus (messages manqués), mais il n'y a pas de changementEvénement. Je crois également qu'il ne sera pas en mesure de voir les changements à travers les instances de navigateur (WebKit) sur Mac (par exemple Excel pour Mac) en raison de la mise en cache, mais devrait fonctionner à travers les onglets.

0

Je suggère d'utiliser localDataStorage pour déclencher les événements pour vous, pour chaque ajout, suppression ou modification de valeur de clé. Il signale même ces événements dans une seule page/onglet! Cet utilitaire peut définir/obtenir n'importe lequel des "types" suivants: tableau, booléen, date, flottant, entier, nul, objet ou chaîne (aucune conversion nécessaire).

[DISCLAIMER] Je suis l'auteur de l'utilitaire [/ DISCLAIMER]

Une fois que vous instancier l'utilitaire, l'extrait suivant vous permettra de surveiller les événements:

function localStorageChangeEvents(e) { 
    console.log(
     "timestamp: "  + e.detail.timestamp + " (" + new Date(e.detail.timestamp) + ")" + "\n" + 
     "key: "   + e.detail.key  + "\n" + 
     "old value: "  + e.detail.oldval + "\n" + 
     "new value: "  + e.detail.newval + "\n" 
    ); 
}; 
document.addEventListener(
    "localDataStorage" 
    , localStorageChangeEvents 
    , false 
);