◆
JavaScript DOM 节点操作与 Node、NodeList 详解
NodeList
以下代码测试的 html 代码 以及 js 代码
<p id="p1">1</p>
<div id="test">
<div id="son_one">son_one</div>
<div class="my_test" style="display: block" id="son_two">
<p id="son_two_p">son_two</p>
</div>
<div class="my_test" style="color: blue!important;">son_three</div>
<div class="my_test" style="display: none" id="son_four">
<p id="son_four_p">son_four</p>
</div>
<script>
var test = '这是测试';
</script>
<style>
* {
margin: 0;
padding: 0;
}
</style>
</div>
完整示例代码
// var byId = document.getElementById('test').normalize()
var byId = document.getElementById('test');
var p1 = document.getElementById('p1');
var son_one = document.getElementById('son_one');
var son_two_p = document.getElementById('son_two_p');
var son_two = son_two_p.parentNode;
/*
克隆一个元素节点会拷贝它所有的属性以及属性值,当然也就包括了属性上绑定的事件(比如onclick="alert(1)"),
但不会拷贝那些使用addEventListener()方法或者node.onclick = fn这种用JavaScript动态绑定的事件.
在使用Node.appendChild()或其他类似的方法将拷贝的节点添加到文档中之前,那个拷贝节点并不属于当前文档树的一部分,也就是说,它没有父节点.
如果deep参数设为false,则不克隆它的任何子节点.该节点所包含的所有文本也不会被克隆,因为文本本身也是一个或多个的Text节点.
*/
var clonePone = p1.cloneNode(true);
console.log(clonePone);
// 将指定的 childNode 参数作为最后一个子节点添加到当前节点。
p1.appendChild(clonePone);
// 返回一个 Boolean 布尔值,来表示传入的节点是否为该节点的后代节点。
console.log(
'document.body.contains(clonePone):',
document.body.contains(clonePone),
);
console.log('clonePone.contains(p1):', clonePone.contains(p1));
console.log('p1.contains(clonePone):', p1.contains(clonePone));
// 返回一个Boolean 布尔值,来表示该元素是否包含有子节点。
console.log('p1.hasChildNodes():', p1.hasChildNodes());
console.log('clonePone.hasChildNodes():', clonePone.hasChildNodes());
// 返回一个 Boolean 类型值。当两个 node 节点为相同类型的节点且定义的数据点匹配时(即属性和属性值相同,节点值相同)返回 true,否则返回 false。
console.log(clonePone.isEqualNode(clonePone));
// son_two.removeChild(son_two_p) // 移除当前节点的一个子节点。这个子节点必须存在于当前节点中。
// replaceChild() 方法用指定的节点替换当前节点的一个子节点,并返回被替换掉的节点。
var sp1 = document.createElement('p');
sp1.setAttribute('id', 'newSpan'); // 添加一个id属性,值为'newSpan'
var sp1_content = document.createTextNode('新的span元素的内容.'); // 创建一个文本节点
sp1.appendChild(sp1_content); // 将文本节点插入到span元素中
son_two.replaceChild(sp1, son_two_p); // 用新的span元素sp1来替换掉sp2
NodeList对象是节点的集合,通常是由属性,如Node.childNodes和 方法,如document.querySelectorAll返回的。NodeList不是一个数组,是一个类似数组的对象。- 可以使用
forEach()来迭代。还可以使用Array.from()将其转换为数组。
NodeList 实时/静态集合例子
Node.childNodes是实时的document.querySelectorAll就会返回一个静态NodeList
// 返回一个包含了该节点所有子节点的实时的 NodeList。NodeList 是动态变化的。如果该节点的子节点发生了变化,NodeList对象就会自动更新。
console.log('childNodes:', byId.childNodes);
console.log('');
console.log('NodeList 实时/静态集合例子');
console.log('byId.childNodes.length:', byId.childNodes.length);
byId.appendChild(document.createElement('div'));
console.log('添加一个节点后 byId.childNodes.length:', byId.childNodes.length);
console.log('byIdbyIdQuerySel.childNodes.length:', byIdbyIdQuerySel.length);
byId.innerHTML +=
'<div class="my_test" style="color: blue!important;">son_four</div>';
console.log(
'插入一段元素节点代码后 byIdbyIdQuerySel.childNodes.length:',
byIdbyIdQuerySel.length,
); //
console.log(
'插入一段元素节点代码后 byId.childNodes.length:',
byId.childNodes.length,
); //
console.log('NodeList 实时/静态集合例子');
console.log('');
常用方法
// 返回一个表示base URL的DOMString。也就是整个 url 字符串
console.log('baseURI:', byId.baseURI);
// 返回 ture
console.log('byId.baseURI === location.href:', byId.baseURI === location.href);
// 返回该节点的第一个子节点Node,如果该节点没有子节点则返回null。
console.log('firstChild:', byId.firstChild);
// 返回该节点的第一个子节点 Element 元素,如果该节点没有子节点则返回null。
console.log('firstElementChild:', byId.firstElementChild);
// 返回该节点的最后一个子节点Node,如果该节点没有子节点则返回null。
console.log('lastChild:', byId.lastChild);
// 返回该节点的最后一个子节点 Element 元素,如果该节点没有子节点则返回null。
console.log('lastElementChild:', byId.lastElementChild);
// 返回与该节点同级的下一个节点 Node,如果没有返回null。
console.log('nextSibling:', byId.nextSibling);
// 返回与该节点同级的下一个节点 Element 元素,如果没有返回null。
console.log('nextElementSibling:', byId.nextElementSibling);
// 返回一个当前节点同辈的前一个节点( Node) ,或者返回null(如果不存在这样的一个节点的话)。
console.log('previousSibling:', byId.previousSibling);
// 返回一个当前节点同辈的前一个节点 Element 元素 ,或者返回null(如果不存在这样的一个节点的话)。
console.log('previousElementSibling:', byId.previousElementSibling);
// 返回一个当前节点 Node的父节点 。如果没有这样的节点,比如说像这个节点是树结构的顶端或者没有插入一棵树中, 这个属性返回null。
console.log('parentNode', byId.parentNode);
// 返回一个当前节点的父节点 Element 。 如果当前节点没有父节点或者说父节点不是一个元素(Element), 这个属性返回null。
console.log('parentElement', byId.parentElement);
// 返回一个当前节点 Node的父节点 。如果没有这样的节点,比如说像这个节点是树结构的顶端或者没有插入一棵树中, 这个属性返回null。
console.log('son_one.parentNode', son_one.parentNode);
// 返回一个当前节点的父节点 Element 。 如果当前节点没有父节点或者说父节点不是一个元素(Element), 这个属性返回null。
console.log('son_one.parentElement', son_one.parentElement);
// 返回一个包含该节点名字的DOMString。
console.log('nodeName:', byId.nodeName);
// 返回一个与该节点类型对应的无符号短整型的值
console.log('nodeType:', byId.nodeType);
// 对于文档节点来说, nodeValue返回null. 对于text, comment, 和 CDATA 节点来说, nodeValue返回该节点的文本内容. 对于 attribute 节点来说, 返回该属性的属性值.
console.log('nodeValue:', byId.nodeValue);
// 返回一个包含该节点名字的DOMString。
console.log('p1.nodeName:', p1.nodeName);
// 返回一个与该节点类型对应的无符号短整型的值
console.log('p1.nodeType:', p1.nodeType);
// 对于文档节点来说, nodeValue返回null. 对于text, comment, 和 CDATA 节点来说, nodeValue返回该节点的文本内容. 对于 attribute 节点来说, 返回该属性的属性值.
console.log('p1.nodeValue:', p1.nodeValue);
removeChild
- Node.removeChild() 方法从 DOM 中删除一个子节点。返回删除的节点。
let oldChild = node.removeChild(child)ORelement.removeChild(child);child是要移除的那个子节点.node是child的父节点.oldChild保存对删除的子节点的引用.oldChild === child.
- 被移除的这个子节点仍然存在于内存中,只是没有添加到当前文档的 DOM 树中,
- 因此,你还可以把这个节点重新添加回文档中,当然,实现要用另外一个变量比如上例中的
oldChild来保存这个节点的引用 - 如果使用上述语法中的第二种方法, 即没有使用
oldChild来保存对这个节点的引用, 则认为被移除的节点已经是无用的, 在短时间内将会被内存管理回收 - 如果上例中的
child节点不是node节点的子节点,则该方法会抛出异常.
HTMLCollection
- 表示一个包含了元素(元素顺序为文档流中的顺序)的通用集合,提供了用来从该集合中选择元素的方法和属性。
HTML DOM中的HTMLCollection是即时更新的(live);当其所包含的文档结构发生改变时,它会自动更新。
nodeType
| 常量 | 值 | 描述 |
|---|---|---|
| Node.ELEMENT_NODE | 1 | 一个 元素 节点,例如 p 标签 和 div 标签。 |
| Node.ATTRIBUTE_NODE | 2 | Attr 节点 |
| Node.TEXT_NODE | 3 | Element 或者 Attr 中实际的 文字 |
| Node.CDATA_SECTION_NODE | 4 | 一个 CDATASection,例如 <!CDATA[[ … ]]>。 |
| Node.PROCESSING_INSTRUCTION_NODE | 7 | 用于 XML 文档的 例如 <?xml-stylesheet ... ?> 声明。 |
| Node.COMMENT_NODE | 8 | 一个 Comment 节点。 |
| Node.DOCUMENT_NODE | 9 | 一个 Document 节点。 |
| Node.DOCUMENT_TYPE_NODE | 10 | 描述文档类型的 DocumentType 节点。例如 <!DOCTYPE html> 就是用于 HTML5 的。 |
| Node.DOCUMENT_FRAGMENT_NODE | 11 | 一个 DocumentFragment 节点 |
dom 是什么
- 文档对象模型 (DOM) 是
HTML和XML文档的编程接口 DOM将文档解析为一个由节点和对象(包含属性和方法的对象)组成的结构集合- 简言之,它会将 web 页面和脚本或程序语言连接起来。
html
HTML 标签里的元素名不区分大小写。也就是说,它们可以用大写,小写或混合形式书写。 例如,
<title>标签可以写成<Title>,<TITLE>或以任何其他方式。

还没有留言,来发表第一条吧~