标签:存在 clone next 相等 window ora 表示 flow 解析
NodeList是一个 节点的集合, 是由 Node.childNodes 和 document.querySelectorAll 返回的。
它是一种类数组对象,用于保存一组有序的节点,可以通过位置(childNodes[index]或childNodes.item(index)) 来访问这些节点, 但它 并不是Array实例。
基本用法:
var firstChild = someNode.childNodes[0];
var secondChild = someNode.childNodes.item(1);
var thirdChild = someNode.childNodes.item(‘#id‘);
var nodeCount = someNode.childNodes.length;
将nodeList转化为Array:
var nodeListArr = Array.prototype.slice.call(someNode.childNodes,0);
//es6
var nodeListArr = Array.from(someNode.childNodes);
HTMLCollection 接口表示一个包含了 元素(元素顺序为文档流中的顺序)的通用集合(generic collection)
以下集合为HTMLCollection:
文档中有一个form元素,id为‘myForm‘。
document.forms//是一个HTMLCollection
//获取该form的方法有以下4种
document.forms[0]
document.forms.item(0)
document.forms[‘myForm‘]
document.forms.namedItem(‘myForm‘);
document.images; // This is an HTMLCollection
HTMLCollection与NodeList都是DOM节点的集合,两者都属于Collections范畴,二者的共同点有:
两者的区别在于:
返回指定的节点在DOM树中的父节点.
parentNode是指定节点的父节点.该节点的父节点可能是一个元素(Element )节点,也可能是一个文档(Document )节点,或者是个文档碎片(DocumentFragment)节点.
返回当前节点的父 元素节点,如果该元素没有父节点,或者父节点不是一个元素节点.则 返回null.
https://stackoverflow.com/questions/8685739/difference-between-dom-parentnode-and-parentelement
大多数情况下,parentElement和parentNode是相同的。
唯一的不同是当节点的父节点不是element类型的时候,parentElemnt就是null了。
As an example:
document.body.parentNode; // the <html> element
document.body.parentElement; // the <html> element
document.documentElement.parentNode; // #document
document.documentElement.parentElement; // null
html元素(document.documentElement)的父节点不是element类型而是document类型,故其parentElemnt是null。
Node.childNodes 返回包含指定节点的子节点的集合(NodeList),该集合为即时更新的集合(live collection)。
https://developer.mozilla.org/zh-CN/docs/Web/API/ParentNode/children
ParentNode.children 是一个只读属性,返回 一个Node的子elements ,也是一个动态更新的 HTMLCollection。
Node.childNodes返回NodeList;Node.children返回HTMLCollection。更多细节参见一、NodeList vs HTMLCollection
Node.firstChild/lastChild只读属性返回节点的第一个/最后一个子节点,如果节点是无子节点,则都为null。
它们分别对应Node.childNodes的第一个后最后一个节点。即someNode.firstChild等于someNode.childNodes[0];someNode.lastChild等于someNode.childNodes[someNode.childNodes.length-1]
要注意fistChild和lastChild也 可以是文本节点。
Tips:使用 document.write 语句插入的两个元素之间不会有空白。
<p id="para-01">
<span>First span</span>
</p>
<script type="text/javascript">
var p01 = document.getElementById(‘para-01‘);
alert(p01.firstChild.nodeName)//#text
</script>
上例得到的是文本节点,因为在p标签和span标签之前,有一个换行符和多个空格充当了一个文本节点.
<p id="para-01"><span>First span</span></p>
<script type="text/javascript">
var p01 = document.getElementById(‘para-01‘);
alert(p01.firstChild.nodeName)
</script>
上例得到的是span元素节点。因为空白符已经被移除了。
Node.previousSibling/nextSibling只读属性返回其前一个/后一个兄弟节点。即返回其父节点的childNodes列表中紧跟在该节点之前/之后的节点。
列表中第一个节点的previousSibling为null,最后一个节点的nextSibling为null。
如果列表中只有一个节点,则其previousSibling和nextSibling都为null
和Node.fistChild/lastChild一样,previousSibling和nextSibling也 可以是文本节点。
Node.appendChild() 方法将一个节点添加到指定父节点的子节点列表末尾,并返回添加的节点
注意:如果被插入的节点已经存在于当前文档的文档树中,则那个节点会首先 从原先的位置移除,然后再插入到新的位置.如果你需要保留这个子节点在原先位置的显示,则你需要先用 Node.cloneNode 方法复制出一个节点的副本,然后在插入到新位置.
var child = node.appendChild(child);
ParentNode.append 方法在 ParentNode的最后一个子节点之后插入一组 Node 对象或 DOMString 对象。被插入的 DOMString 对象等价为 Text 节点。
Node.insertBefore() 方法在参考节点之前插入一个节点作为一个指定父节点的子节点。
var insertedElement = parentElement.insertBefore(newElement, referenceElement);
注意:如果referenceElement为null则newElement将被插入到子节点的末尾。
注意:如果newElement已经在DOM树中,newElement首先会从DOM树中移除
Node.replaceChild()方法用指定的节点替换当前节点的一个子节点,并返回被替换掉的节点。
var replacedNode = parentNode.replaceChild(newChild, oldChild);
Node.cloneNode() 方法返回调用该方法的节点的一个副本。其有一个Boolean参数,表示是否执行深复制。
var dupNode = node.cloneNode(deep);
Eg: 一个节点要想添加到两个父节点后面,这个节点必须要深复制一次:
const switchStyle = document.createElement("style");
const switchStyleCopy = switchStyle.cloneNode(true);//深复制
innerIframeWindowHead.appendChild(switchStyle);
outerIframeWindowHead.appendChild(switchStyleCopy);
Element.innerHTML 属性设置或获取HTML语法表示的元素的后代。
innerText属性可以操作元素中所含的所有文本内容,包括子文档树中的文本:
对于以下HTML:
<div id="content">
<p>This is a paragraph.</p>
<ul>
<li>Item1</li>
<li>Item2</li>
</ul>
</div>
执行以下js:
document.getElementById("content").innerText;
/* 得到
This is a paragraph.
Item1
Item2
*/
Node.textContent 属性表示一个节点及其后代的文本内容。
P294/301
P297
使用innerHTML/outerHMTL/insertAjacentHTML可能带来性能问题。
在删除带有事件处理程序或将其他js对象作为属性的DOM子树时,可能导致内存占用问题。因为在删除时,元素与事件处理程序(或js对象)之间的绑定关系在内存中并没有一并删除。如果这种情况频繁出现,占用的内存数量就会明显增加。所以,在使用这些方法时,最好 先手工删除要被替换的元素的所有事件处理程序和Js对象属性。
插入大量HTML标记时,使用innerHTML比使用createElement再appendChild、insertBefore要高效得多。因为设置innerHTML时会创建一个HTML解析器,该解析器是在浏览器级别代码(C++)基础上运行的,故比执行JavaScript快得多。
但是创建和销毁HTMl解析器也会带来性能损失,所以最好 将设置innerHTML的次数控制在合理范围之内。例如将要插入的HTML字符串完全拼接好了,再一次性插入DOM。
https://developer.mozilla.org/zh-CN/docs/Web/API/Node/parentNode
https://developer.mozilla.org/zh-CN/docs/Web/API/Node/parentElement
https://developer.mozilla.org/zh-CN/docs/Web/API/ParentNode/append
https://developer.mozilla.org/zh-CN/docs/Web/API/Node/textContent
https://www.jianshu.com/p/f6ff5ebe45fd
http://blog.csdn.net/jjfat/article/details/9127509
《JavaScript高级程序设计》10.1.1、11.3.6、11.4.4
标签:存在 clone next 相等 window ora 表示 flow 解析
原文地址:https://www.cnblogs.com/Bonnie3449/p/9376483.html