DOM节点


前言

这部分学习DOM节点


一、节点

在这里插入图片描述

1.节点属性

(1)nodeType:节点类型,属性值为数字,表示不同的节点类型,共12中,只读
1元素节点 2属性节点 3文本节点
(2)nodeName:节点名称(标签名称),只读
(3)nodeValue:节点值,返回当前设置的节点值,元素节点的值始终为null。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="box">div1</div>
    <script>
        // 获取节点
        var box = document.getElementById("box");
        //元素节点
        console.dir(box);
        //属性节点
        var isNode = box.getAttributeNode("id");
        console.dir(isNode);
        isNode.nodeValue = "demo";
        //文本节点
        var childNode = box.childNodes;
        console.dir(childNode);
        childNode[0].nodeValue = "我爱你";
    </script>

</body>
</html>

2.节点层级-父子节点属性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="box">
        <p>这是一个段落</p>
        <span>这是一个小盒子</span>
    </div>
    <script>
        //获取元素
        var box = document.getElementById("box");
        //子节点1
        console.log(box.childNodes);//获取所有类型的子节点
        console.log(box.children);//获取所有元素类型的子节点
        console.log(box.firstChild);//获取所有类型中的第一个子节点
        console.log(box.lastChild);//获取所有类型中的最后一个子节点
        console.log(box.lastElementChild);//获取元素类型的最后一个子节点
        //父节点
        console.log(box.parentNode);
        console.log(box.parentElement);
    </script>
</body>
</html>

案例:父子节点-隔行换色案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        td{
            width: 100px;
            height: 40px;
        }
    </style>
</head>
<body>
    <table border="1" style="border-collapse: collapse;">
        <tbody id="tb">
          <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        </tbody>
    </table>
    <script src="common.js"></script>
    <script>
        //调用获取元素
        var tb = my$("tb");
        //获取所有元素子节点
        var trs = tb.children;
        console.log(trs);
        //隔行变色
        for (var i = 0;i < trs.length;i++) {
            if (i % 2 == 0) {
                trs[i].style.backgroundColor = "pink";
            } else {
                trs[i].style.backgroundColor = "lightgray";
            }
        }
    </script>
</body>
</html>

3.兄弟节点属性

在这里插入图片描述
注意:nextElementSibling 和 previousElementSibling有兼容性问题,IE9以后才支持。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="box">
        <p>段落1</p>
        <p>段落2</p>
        <p id="p3">段落3</p>
        <p>段落4</p>
        <p>段落5</p> 
    </div>
    <script>
        //获取元素
        var p3 = document.getElementById("p3");
        //获取下一个同级节点
        var p4 = p3.nextSibling;
        //获取上一个同级节点
        var p2 = p3.previousSibling;
        //获取下一个同级元素节点
        var p44 = p3.nextElementSibling;
        //获取上一个同级元素节点
        var p22 = p3.previousElementSibling;

        console.log(p4);
        console.log(p2);
        console.log(p44);
        console.log(p22);
    </script>
</body>
</html>

4.创建节点的方法

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        //创建新的节点
        var div = document.createElement("div");
        console.dir(div);

        var cla = document.createAttribute("class");
        console.dir(cla);

        var txt = document.createTextNode("txt");
        console.dir(txt);
    </script>
</body>
</html>

注意:只是存储到内存里,并没有直接加载到DOM树之上。

5.添加节点的方法

parentNode. appendChild(child):将一个节点添加到指定父节点的子节点列表末尾。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

</head>
<body>
    <div id="box">
        <p>段落内容 1</p>
        <p id="p2">段落内容 2</p>
        <p>段落内容 3</p>
        <p>段落内容 4</p>
    </div>
    <script src="common.js"></script>
    <script>
        // 创建新的节点
        var div = document.createElement("div");
        var cls = document.createAttribute("class");
        var txt = document.createTextNode("hello");
        //创建新的节点是存储到内存中的,并没有添加到DOM树中
        //获取元素
        var box = my$("box");
        var p2 = my$("p2");
        //添加节点
        box.appendChild(div);
        //文本节点也可以添加到元素内部
        div.appendChild(txt);
        //自己创建的节点本身也是一个对象,可以进行添加属性等操作,将操作的元素加载到DOM树中,依旧保留

        //将节点从原始位置删除,添加到新的指定位置
        box.appendChild(p2);

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

