1

Node对象

Node对象的概念

首先了解一下Node对象怎么用。DOM的标准规范中提供了Node对象,该对象主要提供了用于解析DOM节点树结构的属性和方法。
DOM树结构主要是依靠节点进行解析,成为DOM节点树结构。Node对象是解析DOM节点树结构的主要入口。
Node对象提供的属性和方法,可以实现遍历节点、插入节点和替换节点的操作。

继承链关系

Node对象是继承于EvebtTarget对象的,EvebtTarget是一个用于接收事件的对象。
代码示例

console.log(Node.prototype inseabceof EventTarget);

DOM的标准规范中的Document对象和Element对象都是继承于Node对象的。
代码示例

console.log(Document.prototype instanceof Node);
console.log(Element.prototype instanceof Node);

测试Node对象

由于Node对象是DOM底层封装的对象,所以我们并不能通过直接打印Node对象来查看其属性或方法。
代码示例

console.log(Node.prototype);

运行HTML页面后,打开开发者工具就可以看到隐藏的属性或方法。

判断节点类型

判断节点类型

Node对象提供了nodeName、nodeType和nodeValue分别可以用于获取指定节点的节点名称、节点类型和节点的值。
DOM节点树结构中,我们开发常用的节点有:
1.元素节点:表示HTML页面中的标签或结构。
2.属性节点:表示HTML页面中的开始标签包含的属性
3.文本节点:表示HTML页面中的标签所包含的文本内容。

nodeName属性

Node对象的nodeName属性用于获取指定的节点名称。

var str = node.nodeName;

针对不同的节点,nodeName返回的节点名称是不同的
1.Document文档节点:#document
2.Element元素节点:元素节点的元素名
3.Attr属性节点:属性节点的属性名
4.Text文本节点:#text

nodeType属性

Node对象的nodeType属性用于获取指定节点的节点类型

var type = node.nodeType;

type是一个整数,其代表的是节点类型,对不同的节点类型,nodeType返回的节点类型不同。

nodeValue属性

Node对象的nodeValue属性用于获取节点的节点值

var value = node.nodeValue;

value是一个包含当前节点的值的字符串
针对不同的节点类型,nodeValue返回的节点类型是不同的
1.Document文本节点返回null属性值
2.Element元素节点返回null属性值
3.Attr属性节点返回属性节点的属性值
4.Text文本节点返回文本节点的内容

遍历节点

获取父节点

通过HTML页面中指定元素查找父级节点,我们可以使用Node对象的parentNode属性实现

var pNode = node.parentNode;

在一个元素节点的父节点,可能是一个元素节点,也可能是一个文档节点。

获取父元素节点

Node对象出了提供了parentNode属性可以获取指定节点的父节点之外,还提供了parentElement属性获取指定节点的父元素节点
在如果一个节点没有父节点,或者父节点不是一个元素节点的话,parentElement属性返回null。

父节点与父元素节点的区别

所谓的父节点,并没有指定某个接待的父节点一定是哪个类型的节点。而父元素节点,指定了某个节点的父节点一定是元素节点
1.parentNode:获取指定节点的父节点,其父节点不一定是元素节点。
2.parentElement:获取指定节点的元素节点,其父几点不许是元素节点
如果我们获取<html>元素的父节点的话,就是document文档节点。而document文档节点并不是一个元素节点。

获取子节点

通过HTML页面中指定元素查找其子节点,我们可以通过以下Node对象的属性实现:
1.chiNode:获取指定节点的所有子节点。
2.firstChild:获取指定节点的第一个子节点。
3.lasrChild:获取指定节点的最后一个子节点
Node对象提供chidNode属性用于获取HTML页面中指定节点的所有子节点。

var ndList = Node.childNode;

chidNode属性返回值ndList是一个NodeList对象,并且为只读。该属性获取一个包含指定节点的所有子节点的集合。
获取第一个子节点。

var first_child = node.firstChild;

firstChild属性返回的first_child博爱是当前节点的第一个子节点的引用。
获取最后一个子节点

var last_child = node.lastChild;

lastChild属性返回的last_Child表示当前节点的最后一个子节点的引用

空白节点的解决方案

在开发中,空白节点的问题将DOM节点树结构的解析及操作增加了不少的难度和麻烦,这里提供了一种比较简单有效的解决方式:
1.弃用DOM中Node对象用于获取指定节点的子节点和兄弟节点的属性。
2.通过使用getElementsByTagName()方法实现相应功能

删除节点

Node对象提供了removeChild()方法实现从HTML页面中删除之低昂节点。

var oldChild = node.removeChild(child);
element.removeChild(child);

调用removeChild()方法的node表示child参数的父节点。
child参数表示要删除的节点。

注意事项

被删除的节点是否从内存中被销毁,Mozilla社区有这样一段描述;
被溢出的这个子节点仍然存在内存中,只是内有添加到当前文档的DOM树中。因此,你还可以把这个节点重新添加会文档中。

替换节点

Node对象提供了replaceChild()方法实现HTMLL页面中节点的替换功能

<head>
    <meta charset="UTF-8">
    <title>替换节点</title>
</head>
<body>
<ul id="parent">
    <li>苹果</li>
    <li id="mi">小米</li>
    <li>锤子</li>
</ul>
<ul id="game">
    <li>星际争霸</li>
    <li id="ms">魔兽世界</li>
    <li>王者荣耀</li>
</ul>
<script>
    // 1.获取目标节点的父节点
    var parent = document.getElementById('parent');
    // 2.获取目标节点
    var mi = document.getElementById('mi');
    // 3.创建新节点
    var newLi = document.createElement('li');
    var textNode = document.createTextNode('华为');
    newLi.appendChild(textNode);

    var ms = document.getElementById('ms');

    /*
        parentNode.replaceChild(newChild,currentChild)
        * 参数
          * parentNode - 表示目标(被替换)节点的父节点
          * newChild - 表示替换(新)节点
          * currentChild - 表示目标节点
        * 情况
          * 是新创建的节点 -> 替换
          * 是页面已存在的节点 -> 移动+替换
     */
    parent.replaceChild(ms, mi);
</script>
</body>

复制节点

Node对象提供了cloneNode()方法实现HTML页面中节点的复制功能。


<head>
    <meta charset="UTF-8">
    <title>复制节点</title>
</head>
<body>
<button id="btn">按钮</button>
<script>
    var btn = document.getElementById('btn');
    /*
        node.cloneNode(deep)
        * deep参数 - 是否复制当前节点的后代节点
          * true - 表示复制后代节点
          * false - 默认值,表示不复制后代节点
        * 注意 - 复制操作时,注意ID属性的值
     */
    var newBtn = btn.cloneNode(true);

    var body = document.body;
    body.appendChild(newBtn);

</script>
</body>

注意事项

克隆一个元素街二店会拷贝它所有的属性以及属性值,当然也包括属性上绑定的事件,但不会拷贝那些使用addEventListener()方法或者node.onclick = fn这种JavaScript动态绑定的事件。
在使用Node.appendChild()或其他类型的方法将拷贝的节点添加到文档中之前,那个拷贝点并不属于当前文档树的一部分。也就是说,他没有父节点。
如果deep参数设置为false,则不会克隆它的任何子节点。该子节点所包含的所有文本也不会被克隆,因为文本本身也是一个或多个的Text节点


武文佳
14 声望5 粉丝