DIV节点如何“分离”,有什么用?

在本文中,创建了一个独立的Div节点: http : //www.bennadel.com/blog/1008-jQuery-empty-Kills-Event-Binding-On-Persistent-Nodes.htm

我不明白:我认为DOM拥有每个节点。 你会如何附加到DOM呢?

最后但并非最不重要的是具有分离节点的目的是什么?

我不确定你期望哪个答案,所以这里有一些想法:

我认为DOM拥有每个节点。

文档拥有每个节点。 每个节点都有ownerDocument [MDN]属性。

从规格 :

Document接口表示整个HTML或XML文档。 从概念上讲,它是文档树的根,并提供对文档数据的主要访问。

由于元素,文本节点,注释,处理指令等不能存在于Document的上下文之外,因此Document接口还包含创建这些对象所需的工厂方法。 创建的Node对象具有ownerDocument属性,该属性将它们与创建其上下文的Document相关联。


你会如何附加到DOM呢?

有多种方法可以插入新节点,例如appendChild [docs]insertBefore [docs]


最后但并非最不重要的是具有分离节点的目的是什么?

一个优点是您可以脱机构建复杂的子树,以便浏览器不必在每次插入节点时重新计算布局。

有时它对解析HTML字符串也很有用。 通过创建一个空的,分离的div并将HTML字符串分配给innerHTML ,您可以轻松地解析和处理HTML字符串。

唯一需要注意的是document.getElementById找不到不属于树的节点。


在这方面也很有趣可能是Node.parentNode属性的解释。 毕竟,没有父Node不是树的一部分:

此节点的父节点。 除AttrDocumentDocumentFragmentEntityNotation之外的所有节点都可以具有父节点。 但是,如果刚刚创建了一个节点但尚未将其添加到树中,或者已从树中删除该节点,则该节点为null

使用document.createElement() ,您可以创建一个元素节点

 var p = document.createElement("p"); 

但是,此时它将存在于内存中但不会附加到DOM。

节点可以通过多种方式连接到DOM,但最简单的方法可能是使用element.appendChild(node)

 var p = document.createElement("p"); // attach the newly created node to the document body document.body.appendChild(p); 

您可能希望首先创建元素,操纵它然后附加到DOM,以便您的操作不会导致浏览器重排,例如,如果您要设置背景颜色,边框,附加子元素等,您希望在没有每次更改的内存都必须反映为浏览器中的视觉更改。

修改DOM很昂贵。 您可以创建一个分离的对象,按照您需要的方式进行设置(添加其属性, 绑定事件处理程序等)。 按照您想要的方式进行设置后,将其附加到DOM。

您绝对可以创建不属于DOM的元素。

 var someElement = document.createElement("div"); var someOtherElement = $("
");

对分离元素执行操作比对附加元素执行操作要有效得多,因为不必渲染分离元素。

您链接到的页面使用.empty() ,它从DOM中分离元素从这些元素中删除所有事件处理程序。

还有.detach() ,这可能是你的意思。 .detach()基本上只是,将节点与DOM分离。 它不再是DOM的一部分了; 它只是在内存中闲逛(只要你把它保存在一个变量中)。 这意味着如果丢弃变量,则永远丢失了分离节点(它不在DOM中,也不在变量中)。

用例例如暂时从DOM中“删除”元素而不实际解除它,以便稍后可以附加它(使用.append / .after / etc)。

 var detached = $("...").detach(); // later: $("body").append(detached);