6.替换、插入、删除子节点的方法

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="box">
        <p>段落内容 1</p>
        <p id="p2">段落内容 2</p>
        <p>段落内容 3</p>
        <p>段落内容 4</p>
    </div>
    <script src="common.js"></script>
    <script>
        // 创建新的节点
        var div = document.createElement("div");
        var cls = document.createAttribute("class");
        var txt = document.createTextNode("hello");
        // 创建的新的节点,是存储在内存中的,但是并没添加到 DOM 树上
        div.appendChild(txt);
        // 获取元素
        var box = my$("box");
        var p2 = my$("p2");  
        //替换节点
        // box.replaceChild(div,p2);
        //在指定位置插入节点
        box.insertBefore(div,p2);
        //在末尾插入节点
        box.insertBefore(div,null);

        //删除节点
        box.removeChild(p2);
    </script>
</body>
</html>

7.克隆节点

.cloneNode():深度克隆,返回值为true,克隆的是某节点以及内部所有的子节点。浅度克隆,返回值为false,克隆的是节点本身。
注意:标签上的属性和属性值也会被克隆,在标签上行内绑定的事件也会被克隆,而在js中绑定的事件不会被克隆。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="box">
        <p>段落内容 1</p>
        <p id="p2">段落内容 2</p>
        <p>段落内容 3</p>
        <p>段落内容 4</p>
    </div>
    <script src="common.js"></script>
    <script>
        // 获取元素
        var box = my$("box");
        var p2 = my$("p2");
        //浅度克隆
        // var newBox = box.cloneNode(false);
        // document.body.appendChild(newBox);

        //深度克隆
        var newBox = box.cloneNode(true);
        document.body.appendChild(newBox);
    </script>
</body>
</html>

8.节点判断的方法

判断有没有子节点的方法:
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="box">
        <p>段落内容 1</p>
        <div>
          <p id="p2">段落内容 2</p>
        </div>
        <p>段落内容 3</p>
        <p>段落内容 4</p>
    </div>
    <div id="demo">
    
    </div>
    <script src="common.js"></script>
    <script>
        //获取元素
        var box = my$("box");
        var p2 = my$("p2");
        var demo = my$("demo");
        //判断有没有子节点,不区分元素的
        console.log(box.hasChildNodes());
        console.log(demo.hasChildNodes());
        //判断节点内部是否有后代节点
        console.log(box.contains(p2));
        //判断内部有子节点的方法有三种
        //1.firstChilds() !== null
        console.log(box.firstChild !== null);
        //2.chlidNode.length > 0
        console.log(box.childNodes.length > 0);
        //3.hasChildNodes() 
        console.log(box.hasChildNodes());
    </script>
</body>
</html>

二、案例

1.动态创建列表案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="box">
        
    </div>
    <script>
        var box = document.getElementById("box");
        var nams = ["刘备","关羽","曹操","赵云"];
        //创建子节点
        var ul = document.createElement("ul");
        //添加子节点
        box.appendChild(ul);
        for (var i = 0;i < nams.length;i++) {
            //创建子节点
            var li = document.createElement("li");
            //添加子节点
            ul.appendChild(li);
            li.innerText = nams[i]; 
        }
    </script>
</body>
</html>

2.动态创建表格案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        table{
            border-collapse: collapse;
        }
        thead{
            background-color: #ccc;
        }
        th,td{
            width: 100px;
            height: 40px;
            text-align: center;
        }
    </style>
