DOM操作之节点操作


节点操作

利用节点层级关系获取元素

  • 网页中所有内容(标签,属性,文本,注释)都是节点,节点使用node 来表示

  • 利用父子兄节点关系获取元素

  • 逻辑性强,但是兼容相差

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

  • 元素节点 nodeType 为 1
  • 属性节点 nodeType 为 2
  • 文本节点 nodeType 为 3 (文本节点包含文字,空格,换行)

父节点操作

node.parentNode

2.parentNode 属性可返回某节点的父节点,注意是最近的一个父节点

3.如果指定的节点没有父节点则返回null

JS
class="demo"> <div class="box"> <span class="erweima">×span> div>
<script> // 1. 父节点 parentNode var erweima = document.querySelector('.erweima'); // var box = document.querySelector('.box'); // 得到的是离元素最近的父级节点(亲爸爸) 如果找不到父节点就返回为 null console.log(erweima.parentNode); script>

子节点操作

parentNode.childNodes(标准)

  • parentNode.childNodes 返回包含指定节点的子节点集合,该集合为即时更新的集合

parentNode.children(非标准)

  • parentNode.children 是一个只读属性,返回所有的子元素节点,它只返回子元素节点,其余节点不返回
JS
    <li>我是lili> <li>我是lili> <li>我是lili> <li>我是lili>
<script> // 1. 子节点 parentNode.childNodes let ul = document.querySelector('ul'); // 子节点 childNodes 所有的子节点 包含 元素节点 文本节点注释节点等等 console.log(ul.childNodes); console.log(ul.childNodes[0].nodeType); // 3 console.log(ul.childNodes[1].nodeType); // 1 // 2.children 获取所有子元素节点 console.log(ul.children); script>

parentNode.firstChild

返回第一个第一个子节点,找不到则返回null,同样也是包含所有的节点

parentNode.lastChild

返回最后一个子节点,找不到则返回null,同样也是包含所有的节点

parentNode.firstElementChild (IE9以上)

返回第一个子元素节点

parentNode.lastElementChild (IE9以上)

返回最后一个子元素节点

JS
    <li>我是li1li> <li>我是li2li> <li>我是li3li> <li>我是li4li> <li>我是li5li>
<script> let ol = document.querySelector('ol'); // 1. firstChild 第一个子节点 不管是文本节点还是元素节点 console.log(ol.firstChild); console.log(ol.lastChild); // 2. firstElementChild 返回第一个子元素节点 ie9才支持 console.log(ol.firstElementChild); console.log(ol.lastElementChild); // 3. 实际开发的写法 既没有兼容性问题又返回第一个子元素 console.log(ol.children[0]); console.log(ol.children[ol.children.length - 1]); script>

兄弟节点操作

node.nextSilbling

node.nextSilbling 返回当前元素的下一个兄弟节点,找不到则返回null,同样,也是包含所有的节点

node.previousSibling

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

node.nextElementsibling

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

node.previousElementSibling

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

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

创建节点

docment.creatElement('tagName')

docment.creatElement('tagName') 方法创建有tagName指定的Html元素,因为这些元素原先不存在,是根据我们的需求动态产生的,所以也称为 动态创建元素节点

添加节点

node.appendChild(child)

node.appendChild(child) 方法将一个节点添加到指定父节点的子节点列表末尾。类似于css里面的after 伪元素

node.insertBefore(child,指定元素)

node.insertBefore(child,指定元素) 方法将一个节点添加到父节点的指定子节点前面,类似于css里面的before伪元素

JS
    <li>123li>
<script> // 1. 创建节点 let li = document.createElement('li'); // 2. 添加节点 let ul = document.querySelector('ul'); ul.appendChild(li); // 3. 添加节点 let li1 = document.createElement('li'); ul.insertBefore(li1,ul.children[0]); //4. 我们想要页面添加一个新的元素 : 1. 创建元素 2. 添加元素 script>

删除节点

node.removeChild(child)

node.removeChild( ) 方法从 DOM 中删除一个子节点,返回删除

JS

<ul>
    <li>1li>
    <li>2li>
    <li>3li>
ul>
<script>
    // 获取元素
    let ul = document.querySelector('ul');
    let btn = document.querySelector('button');
    // 注册事件
    // 点击按钮依次删除ul里面的li
    btn.onclick = function(){
        if(ul.children.length == 0){
            this.disabled = true;
        }else{
            ul.removeChild(ul.children[0]);
        }
    }
script>

克隆节点(复制节点)

node.cloneNode()

node.cloneNode() 方法返回调用该方法的节点的一个副本,也称为克隆节点/拷贝节点

??:如果括号参数为空或者为false,则是浅拷贝,即只克隆复制节点本身,不可克隆隆里面的子节点

??:如果括号参数为true,则是深度拷贝,会复制节点本身以及里面所有的子节点

JS
    <li>111li> <li>2li> <li>3li>
<script> // 获取元素 let ul = document.querySelector('ul'); // 1. node.cloneNode(); 括号为空或者里面是false 浅拷贝只复制标签不复制里面的内容 // 2. node.cloneNode(true); 括号为true 深拷贝 复制标签复制里面的内容 let li1 = ul.children[0].cloneNode(true); ul.appendChild(li1); script>

相关