根据第一篇DOM基础版文章,我们学习了如何获取对应的DOM元素以及操作DOM元素的内容样式或结构,下面继续对如何操作DOM进行深入研究。

首先给出一个基础代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
  <style>
    .box{
      width: 100px;
      height: 100px;
        background-color: #87CEFA;
    }
    .www{
        font-size: 30px;
    }
    .box1{
        color: #F0E68C;
    }

  </style>
</head>
<body>
<div class="box"></div>
<p class="qqq">你好</p>
<h2 class="www">你好</h2>
</body>
</html>

得到的结果是这样的:

1、类名操作

不同于基础篇的类名操作:

p.className="ap ap1"
p.setAttribute("class","ap")

我们可以不仅仅只将原类名进行覆盖,我们还可以添加、删除、存在则删除,不存在则添加类名、替换原有类名操作,如下:

<script>
  let box=document.querySelector(".box");
  let h2=document.querySelector("h2");

  box.onclick=function (){
      // h2.setAttribute("class","box1")

      //h5 类名处理
      h2.classList.add("box1");//添加新类名

      h2.classList.remove("www");//删除对应类型

      h2.classList.toggle("box1");//存在则删除,不存在则添加类名

      h2.classList.replace("www","box1");//替换原有类名

  }

</script>

2、DOM详情

有很多节点类型,比如文本节点、元素节点、注释节点等等,
每个节点都代表一个数字
就好比,文本节点 => 3,元素节点 => 1,注释节点 => 8

元素节点.childNodes  获取元素所有子级节点

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>
    6
    <p>666</p>
<!-- 你好-->
</div>
<script>
    let div=document.querySelector("div");
    console.log(div.childNodes[0]);
    console.log(div.childNodes[1]);
    console.log(div.childNodes[2]);
    console.log(div.childNodes[3]);

</script>
</body>
</html>

元素节点.nodeType  输出节点类型

let time=div.childNodes

console.log(time[0].nodeType);

输出结果为3,代表文本节点

节点.nodeName 获取名称

console.log(time[0].nodeName);
console.log(time[1].nodeName);
console.log(time[2].nodeName);
console.log(time[3].nodeName);

控制台得到结果是这样的:

元素节点.nodeValue 获取节点内容

console.log(time[0].nodeValue);

得到结果:

3、DOM进阶操作

(1)探究子父级节点

给定初始框架:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .box{
            width: 200px;
            height: 300px;
            background-color: #F0E68C;
            margin: 100px auto 0;
            position: relative;
        }
    </style>
</head>
<body>

<div class="box">
    <h2>你好</h2>
    <p class="box_base">123</p>
    <div>666</div>
</div>

</body>
</html>

如图显示:

元素.childNodes  获取元素的所有子级节点
元素.children  获取元素的所有子级元素节点
let box=document.querySelector(".box");
let childNodes=box.childNodes;
let children=box.children;

console.log(childNodes);//子节点
console.log(children[0]);//子元素节点
console.log(children[1]);//子元素节点
console.log(children[2]);//子元素节点

最终得到的结果,如图:

元素.parentNode  通过子级获取父级节点
let box_base=document.querySelector(".box .box_base");
console.log(box_base.parentNode);

得到结果如图:

元素.offsetParent  获取元素的定位父级

会根据是否有position而变化

console.log(box_base.offsetParent)

若是将最一开始的style中的position删去:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .box{
            width: 200px;
            height: 300px;
            background-color: #F0E68C;
            margin: 100px auto 0;
            /*position: relative;*/
        }
        .box_base{
            position: absolute;
        }


    </style>
</head>
<body>

<div class="box">
    <h2>你好</h2>
    <p class="box_base">123</p>
    <div>666</div>
</div>

<script>
    let box=document.querySelector(".box");
    let childNodes=box.childNodes;
    let children=box.children;

    console.log(childNodes);//子节点
    console.log(children[0]);//子元素节点
    console.log(children[1]);//子元素节点
    console.log(children[2]);//子元素节点

    let box_base=document.querySelector(".box .box_base");
    console.log(box_base.parentNode);

    //获取元素的定位父级
    console.log(box_base.offsetParent)

</script>
<!--
元素.childNodes  获取元素的所有子级节点
元素.children  获取元素的所有子级元素节点
元素.parentNode  获取元素的父节点
元素.offsetParent  获取元素的定位父级元素节点
-->
</body>
</html>

最终的结果就变成了:

(2)通过document 创建节点

document.createElement(“标签名”)  创建元素节点
let div1=document.createElement("div");
let div2=document.createElement("div");
let p=document.createElement("p");
document.createTextNode(“文本节点内容”)  创建文本节点
let txt1=document.createTextNode("文本节点内容");
let txt2=document.createTextNode("222");
document.createComment("注释内容")  创建注释节点
let com=document.createComment("注释内容")
document.createDocumentFragment()  创建节点容器(把它当成一个div一样的存储) 文档代码片段
let frm=document.createDocumentFragment()
console.log(frm.nodeType);

我们创建的节点与之前一样,我们也可以对其进行之前类似的操作:
 

div1.classList.add("qqq");
div1.setAttribute("id","app");
div1.style.background="red";
div1.innerText="6666";

(3)将创建的元素 文本 注释 内容添加到页面中 或对应容器

元素.appendChild(元素节点||文本节点||注释节点);添加到元素的子节点的最后位置
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .box{
            border:10px solid greenyellow;
        }

    </style>
</head>
<body>
<div class="box">
<p>哈哈哈哈哈</p>

</div>

<script>
    //添加到页面中
    let box=document.querySelector(".box");

    //创建元素节点
    let div=document.createElement("div");
    let p=document.createElement("p");

    div.classList.add("qqq");
    div.setAttribute("id","app");
    div.style.background="red";
    div.innerText="6666";

    let span=document.createElement("span");
    span.innerText="通过js创建的span标签";

    box.appendChild(div);
    box.appendChild(span);

</script>

</body>
</html>

最后结果如下图所示:

这个方式是一次只能添加一个,如果想要一次性添加多个的话可以使用:

元素.append(元素节点,文本节点,注释节点)

注意:顺序会影响!!!

box.append(div,span);
元素.insertBefore(添加的元素节点,获取的元素节点||文本节点||注释节点):添加到子级指定位置(在某个元素之前)
let h=document.createElement("h2");
h.innerText="学习创建与添加";

box.insertBefore(h,box.children[0]);

(4)删除与替换

设定初始框架为:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .box{
            width: 200px;
            height: 300px;
            background-color: #F0E68C;
            margin: 100px auto 0;
        }
        .box .box_base{
            color: #87CEFA;
        }
    </style>
</head>
<body>
<div class="box">
    <h2>你好</h2>
    <p class="box_base">123</p>
    <div>666</div>
</div>

</body>
</html>

所展示的结果为:

元素节点.remove()   删除自身元素
let box=document.querySelector(".box");
let box_base=document.querySelector(".box .box_base")
box_base.remove();//  删除自身元素

元素节点.replaceChild(新节点内容,旧节点内容)     替换元素的子元素节点
let dom=document.createElement("div")
dom.innerText="我爱你"
dom.style.color="red"
box.replaceChild(dom,box_base)

最后得到的结果是:

(5)注意点

延续上述例子是否可以box.innerHTML =dom?

答:不可以。因为InnerHTML是能解析字符串渲染到页面,但是并不能解析DOM元素节点对象

更多推荐