js之DOM的节点操作

什么是节点操作

页面中的所有内容都是节点(标签、属性、文本、注释等),在dom中,节点使用node来表示。

HTML DOM树中的所有节点均可通过javaScript进行访问,所以HTML元素(节点)均可被修改,也可以创建或删除。

一般的,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个基本属性。

元素节点 nodeType为1
属性节点 nodeType为2
文本节点 nodeType为3(文本节点包含文字、空格、换行等)
我们在实际开发中,节点操作主要操作的是元素节点

为什么学习节点操作

获取元素通常使用两种方式:
1.利用DOM 提供的方法获取元素
document.getElementById()
document.getRlementByTagName()
document.querySelector等
逻辑性不强,繁琐

2.利用节点的层次关系获取元素
利用父子兄节点关系获取元素
逻辑性强,但是兼容性稍差

这两种方式都可以获取元素节点,我们后面都会使用,但是节点操作更方便

<div>我是div</div>
    <span>我是span</span>
    <ul>
        <li>我是li</li>
        <li>我是li</li>
        <li>我是li</li>
        <li>我是li</li>
    </ul>
    <div class="dome">
        <div class="box">
            <span class="erweima">x</span>
        </div>
    </div>
    <!-- <script>
        var box = document.querySelector('.box');
        console.dir(box);
    </script> -->
    <!-- <script>
        // 父节点 parentNode
        var erweima = document.querySelector('.erweima');
        // var box = document.querySelector('.box')
        // 得到的是离元素最进的父级节点。如果找不到父节点就返回为null,如果指定的节点没有父节点则返回null。
        console.log(erweima.parentNode);
    </script> -->

节点层级

利用DOM树可以把节点划分为不同的层级关系,常见的是父子兄层级关系。
1. 父级节点:
node.parentNode
2.子级节点:
parentNode.childNodes(标准)
parentNode.childNodes返回包含指定节点的子节点的集合,该集合为即时更新的集合。
注意:
返回值里面包含了所有的子节点,包括元素节点,文本节点等。
如果只想要获取里面的元素节点,则需要专门处理。所有我们一般不提倡使用childNodes
3.parentNode.children(非标准)
是一个只读属性,返回所有的子元素节点,它之返回子元素节点,其余节点不返回。
虽然children是一个非标准,但是得到了各个浏览器的支持,因此我们可以放心使用

<script>
        //DOM提供的方法(API)获取
        var ul = document.querySelector('ul');
        var lis = ul.querySelectorAll('li');
        //1.子节点 childNodes所有的子节点 包含 元素节点 文本节点等等
        console.log(ul.childNodes);
        console.log(ul.childNodes[0].nodeType);
        console.log(ul.childNodes[1].nodeType);
        //2.childeren获取所有元素的子元素节点
        console.log(ul.children);
    </script>

节点操作之第一个子元素和最后一个元素

节点层级:
2.子节点
3.parentNode.firstChild
firstChild返回第一个子节点,找不到则返回null。同样,也是包含所有的节点。
4.parentNode.lastChild
lastChild返回的是最后一个子节点。
5.parentNode.firstElementChild
返回第一个子元素节点,找不到则返回null
6.parentNode.lastElementChild
返回最后一个子元素节点,找不到则返回null

(注意这两个方法有兼容问题)

<ol>
        <li>我是li1</li>
        <li>我是li2</li>
        <li>我是li3</li>
        <li>我是li4</li>
        <li>我是li5</li>
        <li>我是li6</li>
        <li>我是li7</li>
    </ol>
    <script>
        var ol = document.querySelector('ol');
        // firstChild第一个子节点 不管是文本节点还是元素节点
        console.log(ol.firstChild);
        console.log(ol.lastChild);
        //firstElementChild返回第一个子元素节点
        console.log(ol.firstElementChild);
        //返回最后一个子元素节点
        console.log(ol.lastElementChild);
        //实际开发中的写法 既没有兼容性问题又返回第一个子元素
        console.log(ol.children[0]);
        // console.log(ol.children[3]);
        //先把所有li的长度拿过来减1就是最后一个元素了
        console.log(ol.children[ol.children.length - 1]);
    </script>

兄弟节点

  1. node.nextSibling
    返回当前元素的下一个兄弟节点,找不到则返回null.同样,也是包含所有的节点。
    2.node.previousSibling
    perviousSibling返回当前元素的上一个兄弟节点,找不到则返回null,同样,也是包含所有的节点。

    3.node.nextElementSibling
    nextElementSibling返回当前元素下一个兄弟元素节点,找不到则返回null。

    4.node.previousElementSibling
    返回当前元素上一个兄弟节点,找不到则返回null.

还是要注意兼容性问题:解决方法封装一个 兼容性函数

<!-- <div>我是div</div>
    <span>我是span</span>
    <script>
        var div = document.querySelector('div');
        //nextSibling 下一个兄弟节点 包含元素节点或者 文本节点等等
        console.log(div.nextSibling);
        console.log(div.previousSibling);
        //nextElementSibling得到下一个兄弟元素节点
        console.log(div.nextElementSibling);
        console.log(div.previousElementSibling);
    </script> -->

创建节点和添加节点

1、创建节点
document.createElement(‘tagName’)
document.createElement()方法创建由tagName指定的HTML元素。因此这些元素原先不存在
是根据我们需求动态生成的,所以我们也称为动态创建元素节点
2、添加节点
node.appendChild(child)
node.appendChild()方法将一个节点添加到指定父节点的子节点列表末尾,类似于css里面的after伪元素。
.node.insertBefore(child,指定元素)
方法将一个节点添加到父节点的指定子节点前面,类似与css里面的before伪元素

<ul>
        <li>123</li>
    </ul>
    <script>
        //1.创建节点元素节点
        var li = document.createElement('li');
        // 2.添加节点 node.appendChild(child)node父节 child子节 后面追加元素,类型于数组中的push
        var ul = document.querySelector('ul');
        ul.appendChild(li)
        // 3.添加节点node.insertBefore(child,指定元素);
        var lili = document.createElement('li')
        ul.insertBefore(lili,ul.children[0]);
        // 4.我们想要页面添加一个新的元素:1.创建元素2.添加元素
    </script>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值