Javascript 转储整个DOM树(包括事件侦听器和变异观察器)

Javascript 转储整个DOM树(包括事件侦听器和变异观察器),javascript,dom,dump,Javascript,Dom,Dump,我在运行时使用javascript构建html页面。在某个时刻,我想创建此页面的备份,以便以后能够还原它。页面是由DOM描述的,因此从逻辑上讲,保存DOM本身是可行的。问题是——似乎没有合法的方法可以做到这一点 我只找到了只能用于序列化html的XMLSerializer接口(因此,这不是正确的工具)。但我需要保存变异观察者和事件监听器,这样的“恢复”页面将作为它的祖先 我还考虑过在DOM上记录文件javascript操作。但是在运行时构建自己的页面是巨大而复杂的,因此这种方法将花费大量时间 有

我在运行时使用javascript构建html页面。在某个时刻,我想创建此页面的备份,以便以后能够还原它。页面是由DOM描述的,因此从逻辑上讲,保存DOM本身是可行的。问题是——似乎没有合法的方法可以做到这一点

我只找到了只能用于序列化html的XMLSerializer接口(因此,这不是正确的工具)。但我需要保存变异观察者和事件监听器,这样的“恢复”页面将作为它的祖先

我还考虑过在DOM上记录文件javascript操作。但是在运行时构建自己的页面是巨大而复杂的,因此这种方法将花费大量时间


有什么想法吗?

所有信息(包括侦听器)都存储在窗口对象中。您可以检查它:console.log(窗口)


要转储窗口对象,只需复制它并将其发送到api以存储它。

没有神奇的方法可以做到这一点-跟踪您安装的观察者/事件侦听器(制作数组日志)并将其添加到转储中。通常,这样做的方法是您不专门保存页面的HTML和事件侦听器,但是,当您使用JS构建页面时,您将构建一个状态对象,描述对页面所做的操作。然后,编写可以读取该状态对象的代码,以同样的方式重建页面。如果你真的很好,你可以让重建代码与第一次构建页面的代码相同。你可以把问题想象成用来维护撤销堆栈的代码。撤消堆栈通常保存修改页面的增量命令/数据,而不是在每次更改后保存文档的整个状态,您只需重新应用(或在撤消的情况下,通过反转)这些命令即可返回到任何特定状态。对DOM的更改也可以这样做。您保存的命令级别越高,通常需要存储的数据就越少。否。侦听器未存储在
窗口
对象上。另外,您能否描述一种可靠的方法来序列化
窗口
(复制并发送)
JSON.stringify
不起作用。我在stackoverflow上找到了另一个。有一个片段可以字符串化更复杂的对象。但你有权使用事件侦听器。否则,在创建和恢复备份时,您必须将它们放入队列中,您可以重新初始化存储的事件侦听器。是的,您可以使用字符串化,但当您需要DOM(应该序列化为XML,而不是JSON)时,实际上没有理由对
窗口
进行字符串化