2011-05-31 7 views
102

SessionStorage ve LocalStorage, web tarayıcısında anahtar/değer çiftlerini kaydetmeyi sağlar. Değer bir dize olmalı ve js nesnelerini kaydetmek önemsiz değildir.Oturumdaki JavaScript nesnelerini kaydetmeStorage

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

Günümüzde nesneleri kurtarmak için onları deserializing sonra JSON nesneleri seri ve bu sınırlama önleyebilirsiniz. Ancak Depolama API'si her zaman setItem ve getItem yöntemlerinden geçer.

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

Bu sınırlamayı engelleyebilir miyim?

Sadece böyle bir şey yürütmek istiyorum: Ben tüm özellikleri tanımlamak zorunda çünkü Aramaları ama onun sıkıcı bir iş önünü defineGetter ve defineSetter yöntemlerini denemiş

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

ve benim hedef değildir gelecekteki özelliklerini bilmek.

+1

Kendimi o düşündüm. Sanırım bir sürü insan var. Ama getter ve setter metotlarının fazla yük olduğunu düşünmüyorum. BTW; JavaScript ile serileştirebilir ve ayrıştırabilirsiniz ve MS nihayet herkesle aynı standart nesneleri desteklemektedir. JSON ve jQuery gibi paketlere ihtiyaç duyulan günler hızla bitiyor. –

+1

Sanırım sınırlamayı görmüyorum. Sadece önemsiz nesneleriniz varsa JSON.stringify ve JSON.parse'i kullanmanız aşırı bir hız gibi görünebilir, ancak iyi boyutlu veri nesnelerine sahipseniz, bu iki yöntem sizin için çok fazla iş çıkarmaktadır. – Robusto

+5

"Bu sınırlamayı engelleyebilir miyim?" bir soru gibi görünüyor – sonicblis

cevap

16

Web Depolama API'sı tarafından sağlanan erişim sağlayıcılarını kullanabilir veya bir sarıcı/bağdaştırıcı yazabilirsiniz. DefineGetter/defineSetter ile belirtilen sorundan bir sarıcı/adaptör yazmak gibi sesler sizin için çok fazla iştir.

Gerçekten ne söyleyeceğimi bilmiyorum. Belki de "gülünç bir sınırlama" ile ilgili fikrinizi yeniden değerlendirebilirsiniz. Web Depolama API'sı olması gereken tek şey, anahtar/değer deposu.

+4

Üzgünüm, 'gülünç' ile uygunsuz bir kelime kullansaydım. 'Çok ilginç olabilir' ile değiştirin. WebStorage'ın yeni web'deki en heyecan verici geliştirmelerden biri olduğunu düşünüyorum. Ama sadece değer anahtar haritasındaki dizeleri sakladığımı bir sınırlama olduğunu düşünüyorum. Kurabiyenin devamı gibi görünüyor. Depolamanın sadece Javascript dili için bir özellik değil, serileştirilmiş nesnelerin de ilginç bir gelişme olabileceğini biliyorum. Ne düşünüyorsun? –

+1

JSON yeterli değilse, kendi nesne serileştirme yöntemlerinizi her zaman yazabilirsiniz. –

+1

SO kurallarına aykırı olan en aptalca cevap. Downvoted. – sidney

86

Nesnenizi 'dizileştiremezsiniz' ... sonra nesnenizin dizge gösterimini saklamak için sessionStorage.setItem() kullanın ... daha sonra ihtiyacınız olduğunda sessionStorage.getItem() ve sonra geri almak için $.parseJSON() kullanın?

örnek çalışma http://jsfiddle.net/pKXMa/

+0

Bu benim için çalışıyor. Ben $ .parseJSON() –

+0

çağırdıktan sonra çalışan bir Json nesnesi alıyorum Nesne {propertyOneWithoutQuotes: "", ... propertyNWithoutQuotes biçiminde Web Api kimlik doğrulaması döndürme nesneleri gibi bazı sistemler: ""} "geçmesi gereken" ". Birden fazla kaynak varsa, verileri standartlaştırmak için stringify kullanmak daha iyi olabilir. – Jelgab

+0

Bu çok iyi bir cevaptır. Nesneyi serileştirmek ve sessionStorage'da depolamak için JSON.stringify() yöntemini kullanmak iyidir. Ardından, nesneyi almak için dizgiyi serileştirmek için $ .parseJSON() kullanın. –

5

Kullanım örneği:

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) 

API

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

Javascript'teki en iyi uygulamalardan birinin, sahip olmadığınız nesneleri prototiplememesi olduğunu düşündüm. Storage.prototype.setObj kullanmak kötü bir fikir gibi görünüyor. – britztopher

+0

bana güven. Obje nesnesinin kendisi için sadece –

+3

'un zorunlu olarak eklenmesi iyi bir fikirdir. Bu prototip kodunu eklemediğinizden emin olun - ve sadece tarayıcınızı destekleyip desteklemediğini kontrol etmeden önce saklayın. ! == "undefined") {/ * tarayıcı bunu destekliyor * /} ' – JoeBrockhaus

49

çözüm sessionStorage üzerinde setItem çağırmadan önce nesneyi stringify etmektir.

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

Bu nesneler dahil tüm değer türleri ile çalışan bir dinamik bir çözümdür: Sonra

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

Güzel, ancak işlevlerle çalışmıyor. – RSG

0

Ayrıca bunu gerçekleştirir store library kullanabilirsiniz crossbrowser yeteneği ile.

örnek:

// 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) 
})