2011-05-31 18 views
102

सत्र स्टोरेज और लोकल स्टोरेज वेब ब्राउज़र में कुंजी/मूल्य जोड़े को सहेजने की अनुमति देता है। मान एक स्ट्रिंग होना चाहिए, और जेएस ऑब्जेक्ट्स को छोटा नहीं करना चाहिए।सत्र में जावास्क्रिप्ट ऑब्जेक्ट्स सहेजें स्टोरेज

var user = {'name':'John'}; 
sessionStorage.setItem('user', user); 
var obj = sessionStorage.user; // obj='[object Object]' Not an object 

आजकल, आप JSON वस्तुओं serializing, और फिर उन्हें deserializing वस्तुओं ठीक करने के लिए द्वारा इस सीमा से बच सकते हैं। लेकिन स्टोरेज एपीआई हमेशा setItem और getItem विधियों से गुज़रती है।

sessionStorage.setItem('user', JSON.stringify(user)); 
var obj = JSON.parse(sessionStorage.getItem('user')); // An object :D 

क्या मैं इस सीमा से बच सकता हूं?

मैं बस कुछ इस तरह अमल करना चाहते हैं:

sessionStorage.user.name; // 'John' 
sessionStorage.user.name = 'Mary'; 
sessionStorage.user.name // 'Mary' 

मैं कॉल लेकिन इसकी एक कठिन कार्य रोकना defineGetter और defineSetter तरीकों की कोशिश की है, क्योंकि मैं सभी गुण परिभाषित करने के लिए है और मेरे लक्ष्य नहीं है भविष्य की संपत्तियों को जानने के लिए।

+1

मैं अपने आप को इस बात का सोचा है। मुझे लगता है कि बहुत से लोगों के पास है। लेकिन मुझे नहीं लगता कि गेटटर और सेटर विधियां बहुत अधिक बोझ हैं। BTW; आप जावास्क्रिप्ट के साथ क्रमबद्ध और विश्लेषण कर सकते हैं और एमएस अंत में सभी मानक वस्तुओं का समर्थन कर रहा है। जेएसओएन और jQuery जैसे पैकेजों की आवश्यकता के दिन तेजी से आ रहे हैं। –

+1

मुझे लगता है कि मुझे सीमा दिखाई नहीं दे रही है। यह JSON.stringify और JSON.parse का उपयोग करने के लिए ओवरकिल जैसा प्रतीत हो सकता है यदि आपके पास केवल छोटी वस्तुएं हैं, लेकिन यदि आपके पास अच्छी आकार की डेटा ऑब्जेक्ट्स हैं तो वे दो विधियां आपके लिए बहुत काम कर रही हैं। – Robusto

+5

"क्या मैं इस सीमा से बच सकता हूं?" एक प्रश्न की तरह लगता है – sonicblis

उत्तर

16

या तो आप वेब संग्रहण API द्वारा प्रदान किए गए एक्सेसर्स का उपयोग कर सकते हैं या आप एक रैपर/एडाप्टर लिख सकते हैं। DefineGetter/defineSetter के साथ आपके निर्दिष्ट मुद्दे से एक रैपर/एडाप्टर लिखने जैसा लगता है आपके लिए बहुत अधिक काम है।

मैं ईमानदारी से नहीं जानता कि आपको क्या कहना है। हो सकता है कि आप "हास्यास्पद सीमा" के बारे में अपनी राय का पुनर्मूल्यांकन कर सकें। वेब स्टोरेज एपीआई सिर्फ एक कुंजी/मूल्य स्टोर होना चाहिए।

+4

क्षमा करें अगर मैंने 'हास्यास्पद' के साथ अनुचित शब्द का उपयोग किया है। इसे 'इतना दिलचस्प हो सकता है' के साथ बदलें। मुझे लगता है कि वेबस्टॉरेज नए वेब के सबसे रोमांचक सुधारों में से एक है। लेकिन मूल्य कुंजी-मानचित्र में केवल तारों को सहेजें, मुझे लगता है कि एक सीमा है। यह एक कुकीज़ 'अनुक्रम की तरह लगता है। मुझे पता है कि स्टोरेज न केवल जावास्क्रिप्ट भाषा के लिए एक विनिर्देश है, लेकिन वस्तुओं को क्रमबद्ध करना एक दिलचस्प सुधार हो सकता है। तुम क्या सोचते हो? –

+1

यदि JSON पर्याप्त नहीं है, तो आप हमेशा अपना ऑब्जेक्ट क्रमबद्धीकरण विधियां लिख सकते हैं। –

+1

सबसे बेवकूफ उत्तर जो एसओ नियमों के खिलाफ भी जाता है। Downvoted। – sidney

