仅使用javascript创建文档对象副本的最简单方法是什么

仅使用javascript创建文档对象副本的最简单方法是什么,javascript,object,clone,document,Javascript,Object,Clone,Document,文档对象的副本的行为应与。。。复制后的文档对象,但与实际dom引用完全分离。我的意思是——如果我们将文档的这个副本保存为var documentCopydocumentCopy,那么它应该能够像document一样在自身上运行。getElementsByClass('xx'),但是对它的修改不会影响原始文档对象 可能吗 我对除jQuery之外的所有库开放。您可以使用它获取DOM的完整副本。但是,有些东西(如自定义属性)不会被复制。这可能不是什么大问题,因为您无论如何都应该使用data-属性和da

文档对象的副本的行为应与。。。复制后的文档对象,但与实际dom引用完全分离。我的意思是——如果我们将文档的这个副本保存为
var documentCopy
documentCopy,那么它应该能够像
document
一样在自身上运行
。getElementsByClass('xx')
,但是对它的修改不会影响原始
文档
对象

可能吗

我对除jQuery之外的所有库开放。

您可以使用它获取DOM的完整副本。但是,有些东西(如自定义属性)不会被复制。这可能不是什么大问题,因为您无论如何都应该使用
data-
属性和
dataset
属性,这些属性将随克隆一起复制

var pre=document.querySelector(“pre”);
//自定义属性将不会被克隆
pre.customProp=“foobar”;
//数据-属性/属性将被克隆
pre.dataset.foo=“bar”;
//克隆文档
var documentCopy=document.cloneNode(true);
//显示DOM选择对副本有效
console.log(“找到克隆”,documentCopy.getElementsByClassName(“foo”).length,“foo”节点);
//未克隆自定义属性
console.log(“自定义属性:”,documentCopy.querySelector(“pre”).customProp);
//但数据集属性确实如此
console.log(“dataset prop:”,documentCopy.querySelector(“pre”).dataset.foo)
pre{
字号:1.4em;
}

文档的
关键字将为您提供文档,而不是副本。因此,在您的示例中,对
documentCopy
的更改将影响原始文档

在后台,浏览器将文档层次结构作为链接的“节点”对象进行维护,因此没有一种很好的方法可以“复制”所有对象及其当前状态

为了获取节点对象的新“副本”,您需要将其HTML内容作为字符串获取,然后使用该HTML标记将新节点插入DOM:

//获取原始正文HTML
var bodyHTML=document.body.innerHTML;
//创建一个新的div并设置其内容
var copiedNode=document.createElement(“div”);
copiedNode.innerHTML=bodyHTML;
//插入新节点
document.body.appendChild(copiedNode);
//修改复制的节点
copiedNode.firstElementChild.setAttribute(“样式”,“颜色:蓝色”)

第一段

真正的问题是,究竟为什么需要这样的东西?@adeneo generate pdf doc将其保存在函数中,并在外部范围中引用它。但是,如果不这样做,实际的dom仍然会被引用。如果您提供一些关于您的预期目的的详细信息,那么可能有比尝试用javascript复制文档对象更好的方法。@ezeewi以及克隆
document
将如何帮助您生成pdf文档?答案绝对不错!很高兴这有帮助。:-)