43

jQueryはありません。

オブジェクトまたは配列をCookieに保存したい。

オブジェクトは、ページの更新後に使用できる必要があります。

純粋なJavaScriptでそれを行うにはどうすればよいですか?多くの投稿を読みましたが、適切にシリアル化する方法がわかりません。


編集:コード:

var instances = {};
...
instances[strInstanceId] = { container: oContainer };
...
instances[strInstanceId].plugin = oPlugin;
...
JSON.stringify(instances); 
// throws error 'TypeError: Converting circular structure to JSON'
  1. シリアル化するにはどうすればよいinstancesですか?

  2. 機能を維持しながら、インスタンスの構造を変更してシリアル化できるようにするにはどうすればよいstringifyですか?

4

4 に答える 4

74

それを書いてみてください

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

それを読むには:

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

削除するには:

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

複雑なオブジェクト/インスタンスをシリアル化するには、インスタンスにデータダンプ関数を記述してみませんか。

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

次に、データをダンプして文字列化し、Cookieに書き込みます。次に使用する場合は、次のようにします。

  var mydata = JSON.parse(read_cookie('myinstances'));
  new userConstructor(mydata.name, mydata.street, mydata.city);
于 2012-07-05T12:47:37.240 に答える
6

.toString()意味のあるシリアル化またはを提供する場合は、オブジェクト独自のメソッドを使用してくださいJSON.stringify()。ただし、Cookieは通常長さが制限されており、大量のデータを保持できないことに注意してください。

于 2012-07-05T12:46:33.543 に答える
6

http://www.sitepoint.com/cookieless-javascript-session-variables/からのCookie適応クラス

あなたがする必要があるのはあなたがクッキーに保存する必要がある変数を設定して取得することです。

使用対象:int、string、array、list、Complexオブジェクト

例:

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

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

Session.set('toStore', toStore);

クラス:

// 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 = {}; }
};
})();
于 2015-03-27T14:03:56.320 に答える
4

オブジェクトを正規の文字列表現にシリアル化でき、その文字列表現からオブジェクト形式に逆シリアル化できる場合は、はい、Cookieに入れることができます。

于 2012-07-05T12:41:22.030 に答える