86

आप अपने ऑब्जेक्ट 'stringify' कर सके ... तो sessionStorage.setItem() का उपयोग अपने वस्तु की वह स्ट्रिंग प्रतिनिधित्व स्टोर करने के लिए ... तो जब आपको उसकी आवश्यकता sessionStorage.getItem() और फिर $.parseJSON() का उपयोग इसे वापस बाहर निकलने के लिए?

कार्य उदाहरण http://jsfiddle.net/pKXMa/

+0

यह मेरे लिए काम करता है। मुझे $ .parseJSON() –

+0

जैसे कुछ सिस्टम ऑब्जेक्ट {propertyOneWithoutQuotes: "", ... propertyNWithoutQuotes: ""} के रूप में जाने की आवश्यकता है, जिसे "स्ट्रिपिफ़ाई" "। यदि कई स्रोत हैं तो डेटा को मानकीकृत करने के लिए स्ट्रिंग को उपयोग करना बेहतर हो सकता है। – Jelgab

+0

यह बहुत अच्छा जवाब है। SessionStorage में ऑब्जेक्ट और स्टोर को क्रमबद्ध करने के लिए JSON.stringify() का उपयोग करना अच्छा होता है। फिर, ऑब्जेक्ट प्राप्त करने के लिए स्ट्रिंग को डी-क्रमबद्ध करने के लिए $ .parseJSON() का उपयोग करें। –

5

उपयोग मामला:

sesssionStorage.setObj(1,{date:Date.now(),action:'save firstObject'}); 
sesssionStorage.setObj(2,{date:Date.now(),action:'save 2nd object'}); 
//Query first object 
    sesssionStorage.getObj(1) 
    //Retrieve date created of 2nd object 
    new Date(sesssionStorage.getObj(1).date) 

एपीआई

Storage.prototype.setObj = function(key, obj) { 

     return this.setItem(key, JSON.stringify(obj)) 
    }; 

    Storage.prototype.getObj = function(key) { 
     return JSON.parse(this.getItem(key)) 
    }; 
+2

मैंने सोचा था कि जावास्क्रिप्ट में सबसे अच्छे प्रथाओं में से एक ऐसी चीजों को प्रोटोटाइप नहीं करना था जो आपके पास नहीं हैं। Storage.prototype.setObj का उपयोग करना एक बुरा विचार की तरह लगता है। – britztopher

+0

मेरा विश्वास करो। ऑब्जेक्ट ऑब्जेक्ट को छोड़कर यह एक अच्छा विचार है –

+3

केवल अनिवार्य जोड़ना .. सुनिश्चित करें कि आप इस प्रोटोटाइप कोड को नहीं जोड़ते हैं - और इसे विशेष रूप से भरोसा करते हैं - बिना ब्राउजर का समर्थन करने के पहले जांच के बिना: 'if (टाइपऑफ (स्टोरेज) ! == "अपरिभाषित") {/ * ब्राउज़र इसका समर्थन करता है * /} ' – JoeBrockhaus

49

समाधान sessionStorage पर setItem कॉल करने से पहले वस्तु stringify है।

var user = {'name':'John'}; 
sessionStorage.setItem('user', JSON.stringify(user)); 
var obj = JSON.parse(sessionStorage.user); 
1
var user = {'name':'John'}; 
    sessionStorage['user'] = JSON.stringify(user); 
    console.log(sessionStorage['user']); 
3

यह एक गतिशील समाधान जो वस्तुओं सहित सभी मूल्य प्रकार के साथ काम करता है:

class Session extends Map { 
    set(id, value) { 
    if (typeof value === 'object') value = JSON.stringify(value); 
    sessionStorage.setItem(id, value); 
    } 

    get(id) { 
    const value = sessionStorage.getItem(id); 
    try { 
     return JSON.parse(value); 
    } catch (e) { 
     return value; 
    } 
    } 
} 
फिर

:

const session = new Session(); 

session.set('name', {first: 'Ahmed', last : 'Toumi'}); 
session.get('name'); 
+0

अच्छा है, लेकिन कार्यों के साथ काम नहीं करता है। – RSG

0

तुम भी store library जो इसके लिए करता है इस्तेमाल कर सकते हैं आप crossbrowser क्षमता के साथ।

उदाहरण:

// Store current user 
store.set('user', { name:'Marcus' }) 

// Get current user 
store.get('user') 

// Remove current user 
store.remove('user') 

// Clear all keys 
store.clearAll() 

// Loop over all stored values 
store.each(function(value, key) { 
    console.log(key, '==', value) 
}) 
संबंधित मुद्दे