2010-07-27 13 views
2

I just learned about jquery's .makeArray et j'essaye d'utiliser JSON.stringify pour stocker le tableau dans localStorage mais j'ai des résultats inattendus.Stocker un tableau dans localStorage en utilisant JSON.stringify

Cela fonctionne:

var links = {'one': 1, 'two': 2 }; 
var setstr = JSON.stringify(links); 

localStorage.setItem('strlinks', setstr); 
var getstr = localStorage.getItem('strlinks'); 
console.log(getstr); //Returns what's expected - '{"one":1, "two":2}' 

Cela ne signifie pas:

var links = $.makeArray($('a')); 

alert(links); //Returns list of links 
var setstr = JSON.stringify(links); 

localStorage.setItem('strlinks', setstr); 
var getstr = localStorage.getItem('strlinks'); 
console.log(getstr); //Returns '[]' 

Toutes les idées sur ce que je fais mal?

Répondre

3

links contient des références circulaires, il ne peut donc pas être sérialisé en JSON. Chrome 5.0.375.99 donne l'erreur:

TypeError: Converting circular structure to JSON 

Vous devez supprimer ces références circulaires. Bien sûr, cela dépend de l'information qui vous intéresse. Voici une version simplifiée:

var flatLinks = $.map(links, function(el) 
          { 
           return {href: el.href, text: el.textContent}; 
          }); 
var setstr = JSON.stringify(flatLinks); 
0

$('a') sélectionne tous les liens (HTMLAnchorElement s) sur la page.

Les éléments sont des nœuds DOM définis par leur identité et leur présence dans le document. Ce ne sont pas des valeurs simples que JSON peut représenter. Si vous regardez ce que JSON.stringify() retourne pour eux, c'est juste {}: JSON dit tout ce qu'il sait de l'objet, c'est que c'est un Object.

Cela n'a aucun sens d'essayer de placer un nœud à l'intérieur d'un localStorage; Qu'attendez-vous de revenir quand vous lirez le stockage demain? Un objet Node qui faisait partie d'un document que l'utilisateur a fermé et détruit hier?

Si vous voulez vous rappeler où les liens ont souligné, vous devriez obtenir que de leurs propriétés href, comme String type de valeur simple, -a qui peut sans risque être rappelé par localStorage.

+0

Peut-être que j'aboie le mauvais arbre mais c'est pour une extension de chrome. Ma pensée était d'ajouter le tableau à localStorage à partir d'un script de contenu, puis lorsque l'utilisateur clique sur l'icône du navigateur, faites défiler les liens et affichez-les dans un popup. Je suis nouveau pour les extensions de chrome, mais je crois comprendre qu'un popup ne peut pas accéder directement aux variables d'un script de contenu, d'où la nécessité d'un stockage local. Mais je pourrais être loin de la marque. – plntxt

+0

Une référence à un lien ne peut pas être placée dans un 'String', la seule chose que' localStorage' va stocker. Mais le popup n'a pas besoin de toucher le lien lui-même, n'est-ce pas? Il suffit de connaître l'URL vers laquelle pointe le lien ('href'), sûrement? C'est seulement un 'String', donc certainement JSON-stringified. Pas que je pense que vous avez vraiment besoin de 'localStorage' du tout. Je ne connais pas Chrome, mais la plupart des extensions de navigateur ne devraient pas avoir de difficulté à ouvrir une nouvelle fenêtre et à la remplir avec une liste de chaînes, sans avoir besoin de médiation via n'importe quel type de base de données 'localStorage'. – bobince

+1

Vous pouvez utiliser une page d'arrière-plan en tant que contrôleur et accéder aux valeurs stockées à partir de là. Voir le code de mon nouvel onglet Redirection pour des exemples (J'utilise JSON.stringify dans le code du tronc) http://code.google.com/p/newtabredirect/ –