2011-09-14 10 views
5

Voglio salvare localmente un oggetto che ha riferimenti circolari. Quali sono le mie opzioni?Come salvare un oggetto con riferimenti circolari?

Il mio primo pensiero è stato l'utilizzo dell'archiviazione locale HTML5 ma non è possibile eseguire la stringa di questo oggetto a causa dei riferimenti circolari.

In particolare sto tentando di salvare l'oggetto DOMSelection della selezione corrente.

Esempio:

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

L'unico modo ho potuto ottenere la stringa i al lavoro ora è ignorando alcuni oggetti in questo modo:

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

    return v; 
}); 

Ma questo mi lascia con un oggetto DOMSelection piuttosto vuoto che non è abbastanza per quello di cui ho bisogno.

C'è qualche altro modo per salvare questo oggetto? L'unico requisito è che funzioni nel safari mobile, qualsiasi altra cosa vada davvero. La soluzione può essere in javascript o jquery (o qualsiasi altra js lib se necessario).

Grazie per l'aiuto che puoi fornire.

+0

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

risposta

3

Check out Crockford's JSON-JS GitHub repo. Ha un file, cycle.js, che può presumibilmente convertire oggetti con riferimenti circolari a JSON e viceversa utilizzando JSONPath. Vedere l'ultimo paragrafo del repository mi legge e i commenti del file.

+0

Contrassegnerò questo come risposta in quanto risponde più direttamente alla mia domanda iniziale. Sfortunatamente non riesco a testare se funziona con la memorizzazione di un oggetto DOMSelection in quanto risulta che non ne ho bisogno per questo progetto, ma questo era comunque un esempio specifico. – nebs

+0

Come posso inserire cycle.js nel mio codice? Anch'io ho un problema simile. – corazza

+0

Includendo il file in un tag script. Si noti tuttavia che questo è lontano dalla soluzione migliore. Dovresti invece assicurarti che i tuoi oggetti non abbiano riferimenti circolari, e mai JSON codifichi i nodi DOM a meno che non sia assolutamente necessario. –

3

La risposta qui sta nella comprensione di quali dati è realmente necessario archiviare in modo persistente e riducendo al minimo ciò che è necessario e quindi aggiungendo un metodo o una funzione per ottenere solo tali informazioni e quindi salvarle. Non conosco la tua applicazione ma per una selezione di testo, probabilmente ti servirà solo un'indicazione persistente di quale oggetto era e dei punti di inizio e fine della selezione del testo.

Quindi, dal lato del ripristino, si costruisce una funzione per creare una selezione utilizzando i dati memorizzati. Non è così semplice serializzare/deserializzare, ma funzionerà.

+0

Sì, questo è quello che volevo lasciare come ultima risorsa come l'oggetto DOMSelection sembrava abbastanza complesso. In effetti ho capito che non ho bisogno di memorizzare DOMSelection e ho trovato una soluzione per le mie esigenze. – nebs