【问题标题】:Can I store a jQuery DOM clone in local storage for later use?我可以将 jQuery DOM 克隆存储在本地存储中以供以后使用吗?
【发布时间】:2025-09-30 18:40:02
【问题描述】:

我想存储一个代表 DOM 元素的 jQuery 对象,以供以后使用。我已经有了这些方法来执行对象和文本的存储和检索,与 localStorage 往来:

 var Data = {
  set: function(key, value, session) {
    if (!key) {return;}

    if (typeof value === "object") {
      value = JSON.stringify(value);
    }
    if(session){
        sessionStorage.setItem(key, value);
    }else{
        localStorage.setItem(key, value);
    }
  },
  get: function(key, session) {
    if(session){
        var value = sessionStorage.getItem(key);
    }else{
        var value = localStorage.getItem(key);
    }

    if (!value) {return;}

    // assume it is an object that has been stringified
    if (value[0] === "{" || value[0] === "[") {
      value = JSON.parse(value);
    }

    return value;
  }
}

谢天谢地,它基于 Stack Overflow 源代码,适用于字符串以外的简单对象。

我正在考虑这样做:

$clone = $('#myform').clone(true);
Data.set('clonedata', $clone);

然后,很久以后,在别处:

$retrieved = Data.get('clonedata');

问题是,在这种情况下它似乎不起作用。 jQuery对象不能以这种方式序列化和反序列化有根本原因吗?

这有什么用?一种情况是在用户填写长表单时在 localStorage 中持久化(自动保存)表单数据。然后可以在网络中断或无意的浏览器导航或关闭之后提供信息。

【问题讨论】:

  • 你应该把它转换成原始 html 然后存储它。
  • 嗯。但是,我会丢失所有以前绑定的事件,对吗?
  • 你不能真正做到这一点。您最好说明为什么需要这种行为
  • @A.Wolff:实现表单自动保存还不够好?有没有更好的方法?
  • 然后存储序列化的表单并在加载时渲染它。我会发布答案

标签: javascript jquery serialization deserialization clone


【解决方案1】:

您可以使用garlic.js 进行本地持久化。希望这个链接能帮到你。使用简单,只需包含js文件并添加data-persist="garlic"作为表单属性。即使你的机器断电,它也可以保存你的表单数据。你可以从这里下载js文件。

http://garlicjs.org/

【讨论】:

  • 我正在尝试实施定制的解决方案,但我想这会更好地使用已经完成的解决方案
  • @Ataur:感谢您推荐garlic.js。但是有一个问题:它可以正确地重新加载,比如说,一个在 DOM 加载后动态添加的字段吗?再说一次,它可以和select2select 一起玩吗?
  • @A.Wolff,我多么希望你没有这么快放弃任务!我充满了期待。
  • @IfediOkonkwo 我想一旦添加了一些新元素,请回想一下$('#myform').garlic();。也许你需要在重新初始化之前销毁插件,不确定它是如何在内部处理的。 could it possibly play well with a select2 应该但可以肯定你需要一些测试
  • 几周前,我看到了 sisyphus.js。它拥有与此类似的功能。我做了相当多的测试。还不错,但是关于添加的元素,它只是待办事项列表上的一个项目。 (看,问题是:当用户重新打开关闭的浏览器时,DOM 结构将不一样,因此检索到的数据将找不到要绑定的匹配输入。这就是激发我想要存储 DOM 结构的原因)