2011-09-14 17 views
5

मैं स्थानीय रूप से एक वस्तु को सहेजना चाहता हूं जिसमें परिपत्र संदर्भ हैं। मेरे विकल्प क्या हैं?किसी ऑब्जेक्ट को परिपत्र संदर्भों से कैसे सहेजना है?

मेरा पहला विचार एचटीएमएल 5 स्थानीय भंडारण का उपयोग कर रहा था लेकिन परिपत्र संदर्भों के कारण मैं इस वस्तु को स्ट्रिंग नहीं कर सकता।

विशेष रूप से मैं वर्तमान चयन के DOMSelection ऑब्जेक्ट को सहेजने की कोशिश कर रहा हूं।

उदाहरण:

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

एक ही रास्ता मैं stringify अब काम करने के लिए मिल सकता है तो जैसे कुछ वस्तुओं की अनदेखी कर रहा है:

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

    return v; 
}); 

लेकिन यह मुझे एक नहीं बल्कि खाली DOMSelection वस्तु के साथ छोड़ देता है जो मुझे जो चाहिए वह पर्याप्त नहीं है।

क्या कोई अन्य तरीका है जिससे मैं इस वस्तु को बचा सकता हूं? एकमात्र आवश्यकता यह है कि यह मोबाइल सफारी में चलता है, और कुछ भी वास्तव में चला जाता है। समाधान या तो जावास्क्रिप्ट या jquery (या आवश्यकता होने पर किसी भी अन्य जेएस lib) में हो सकता है।

आपकी सहायता के लिए धन्यवाद।

+0

देखें http://stackoverflow.com/questions/4001474/json- मानक-way-of-referencing-an-object-by-identity-for-eg-circular-refere –

उत्तर

3

Crockford's JSON-JS GitHub repo देखें। इसमें एक फ़ाइल है, cycle.js, जो जेएसओएन के परिपत्र संदर्भों के साथ ऑब्जेक्ट्स को परिवर्तित कर सकती है और JSONPath का उपयोग कर वापस कर सकती है। रेपो के पढ़ने और फ़ाइल की टिप्पणियों में अंतिम पैराग्राफ देखें।

+0

मैं इसे उत्तर के रूप में चिह्नित करूंगा क्योंकि यह मेरे प्रारंभिक प्रश्न का सबसे अधिक जवाब देता है। दुर्भाग्य से मैं परीक्षण नहीं कर सकता कि यह एक DOMSelection ऑब्जेक्ट को संग्रहीत करने के साथ काम करता है क्योंकि यह पता चला है कि मुझे इस परियोजना के लिए इसकी आवश्यकता नहीं है, लेकिन यह किसी भी तरह का एक विशिष्ट उदाहरण था। – nebs

+0

मैं अपने कोड में cycle.js कैसे रख सकता हूं? मुझे भी एक ही समस्या है। – corazza

+0

एक स्क्रिप्ट टैग में फ़ाइल को शामिल करके। ध्यान दें, हालांकि, यह सबसे अच्छा समाधान से बहुत दूर है। आपको इसके बजाय यह सुनिश्चित करना चाहिए कि आपके ऑब्जेक्ट्स में कोई गोलाकार संदर्भ नहीं है, और जब तक पूरी तरह से आवश्यकता न हो, JSON कभी भी डोम नोड्स को एन्कोड न करें। –

3

यहां जवाब यह समझने में है कि आपको वास्तव में कौन से डेटा को स्टोर करने की आवश्यकता है और केवल उस चीज़ को कम करने की आवश्यकता है जो केवल आवश्यक है और फिर उस जानकारी को प्राप्त करने के लिए विधि या फ़ंक्शन जोड़ना और फिर उसे सहेजना। मैं आपके आवेदन को नहीं जानता लेकिन टेक्स्ट चयन के लिए, आपको शायद उस ऑब्जेक्ट के लगातार संकेत की आवश्यकता होगी कि यह किस ऑब्जेक्ट था और टेक्स्ट चयन के प्रारंभ और अंत बिंदु।

फिर, पुनर्स्थापित पक्ष पर, आप अपने द्वारा संग्रहीत डेटा का उपयोग करके चयन बनाने के लिए एक फ़ंक्शन तैयार करेंगे। यह एक serialize/deserialize जितना आसान नहीं है, लेकिन यह काम करेगा।

+0

हाँ यही वह है जिसे मैं छोड़ना चाहता था अंतिम उपाय के रूप में DOMSelection ऑब्जेक्ट काफी जटिल लग रहा था। असल में मुझे एहसास हुआ कि मुझे DOMSelection को स्टोर करने की आवश्यकता नहीं है और मुझे अपनी ज़रूरतों के लिए एक समाधान मिला है। – nebs

संबंधित मुद्दे