2012-07-05 16 views
30

No jQuery.Javascript puro - almacenar objeto en cookie

Quiero almacenar un objeto o matriz en una cookie.

El objeto debería poder usarse después de la actualización de la página.

¿Cómo hago eso con JavaScript puro? Leo muchas publicaciones, pero no sé cómo serializar de forma adecuada.


EDIT: Código:

var instances = {}; 
... 
instances[strInstanceId] = { container: oContainer }; 
... 
instances[strInstanceId].plugin = oPlugin; 
... 
JSON.stringify(instances); 
// throws error 'TypeError: Converting circular structure to JSON' 
  1. ¿Cómo serializar instances?

  2. ¿Cómo se mantiene la funcionalidad, pero la estructura de cambio de instancia para ser capaz de serializar con stringify?

+4

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

+0

convierte el objeto a json y lo almacena en una cookie. –

+0

'stringify' no funciona. Obtengo 'TypeError: Convertir la estructura circular a JSON' mi código es:' var instances = {}; instancias [strInstanceId] .plugin = oPlugin; ... ' – Patrick

Respuesta

45

probar eso en escribir

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

Para leer se necesita:

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

Para eliminar toma:

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

para serializar objetos complejos/instancias, por qué no escribir una función de volcado de datos en su instancia:

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

A continuación, volcar los datos, stringify que, escriben a la cookie, y la próxima vez que desee utilizarlo sólo tiene que ir:

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

Gracias Me voy con eso si consigo' stringify' para que funcione. ¿Puedes verificar mi problema de código? – Patrick

+0

JSON no puede serializar instancias completas, pero puede serializar los datos relevantes que desee de estas instancias y reiniciarlos con estos datos guardados. Por ejemplo, tiene una instancia donde name = 'John Doe', puede escribir una función en esa instancia para devolver un objeto como {myinstance: {name: 'John Doe'}}, y luego llamar al constructor nuevamente con estos datos . Aparte de eso, puedes probar el GSerializer: http://www.onegeek.com.au/projects/javascript-serialization (buena publicación sobre eso) Pero yo recomendaría contra eso porque las cookies son de tamaño limitado ... –

+0

. .. y una cookie demasiado grande puede ocasionar una falla permanente del sitio para el usuario sin que lo notes porque el encabezado de Upstream es demasiado grande. Edité mi publicación para que pueda ver lo que quiero decir con mi comentario anterior. –

2

Si se puede serializar el objeto en su representación de cadena canónica, y puede unserialize de nuevo en su forma de dicho objeto representación de cadena, entonces sí que puede ponerlo en una cookie.

3

Utilice cualquiera de los métodos del propio .toString() del objeto si proporciona una serialización significativa o JSON.stringify(). Tenga en cuenta, sin embargo, que las cookies generalmente tienen una longitud limitada y no podrán contener grandes cantidades de datos.

+0

Bonita nota sobre la longitud de la cookie –

2

Una clase de adaptación cookie de: http://www.sitepoint.com/cookieless-javascript-session-variables/

Todo lo que necesita hacer es establecer y obtener las variables que necesita almacenar en la cookie.

Trabajar con: int, cadena, matriz, lista, objeto complejo

Ejemplo:

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

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

Session.set('toStore', toStore); 

Clase:

// 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 = {}; } 
}; 
})(); 
Cuestiones relacionadas