Lưu các đối tượng Javascript trong sessionStorage


152

SessionStorage và LocalStorage cho phép lưu các cặp khóa / giá trị trong trình duyệt web. Giá trị phải là một chuỗi và lưu các đối tượng js không phải là nhỏ.

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

Ngày nay, bạn có thể tránh giới hạn này bằng cách tuần tự hóa các đối tượng thành JSON và sau đó giải tuần tự hóa chúng để khôi phục các đối tượng. Nhưng API lưu trữ luôn vượt qua setItemgetItemcác phương thức.

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

Tôi có thể tránh giới hạn này không?

Tôi chỉ muốn thực hiện một cái gì đó như thế này:

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

Tôi đã thử defineGetterdefineSettercác phương thức để chặn các cuộc gọi nhưng đó là một công việc tẻ nhạt, bởi vì tôi phải xác định tất cả các thuộc tính và mục tiêu của tôi là không biết các thuộc tính trong tương lai.


1
Tôi đã nghĩ về điều đó bản thân mình. Tôi cho rằng rất nhiều người có. Nhưng tôi không nghĩ các phương thức getter và setter là quá nhiều gánh nặng. BTW; bạn có thể tuần tự hóa và phân tích cú pháp với JavaScript và MS cuối cùng cũng hỗ trợ các đối tượng tiêu chuẩn giống như mọi người khác. Ngày cần các gói như JSON và jQuery sắp kết thúc.
Roger F. Gay

1
Tôi đoán tôi không thấy giới hạn. Có vẻ như quá mức cần thiết để sử dụng JSON.opesify và JSON.parse nếu bạn chỉ có các đối tượng tầm thường, nhưng nếu bạn có các đối tượng dữ liệu có kích thước tốt thì hai phương thức đó đang làm rất nhiều việc cho bạn.
Robusto

5
"Tôi có thể tránh giới hạn này không?" có vẻ như một câu hỏi
sonicblis

1
Vâng hạn chế hay không, câu hỏi này đã giúp tôi giải quyết một vấn đề, cảm ơn.
Matt West

Câu trả lời:


19

Bạn có thể sử dụng các bộ truy cập được cung cấp bởi API lưu trữ web hoặc bạn có thể viết một trình bao bọc / bộ điều hợp. Từ vấn đề đã nêu của bạn với notifyGetter / notifySetter có vẻ như việc viết một trình bao bọc / bộ điều hợp là quá nhiều công việc đối với bạn.

Tôi thực sự không biết phải nói gì với bạn. Có lẽ bạn có thể đánh giá lại ý kiến ​​của bạn về "giới hạn lố bịch" là gì. API lưu trữ web đúng như những gì nó được coi là một kho lưu trữ khóa / giá trị.


8
Xin lỗi nếu tôi đã sử dụng một từ không phù hợp với 'nực cười'. Thay thế nó bằng 'có thể rất thú vị'. Tôi nghĩ rằng webStorage là một trong những cải tiến thú vị nhất của web mới. Nhưng tôi chỉ lưu các chuỗi trong bản đồ khóa giá trị mà tôi nghĩ là một hạn chế. Có vẻ như phần tiếp theo của cookie. Tôi biết rằng Storage là một đặc tả không chỉ dành cho ngôn ngữ Javascript, nhưng các đối tượng tuần tự hóa có thể là một cải tiến thú vị. Bạn nghĩ sao?
Ferran Basora

2
Nếu JSON không đủ, bạn luôn có thể viết các phương thức tuần tự hóa đối tượng của riêng bạn.
Ryan Olds

110

Bạn không thể ' sessionStorage.setItem()xâu chuỗi ' đối tượng của mình ... sau đó sử dụng để lưu trữ đại diện chuỗi đó của đối tượng của bạn ... sau đó khi bạn cần nó sessionStorage.getItem()và sau đó sử dụng $.parseJSON()để đưa nó trở lại?

Ví dụ hoạt động http://jsfiddle.net/pKXMa/


Điều này làm việc cho tôi. Tôi nhận được một đối tượng Json đang hoạt động sau khi gọi $ .parseJSON ()
Olafur Tryggvason

Một số hệ thống như xác thực trả lại Web Api dưới dạng Đối tượng {propertyOneWithoutQuotes: "<value1>", ... propertyNWithoutQuotes: "<valueN>"} cần phải trải qua "chuỗi hóa". Nếu có nhiều nguồn, có thể tốt hơn là sử dụng chuỗi hóa để chuẩn hóa dữ liệu.
Jelgab

Đây là câu trả lời rất tốt. Thật tốt khi sử dụng JSON.opesify () để tuần tự hóa đối tượng và lưu trữ trong sessionStorage. Sau đó, nó sử dụng $ .parseJSON () để hủy tuần tự chuỗi để lấy đối tượng.
Thomas.Benz

102

Giải pháp là xâu chuỗi đối tượng trước khi gọi setItem trên sessionStorage.

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

Cảm ơn bạn đã không liên kết giải pháp
Luc-Olsthoorn

12

Đây là một giải pháp động hoạt động với tất cả các loại giá trị bao gồm các đối tượng:

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

Sau đó :

const session = new Session();

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

5

Trường hợp sử dụng:

 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
Tôi nghĩ một trong những thực tiễn tốt nhất trong javascript là không phải các đối tượng nguyên mẫu mà bạn không sở hữu. Sử dụng Storage.prototype.setObj có vẻ như là một ý tưởng tồi.
britztopher

3
chỉ thêm bắt buộc .. chắc chắn rằng bạn không thêm mã mẫu thử nghiệm này - và dựa vào nó độc quyền - mà không cần kiểm tra đầu tiên nếu sự hỗ trợ trình duyệt nó lưu trữ:if (typeof (Storage) !== "undefined"){ /* browser supports it */ }
JoeBrockhaus

4

Lưu trữ phiên không thể hỗ trợ một đối tượng tùy ý vì nó có thể chứa các hàm chữ (đóng đọc) không thể được xây dựng lại sau khi tải lại trang.


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

2

Bạn cũng có thể sử dụng thư viện cửa hàng thực hiện nó cho bạn với khả năng crossbrowser.

thí dụ :

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

Bạn có thể tạo 2 phương thức trình bao bọc để lưu và truy xuất đối tượng từ bộ lưu trữ phiên.

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

Sử dụng nó như thế này: - Nhận đối tượng, sửa đổi một số dữ liệu và lưu lại.

var obj = getSession();

obj.newProperty = "Prod"

saveSession(obj);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.