2012-07-05 41 views
30

Không có jQuery.Javascript thuần túy - đối tượng lưu trữ trong cookie

Tôi muốn lưu trữ một đối tượng hoặc mảng trong cookie.

Đối tượng có thể sử dụng được sau khi làm mới trang.

Làm cách nào để làm điều đó với JavaScript thuần túy? Tôi đọc nhiều bài viết, nhưng không biết làm thế nào để sắp xếp một cách thích hợp.


EDIT: Code:

var instances = {}; 
... 
instances[strInstanceId] = { container: oContainer }; 
... 
instances[strInstanceId].plugin = oPlugin; 
... 
JSON.stringify(instances); 
// throws error 'TypeError: Converting circular structure to JSON' 
  1. Làm thế nào để serialize instances?

  2. Làm cách nào để duy trì chức năng, nhưng thay đổi cấu trúc của cá thể để có thể tuần tự hóa với stringify?

+4

[ 'JSON.stringify()'] (https: //developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/stringify). – Matt

+0

chuyển đổi đối tượng thành json và lưu trữ nó trong cookie. –

+0

'stringify' không hoạt động. Tôi nhận được 'TypeError: Chuyển đổi cấu trúc hình tròn thành JSON' mã của tôi là:' var instances = {}; các cá thể [strInstanceId] .plugin = oPlugin; ... ' – Patrick

Trả lời

45

Hãy thử điều đó một để viết

function bake_cookie(name, value) { 
    var cookie = [name, '=', JSON.stringify(value), '; domain=.', window.location.host.toString(), '; path=/;'].join(''); 
    document.cookie = cookie; 
} 

Để đọc nó mất:

function read_cookie(name) { 
var result = document.cookie.match(new RegExp(name + '=([^;]+)')); 
result && (result = JSON.parse(result[1])); 
return result; 
} 

Để xóa nó đi:

function delete_cookie(name) { 
    document.cookie = [name, '=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=.', window.location.host.toString()].join(''); 
} 

Để serialize đối tượng phức tạp/trường hợp, tại sao không viết chức năng kết xuất dữ liệu trong ví dụ của bạn:

function userConstructor(name, street, city) { 
    // ... your code 
    this.dumpData = function() { 
    return { 
     'userConstructorUser': { 
      name: this.name, 
      street: this.street, 
      city: this.city 
     } 
     } 
    } 

Sau đó, bạn đổ dữ liệu, stringify nó, hãy viết nó vào cookie, và thời gian tiếp theo bạn muốn sử dụng nó chỉ cần đi:

var mydata = JSON.parse(read_cookie('myinstances')); 
    new userConstructor(mydata.name, mydata.street, mydata.city); 
+0

Cảm ơn Ill đi với điều đó nếu tôi nhận được' stringify' để làm việc. Bạn có thể kiểm tra vấn đề mã của tôi không? – Patrick

+0

JSON không thể tuần tự hóa toàn bộ các trường hợp, nhưng bạn có thể tuần tự hóa bất kỳ dữ liệu có liên quan nào mà bạn có thể muốn từ các trường hợp này và khởi tạo lại chúng với dữ liệu đã lưu này. Ví dụ, bạn có một cá thể trong đó name = 'John Doe', bạn có thể viết một hàm trên cá thể đó để trả về một đối tượng như {myinstance: {name: 'John Doe'}}, và sau đó gọi hàm tạo lại với dữ liệu này . Ngoài ra, bạn có thể thử GSerializer: http://www.onegeek.com.au/projects/javascript-serialization (đăng bài tốt trên đó) Nhưng tôi khuyên bạn nên chống lại điều đó vì Cookies bị giới hạn về kích thước ... –

+0

. .. và một cookie quá lớn có thể dẫn đến lỗi trang web vĩnh viễn cho người dùng mà bạn không nhận thấy nó vì tiêu đề Upstream quá lớn. Tôi đã chỉnh sửa bài đăng của mình để bạn có thể xem ý tôi là gì bằng bình luận ở trên. –

2

Nếu bạn có thể tuần tự hóa đối tượng của mình vào biểu diễn chuỗi chuẩn, và bạn có thể đặt nó vào biểu tượng chuỗi đã cho biết.

3

Sử dụng phương pháp .toString() của riêng đối tượng nếu phương thức đó có khả năng tuần tự hóa có ý nghĩa hoặc JSON.stringify(). Tuy nhiên, lưu ý rằng cookie thường bị giới hạn về độ dài và sẽ không thể chứa lượng dữ liệu lớn.

+0

Ghi chú đẹp về chiều dài cookie –

2

Một lớp thích ứng cookie từ: http://www.sitepoint.com/cookieless-javascript-session-variables/

Tất cả những gì bạn cần làm là đặt và nhận các biến bạn cần lưu trữ trong cookie.

Làm việc với: int, chuỗi, mảng, danh sách, đối tượng Complex

dụ:

var toStore = Session.get('toStore'); 

if (toStore == undefined) 
    toStore = ['var','var','var','var']; 
else 
    console.log('Restored from cookies'+toStore); 

Session.set('toStore', toStore); 

Class:

// Cross reload saving 
if (JSON && JSON.stringify && JSON.parse) var Session = Session || (function() { 
// session store 

var store = load(); 

function load() 
{ 
    var name = "store"; 
    var result = document.cookie.match(new RegExp(name + '=([^;]+)')); 

    if (result) 
     return JSON.parse(result[1]); 

    return {}; 
} 

function Save() { 
    var date = new Date(); 
    date.setHours(23,59,59,999); 
    var expires = "expires=" + date.toGMTString(); 
    document.cookie = "store="+JSON.stringify(store)+"; "+expires; 
}; 

// page unload event 
if (window.addEventListener) window.addEventListener("unload", Save, false); 
else if (window.attachEvent) window.attachEvent("onunload", Save); 
else window.onunload = Save; 

// public methods 
return { 

    // set a session variable 
    set: function(name, value) { 
     store[name] = value; 
    }, 

    // get a session value 
    get: function(name) { 
     return (store[name] ? store[name] : undefined); 
    }, 

    // clear session 
    clear: function() { store = {}; } 
}; 
})(); 
Các vấn đề liên quan