2011-09-14 23 views
5

Quiero guardar localmente un objeto que tenga referencias circulares. ¿Cuáles son mis opciones?Cómo guardar un objeto con referencias circulares?

Lo primero que pensé fue en el uso del almacenamiento local en HTML5, pero no puedo escribir este objeto debido a las referencias circulares.

Específicamente estoy intentando guardar el objeto DOMSelection de la selección actual.

Ejemplo:

var sel = window.getSelection(); 
    var selstring = JSON.stringify(sel); // Breaks here ... 
    localStorage.setItem("selection",selstring); 

La única manera de que pudiera obtener el stringify a trabajar ahora está haciendo caso omiso de ciertos objetos de esta manera:

var selstring = JSON.stringify(sel,function(k,v){ 
    if(k=="anchorNode" || 
     k=="baseNode" || 
     k=="extentNode" || 
     k=="focusNode") return undefined; 

    return v; 
}); 

Pero esto me deja con un objeto DOMSelection lugar vacío, lo cual no es suficiente para lo que necesito

¿Hay alguna otra forma en que pueda guardar este objeto? El único requisito es que se ejecute en un safari móvil, cualquier otra cosa va realmente. La solución puede ser javascript o jquery (o cualquier otra js lib si es necesario).

Gracias por cualquier ayuda que pueda proporcionar.

+0

Ver http://stackoverflow.com/questions/4001474/json-standard-way-of-referencing-an-object-by-identity-for-eg-circular-refere –

Respuesta

3

Consulte Crockford's JSON-JS GitHub repo. Tiene un archivo, cycle.js, que supuestamente puede convertir objetos con referencias circulares a JSON y volver utilizando JSONPath. Vea el último párrafo en el repositorio léame y los comentarios del archivo.

+0

Lo marcaré como respondido ya que responde más directamente a mi pregunta inicial. Desafortunadamente no puedo probar si funciona con el almacenamiento de un objeto DOMSelection, ya que resulta que no lo necesito para este proyecto, pero este fue un ejemplo específico de todos modos. – nebs

+0

¿Cómo puedo poner cycle.js en mi código? Tengo un problema similar también. – corazza

+0

Al incluir el archivo en una etiqueta de script. Tenga en cuenta, sin embargo, que esto está lejos de ser la mejor solución. En su lugar, debe asegurarse de que sus objetos no tengan referencias circulares, y nunca codifique los nodos DOM a menos que sea absolutamente necesario. –

3

La respuesta aquí radica en comprender qué información realmente necesita almacenar persistentemente y minimizarla solo a lo que se necesita y luego agregar un método o función para obtener solo esa información y luego guardarla. No conozco su aplicación, pero para una selección de texto, probablemente solo necesite una indicación persistente de qué objeto era y los puntos de inicio y fin de la selección de texto.

Luego, en el lado de restauración, crearía una función para crear una selección utilizando los datos que almacena. No es tan simple serializar/deserializar, pero funcionará.

+0

Sí, esto es lo que quería dejar como último recurso, el objeto DOMSelection parecía bastante complejo. De hecho, me di cuenta de que no necesito almacenar el DOMSelection después de todo y encontré una solución para mis necesidades. – nebs

Cuestiones relacionadas