簡體   English   中英

LocalStorage是否以任何方式支持自定義(即非原始類型)對象存儲和檢索?

[英]Does LocalStorage support Custom (i.e. non-primitive type) Object Storage and Retrieval in any way?

因此,我想將JavaScript文件hello.js中的對象“ Hello”傳遞給另一個JavaScript文件chat.js。

Hello包含Strophe.Connections等成員。

我讀到可以使用LocalStorage,即LocalStorage.SetItem(“ Hello”,Hello),然后使用LocalStorage.getItem(“ Hello”)檢索對象。

這對我不起作用,因此我進行了更多搜索,發現JSON字符串化,例如, 在HTML5 localStorage存儲對象以及在如何將javascript對象從一頁發送到另一頁的某人? 建議使用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(“ hello”)); 我嘗試還原該對象。

還有2行,我叫Hello.connection.send。 但是,很明顯,我無法正確傳遞和還原Hello對象。 例如,在Google Chrome JavaScript調試器中,我在那一行收到一條錯誤消息,指出"Uncaught TypeError: undefined is not a function" ,這意味着從"Uncaught TypeError: undefined is not a function" ,Chrome JS引擎無法在其中找到任何connection.send成員。 Hello對象。

剩下兩個選擇。 我嘗試做的任何事情(傳遞不是原始數據類型的對象)都無法實現。 或者,這可能是我執行操作時遇到的方式,只是我沒有看到其他錯誤/問題。

如果可能,我在做什么錯?

如果不可能以這種方式傳遞非原始數據類型,我該怎么辦?

希望我能足夠清楚地理解我,

謝謝,br

克里斯

一種解決方法是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();

希望這對您有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM