Javascript nesnelerini sessionStorage içine kaydet


152

SessionStorage ve LocalStorage, anahtar / değer çiftlerini bir web tarayıcısına kaydetmenize olanak tanır. Değer bir dize olmalıdır ve js nesnelerini kaydetmek önemsiz değildir.

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

Günümüzde, nesneleri JSON'a serileştirerek ve sonra nesneleri kurtarmak için serisini kaldırarak bu kısıtlamayı önleyebilirsiniz. Ancak Depolama API'sı her zaman setItemve getItemyöntemlerinden geçer.

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

Bu sınırlamadan kaçınabilir miyim?

Sadece böyle bir şey yürütmek istiyorum:

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

Tüm özellikleri tanımlamak zorundayım ve hedefim gelecekteki özellikleri bilmek değil, çünkü çağrıları durdurmak için defineGetterve defineSetteryöntemleri denedim ama bu sıkıcı bir iş.


1
Bunu ben de düşündüm. Sanırım birçok insan var. Ancak, alıcı ve belirleyici yöntemlerin çok fazla yük olduğunu düşünmüyorum. BTW; JavaScript ile serileştirebilir ve ayrıştırabilirsiniz ve MS nihayet herkesle aynı standart nesneleri destekliyor. JSON ve jQuery gibi paketlere ihtiyaç duyulan günler hızla sona eriyor.
Roger F. Gay

1
Sanırım sınırlamayı görmüyorum. Sadece önemsiz nesneleriniz varsa JSON.stringify ve JSON.parse kullanmak aşırı olabilir gibi görünüyor, ancak iyi boyutlu veri nesneleriniz bile varsa, bu iki yöntem sizin için çok iş yapıyor.
Robusto

5
"Bu sınırlamadan kaçınabilir miyim?" bir soru gibi görünüyor
sonicblis

1
Sınırlı olsun ya da olmasın, bu soru bir sorunu çözmeme yardımcı oldu, bu yüzden teşekkürler.
Matt West

Yanıtlar:


19

Web Depolama API'sı tarafından sağlanan erişimcileri kullanabilir veya bir sarıcı / bağdaştırıcı yazabilirsiniz. DefineGetter / defineSetter ile belirttiğiniz sorundan bir sargı / adaptör yazmak sizin için çok fazla iş gibi geliyor.

Size ne söyleyeceğimi bilmiyorum. Belki de "saçma bir sınırlama" hakkındaki fikrinizi yeniden değerlendirebilirsiniz. Web Depolama API'sı bir anahtar / değer deposu olması gereken şeydir.


8
'Saçma' ile uygunsuz bir kelime kullandıysam özür dilerim. 'Çok ilginç olabilir' ile değiştirin. WebStorage'ın yeni web'deki en heyecan verici gelişmelerden biri olduğunu düşünüyorum. Ama değer anahtar-harita sadece dizeleri kaydetmek bir sınırlama olduğunu düşünüyorum. Bir çerezin devamı gibi görünüyor. Depolama yalnızca Javascript dili için bir şartname olduğunu biliyorum, ancak nesneleri serileştirmek ilginç bir gelişme olabilir. Ne düşünüyorsun?
Ferran Basora

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

110

Nesnenizi ' sessionStorage.setItem()dizgi haline getiremezsiniz' ... sonra nesnenizin dize temsilini saklamak için kullanın ... sonra ihtiyacınız olduğunda sessionStorage.getItem()ve sonra $.parseJSON()geri almak için kullanın ?

Çalışma örneği http://jsfiddle.net/pKXMa/


Bu benim için çalışıyor. Ben $ .parseJSON () çağrıldıktan sonra bir çalışma Json nesnesi olsun
Olafur Tryggvason

Web Api kimlik doğrulaması gibi bazı sistemler Object {propertyOneWithoutQuotes: "<value1>", ... propertyNWithoutQuotes: "<valueN>"} biçimindeki nesneleri "stringify" üzerinden geçmeleri için döndürür. Birden fazla kaynak varsa, verileri standartlaştırmak için stringify kullanmak daha iyi olabilir.
Jelgab

Bu çok iyi bir cevap. SessionStorage nesnesini serileştirmek ve depolamak için JSON.stringify () kullanmak iyidir. Ardından, nesneyi almak için dizenin serisini serileştirmek için $ .parseJSON () öğesini kullanır.
Thomas.Benz

102

Çözüm sessionStorage üzerinde setItem çağırmadan önce nesneyi dizgi yapmaktır.

var user = {'name':'John'};
sessionStorage.setItem('user', JSON.stringify(user));
var obj = JSON.parse(sessionStorage.user);

Çözümü bağlamadığınız için teşekkür ederiz
Luc-Olsthoorn

12

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

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;
    }
  }
}

Sonra :

const session = new Session();

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

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

4
Javascript en iyi uygulamalarından biri sahip olmadığınız nesneleri prototip değil düşündüm. Storage.prototype.setObj kullanmak kötü bir fikir gibi görünüyor.
britztopher

3
sadece zorunlu ekleyerek .. Bu prototip kodunu eklemediğinizden emin olun - ve sadece tarayıcının destekleyip desteklemediğini kontrol etmeden sadece - güveniyor Depolama:if (typeof (Storage) !== "undefined"){ /* browser supports it */ }
JoeBrockhaus

4

Oturum depolama keyfi bir nesneyi destekleyemiyor çünkü sayfa yeniden yüklendikten sonra yeniden oluşturulamayan işlev değişmezlerini (okuma kapanışları) içerebilir.


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

2

Crossbrowser yeteneğiyle sizin için gerçekleştiren mağaza kitaplığını da kullanabilirsiniz .

misal :

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

0

Nesneyi oturum depolama alanından kaydetmek ve almak için 2 sarıcı yöntem oluşturabilirsiniz.

function saveSession(obj) {
  sessionStorage.setItem("myObj", JSON.stringify(obj));
  return true;
}

function getSession() {
  var obj = {};
  if (typeof sessionStorage.myObj !== "undefined") {
    obj = JSON.parse(sessionStorage.myObj);
  }
  return obj;
}

Şöyle kullanın: - Nesne alın, bazı verileri değiştirin ve geri kaydedin.

var obj = getSession();

obj.newProperty = "Prod"

saveSession(obj);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.