2012-07-05 13 views
30

No jQuery.Pure Javascript - archivia oggetto nel cookie

Voglio memorizzare un oggetto o un array in un cookie.

L'oggetto deve essere utilizzabile dopo l'aggiornamento della pagina.

Come faccio a farlo con puro JavaScript? Ho letto molti post, ma non so come serializzare in modo appropriato.


EDIT: Codice:

var instances = {}; 
... 
instances[strInstanceId] = { container: oContainer }; 
... 
instances[strInstanceId].plugin = oPlugin; 
... 
JSON.stringify(instances); 
// throws error 'TypeError: Converting circular structure to JSON' 
  1. Come faccio a serializzare instances?

  2. Come si mantiene la funzionalità, ma si modifica la struttura dell'istanza per poter serializzare con stringify?

+4

[ 'JSON.stringify()'] (https: //developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/stringify) it. – Matt

+0

converte l'oggetto in json e lo memorizza nel cookie. –

+0

'stringify' non funziona. Prendo 'TypeError: Converting circular structure to JSON' il mio codice è:' var instances = {}; instances [strInstanceId] .plugin = oPlugin; ... ' – Patrick

risposta

45

Prova quello di scrivere

function bake_cookie(name, value) { 
    var cookie = [name, '=', JSON.stringify(value), '; domain=.', window.location.host.toString(), '; path=/;'].join(''); 
    document.cookie = cookie; 
} 

Per leggere ci vuole:

function read_cookie(name) { 
var result = document.cookie.match(new RegExp(name + '=([^;]+)')); 
result && (result = JSON.parse(result[1])); 
return result; 
} 

per eliminarlo prendere:

function delete_cookie(name) { 
    document.cookie = [name, '=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=.', window.location.host.toString()].join(''); 
} 

per serializzare oggetti complessi/casi, perché non scrivere una funzione di dump dei dati nella tua istanza:

function userConstructor(name, street, city) { 
    // ... your code 
    this.dumpData = function() { 
    return { 
     'userConstructorUser': { 
      name: this.name, 
      street: this.street, 
      city: this.city 
     } 
     } 
    } 

Poi scaricare i dati, stringa i esso, scrivono al cookie, e la prossima volta che si desidera utilizzarlo basta andare:

var mydata = JSON.parse(read_cookie('myinstances')); 
    new userConstructor(mydata.name, mydata.street, mydata.city); 
+0

Grazie. Vado con quello se ottengo' stringify' per funzionare. Puoi controllare il mio problema di codice? – Patrick

+0

JSON non può serializzare intere istanze, ma è possibile serializzare qualsiasi dato rilevante che si desidera da queste istanze e reinizializzarle con questi dati salvati. Ad esempio, hai un'istanza dove name = 'John Doe', potresti scrivere una funzione su quell'istanza per restituire un oggetto come {myinstance: {name: 'John Doe'}}, e quindi chiamare di nuovo il costruttore con questi dati . Oltre a questo, potresti provare GSerializer: http://www.onegeek.com.au/projects/javascript-serialization (un buon post su questo), ma ti consiglio di non farlo perché i cookie hanno dimensioni limitate ... –

+0

. .. e un cookie troppo grande può comportare un errore permanente del sito per l'utente senza che te ne accorga perché l'intestazione Upstream è troppo grande. Ho modificato il mio post in modo da poter vedere cosa intendo con il mio commento sopra. –

2

Se è possibile serializzare l'oggetto nella sua rappresentazione di stringa canonica, e può unserialize di nuovo nella sua forma oggetto dal detto rappresentazione di stringa, allora sì, si può mettere in un cookie.

3

Utilizzare il metodo .toString() dello stesso oggetto se fornisce una serializzazione significativa o JSON.stringify(). Si noti, tuttavia, che i cookie sono generalmente di lunghezza limitata e non saranno in grado di contenere grandi quantità di dati.

+0

Bella nota sulla lunghezza del cookie –

2

Una classe adattamento cookie di: http://www.sitepoint.com/cookieless-javascript-session-variables/

Tutto quello che devi fare è impostare e ottenere le variabili che devi memorizzare nei cookie.

Lavora con: int, string, array, lista, Oggetto complesso

Esempio:

var toStore = Session.get('toStore'); 

if (toStore == undefined) 
    toStore = ['var','var','var','var']; 
else 
    console.log('Restored from cookies'+toStore); 

Session.set('toStore', toStore); 

Classe:

// Cross reload saving 
if (JSON && JSON.stringify && JSON.parse) var Session = Session || (function() { 
// session store 

var store = load(); 

function load() 
{ 
    var name = "store"; 
    var result = document.cookie.match(new RegExp(name + '=([^;]+)')); 

    if (result) 
     return JSON.parse(result[1]); 

    return {}; 
} 

function Save() { 
    var date = new Date(); 
    date.setHours(23,59,59,999); 
    var expires = "expires=" + date.toGMTString(); 
    document.cookie = "store="+JSON.stringify(store)+"; "+expires; 
}; 

// page unload event 
if (window.addEventListener) window.addEventListener("unload", Save, false); 
else if (window.attachEvent) window.attachEvent("onunload", Save); 
else window.onunload = Save; 

// public methods 
return { 

    // set a session variable 
    set: function(name, value) { 
     store[name] = value; 
    }, 

    // get a session value 
    get: function(name) { 
     return (store[name] ? store[name] : undefined); 
    }, 

    // clear session 
    clear: function() { store = {}; } 
}; 
})();