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
不是树的一部分:
此节点的父节点。 除
Attr
,Document
,DocumentFragment
,Entity
和Notation
之外的所有节点都可以具有父节点。 但是,如果刚刚创建了一个节点但尚未将其添加到树中,或者已从树中删除该节点,则该节点为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);