</head>
<body>
    <h1>动态创建表格</h1>
    <table id="wrap" border="1">
      <thead>
        <tr>
          <th>姓名</th>
          <th>科目</th>
          <th>成绩</th>
          <th>操作</th>
        </tr>
      </thead>
      <tbody id="tb">
  
      </tbody>
    </table>
    <script src="common.js"></script>
    <script>
        //获取元素
        var tb = my$("tb");
        //模拟后台数据
        var datas = [
            {name: "zs",subject: "语文",score: 80},
            {name: "ls",subject: "数学",score: 56},
            {name: "ww",subject: "英语",score: 88},
            {name: "lb",subject: "物理",score: 76},
            {name: "cc",subject: "化学",score: 90},
            {name: "gy",subject: "生物",score: 100}
        ];
        //for循环换遍历数组
        for (var i = 0;i < datas.length;i++) {
            //创建节点
            var tr = document.createElement("tr");
            //添加节点
            tb.appendChild(tr);
            //定义一个变量存储数组中的每一个对象
            var data = datas[i];
            //遍历对象
            for (var k in data) {
                //创建节点
                var td = document.createElement("td");
                //添加节点
                tr.appendChild(td);    
                //向td中添加数据
                td.innerText = data[k];
            }
            //删除的td
            var td = document.createElement("td");
            //添加节点
            tr.appendChild(td); 
            //创建td中的a标签
            var a = document.createElement("a");  
            a.innerText = "删除";
            a.href = "javascript:void(0);"
            //将a添加到td中
            td.appendChild(a);
            //添加点击事件
            a.onclick = function () {
                tb.removeChild(this.parentNode.parentNode);
            }
        }
    </script>
</body>
</html>

3.选择水果案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        select {
          width: 200px;
          height: 200px;
          background-color: #33cccc;
          font-size: 20px;
        }
    </style>
</head>
<body>
    <select id="all" size="5" multiple="multiple">
        <option>苹果</option>
        <option>橘子</option>
        <option></option>
        <option>西瓜</option>
        <option>水蜜桃</option>
    </select>
    
    <input type="button" value=">>" id="btn1">
    <input type="button" value="<<" id="btn2">
    <input type="button" value=">" id="btn3">
    <input type="button" value="<" id="btn4">
    
    <select id="choose" multiple="multiple">
    </select>
    
    <script src="common.js"></script>
    <script>
        //获取元素
        var all = my$("all");
        var choose = my$("choose");
        var btn1 = my$("btn1");
        var btn2 = my$("btn2");
        var btn3 = my$("btn3");
        var btn4 = my$("btn4");
        //添加btn1全选的点击事件
        btn1.onclick = function () {
            var opts = all.children;
            var n = opts.length;
            for (var i = 0;i < n;i++) {
                choose.appendChild(opts[0]);
            }
        };
        //添加btn2全选的点击事件
        btn2.onclick = function () {
            var opts = choose.children;
            var n = opts.length;
            for (var i = 0;i < n;i++) {
                all.appendChild(opts[0]);
            }
        };
        //添加btn3单选的点击事件
        btn3.onclick = function () {
            var opts = all.children;
            var arr = [];
            for (var i = 0;i < opts.length;i++) {
                if (opts[i].selected === true) {
                    arr.push(opts[i]);
                }
            }
            for (var j = 0;j < arr.length ; j++) {
                choose.appendChild(arr[j]);
                arr[j].selected = false;
            }
        };
        //添加btn4单选的点击事件
        btn4.onclick = function () {
            var opts = choose.children;
            var arr = [];
            for (var i = 0;i < opts.length;i++) {
                if (opts[i].selected === true) {
                    arr.push(opts[i]);
                }
            }
            for (var j = 0;j < arr.length ; j++) {
                all.appendChild(arr[j]);
                arr[j].selected = false;
            }
        };
    </script>
</body>
</html>

总结

这部分学习了节点的各种操作方法,创建节点、添加节点、删除、替换、插入、克隆节点等操作,还学习了怎么样获取父子级和兄弟级的节点,以及如何判断有无子节点。坚持学习前端~
在这里插入图片描述

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值