LocalStorage是否以任何方式支持自定义(即非原始类型)对象存储和检索?

时间:2014-09-08 02:00:42

标签: javascript jquery json html5 local-storage

所以我想传递一个对象"你好"在JavaScript文件hello.js中另一个JavaScript文件chat.js。

Hello包含Strophe.Connections等成员。

我读到我可以使用LocalStorage,即LocalStorage.SetItem(" Hello",Hello),然后使用LocalStorage.getItem检索对象(" Hello")。

这对我没用,所以我搜索了一下,发现JSON stringify,例如Storing Objects in HTML5 localStorage以及How to send javascript object from one page to another page?的某人建议使用stringify。

所以我也尝试了这个,这里是Hello.js的相关代码:

var Hello = {
connection: null,
start_time: null,
log: function (msg) {
    $('#log').append("<p>" + msg + "</p>");
},

send_ping: function (to) {
    var ping = $iq({
        to: to,
        type: "get",
        id: "ping1"}).c("ping", {xmlns: "urn:xmpp:ping"});

    Hello.log("Sending ping to " + to + ".");
    console.log("Sending ping to " + to + ".");

    Hello.start_time = (new Date()).getTime();
    Hello.connection.send(ping);
},

handle_pong: function (iq) {
    var elapsed = (new Date()).getTime() - Hello.start_time;
    Hello.log("Received pong from server in " + elapsed + "ms.");
    console.log('Received pong from server in " + elapsed + "ms.');     
    localStorage.setItem("hello", JSON.stringify(Hello));
    return false;
    }
};

这是chat.js

var Hello = {
conn: null
};

$(document).ready(function(e) { 
    Hello = JSON.parse(localStorage.getItem("hello"));
    $('#input3').bind('click', 
    Hello.connection.send("someStanza"))});

在线Hello = JSON.parse(localStorage.getItem(&#34; hello&#34;));我尝试恢复该对象。

2行我称之为Hello.connection.send。但是,很明显我无法正确传递和恢复Hello对象。例如,在谷歌Chrome JavaScript调试器中,我在该行声明"Uncaught TypeError: undefined is not a function"时收到错误,我认为这基本上意味着Chrome JS引擎无法在Hello对象中找到任何connection.send成员。 / p>

这留下了两个选择。我正在尝试做的事情(传递一个非原始数据类型的对象)是不可能的。或者,我可以按照我的方式进行操作,而且还有一些我没有看到的其他错误/问题。

如果有可能,我做错了什么?

如果不能以这种方式传递非原始数据类型,我还能怎么做呢?

希望我让自己清楚明白,

谢谢,br,

克里斯

1 个答案:

答案 0 :(得分:1)

一种解决方法是toString该函数,然后将其存储在localStorage中。然后,当您从localStorage检索对象时,您eval该函数。这是一个快速演示,演示了(它非常愚蠢,可以根据您的需求进行优化/增强......):

http://jsfiddle.net/nmef7utv/

function pack(obj){
    var packedObj = {};
    for (key in obj) {

        // If obj property is a function, toString() it.
        if (obj[key] && obj[key].constructor === Function) {
            packedObj[key] = obj[key].toString();
        } else {
            packedObj[key] = obj[key];
        }
    }

    return JSON.stringify(packedObj);
}

function unpack(obj) {
    // Temporary variable to hold eval'd func, if needed
    var temp;

    // Parse obj to loop
    obj = JSON.parse(obj);

    for (key in obj) {
        if (typeof obj[key] === "string") {
            eval('temp =' + obj[key]);

            // Assign eval'd function
            obj[key] = temp;
        } else {
            obj[key] = obj[key];
        }
    }
    return obj;
}

在小提琴中,我有:

// Packed Item
localStorage.setItem('test', pack(Hello));

// Unpack
testObj = unpack(localStorage.getItem('test'));
testObj.handle_pong();

希望这有帮助!