zoukankan      html  css  js  c++  java
  • 0166 DOM 之 节点操作: 删除节点,删除留言案例,复制(克隆)节点,动态生成表格案例,创建元素的三种方式,innerHTML和createElement效率对比

    1.1.1 删除节点

    node.removeChild(child)  // 此处的node指 父节点
    node.removeChild() 方法: 从 node节点中删除一个子节点,返回删除的节点。
    
    【补充】 remove()方法可以直接删除指定的元素。
    that.lis[index].remove();
    that.sections[index].remove();
    
        <button>删除</button>
        <ul>
            <li>熊大</li>
            <li>熊二</li>
            <li>光头强</li>
        </ul>
        <script>
            // 1.获取元素
            var ul = document.querySelector('ul');
            var btn = document.querySelector('button');
            // 2. 删除元素  node.removeChild(child)
            // ul.removeChild(ul.children[0]);
            // 3. 点击按钮依次删除里面的孩子
            btn.onclick = function() {
                if (ul.children.length == 0) {
                    this.disabled = true;
                } else {
                    ul.removeChild(ul.children[0]);
                }
            }
        </script>
    

    1.1.2 案例:删除留言

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>
            * {
                margin: 0;
                padding: 0;
            }
            
            body {
                padding: 100px;
            }
            
            textarea {
                 200px;
                height: 100px;
                border: 1px solid pink;
                outline: none;
                resize: none;
            }
            
            ul {
                margin-top: 50px;
            }
            
            li {
                 300px;
                padding: 5px;
                background-color: rgb(245, 209, 243);
                color: red;
                font-size: 14px;
                margin: 15px 0;
            }
            
            li a {
                float: right;
            }
        </style>
    </head>
    
    <body>
        <textarea name="" id=""></textarea>
        <button>发布</button>
        <ul>
    
        </ul>
        <script>
            // 1. 获取元素
            var btn = document.querySelector('button');
            var text = document.querySelector('textarea');
            var ul = document.querySelector('ul');
            // 2. 注册事件
            btn.onclick = function() {
                if (text.value == '') {
                    alert('您没有输入内容');
                    return false;
                } else {
                    // console.log(text.value);
                    // (1) 创建元素
                    var li = document.createElement('li');
                    // 先有li 才能赋值
                    li.innerHTML = text.value + "<a href='javascript:;'>删除</a>";
                    text.value = '';
                    // (2) 添加元素
                    // ul.appendChild(li);
                    ul.insertBefore(li, ul.children[0]);
                    // (3) 删除元素 删除的是当前链接的li  它的父亲
                    var as = document.querySelectorAll('a');
                    for (var i = 0; i < as.length; i++) {
                        as[i].onclick = function() {
                            // node.removeChild(child); 删除的是 li 当前a所在的li  this.parentNode;
                            ul.removeChild(this.parentNode);
                        }
                    }
                }
            }
        </script>
    </body>
    
    </html>
    

    1.1.3 复制(克隆)节点

    node.cloneNode()
    node.cloneNode()方法; 返回调用该方法的节点的一个副本,也称为克隆节点/拷贝节点。
    
    注意:
    1. 如果括号参数为空或者为 false ,则是浅拷贝,即只克隆复制节点本身,不克隆里面的子节点。
    2. 如果括号参数为 true ,则是深度拷贝,会复制节点本身以及里面所有的子节点。
    
        <ul>
            <li>1111</li>
            <li>2</li>
            <li>3</li>
        </ul>
        <script>
            var ul = document.querySelector('ul');
            // 1. node.cloneNode(); 括号为空或者里面是false 浅拷贝 只复制标签不复制里面的内容
            // 2. node.cloneNode(true); 括号为true 深拷贝 复制标签复制里面的内容
            var lili = ul.children[0].cloneNode(true);
            ul.appendChild(lili);
        </script>
    

    1.1.4 案例:动态生成表格

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>
            table {
                 500px;
                margin: 100px auto;
                border-collapse: collapse;
                text-align: center;
            }
            
            td,
            th {
                border: 1px solid #333;
            }
            
            thead tr {
                height: 40px;
                background-color: #ccc;
            }
        </style>
    </head>
    
    <body>
        <table cellspacing="0">
            <thead>
                <tr>
                    <th>姓名</th>
                    <th>科目</th>
                    <th>成绩</th>
                    <th>操作</th>
                </tr>
            </thead>
            <tbody></tbody>
        </table>
        <script>
            // 1.先去准备好学生的数据
            var datas = [{
                name: '魏璎珞',
                subject: 'JavaScript',
                score: 100
            }, {
                name: '弘历',
                subject: 'JavaScript',
                score: 98
            }, {
                name: '傅恒',
                subject: 'JavaScript',
                score: 99
            }, {
                name: '明玉',
                subject: 'JavaScript',
                score: 88
            }, {
                name: '大猪蹄子',
                subject: 'JavaScript',
                score: 0
            }];
    
            // 2. 往tbody 里面创建行: 有几个人(通过数组的长度)我们就创建几行
            var tbody = document.querySelector('tbody');
            for (var i = 0; i < datas.length; i++) { // 外面的for循环管行 tr
                // 1. 创建 tr行
                var tr = document.createElement('tr');
                tbody.appendChild(tr);
    
                // 2. 行里面创建单元格(跟数据有关系的3个单元格) td 单元格的数量取决于每个对象里面的属性个数  for循环遍历对象 datas[i]
                for (var k in datas[i]) { // 里面的for循环管列 td
                    // 创建单元格 
                    var td = document.createElement('td');
                    // 把对象里面的属性值 datas[i][k] 给 td  
                    // console.log(datas[i][k]);
                    td.innerHTML = datas[i][k];
                    tr.appendChild(td);
                }
    
                // 3. 创建有删除2个字的单元格 
                var td = document.createElement('td');
                td.innerHTML = '<a href="javascript:;">删除 </a>';
                tr.appendChild(td);
            }
    
            // 4. 删除操作 开始 
            var as = document.querySelectorAll('a');
            for (var i = 0; i < as.length; i++) {
                as[i].onclick = function() {
                    // 点击a 删除 当前a 所在的行(链接的爸爸的爸爸)  node.removeChild(child)  
                    tbody.removeChild(this.parentNode.parentNode)
                }
            }
            // for(var k in obj) {
            //     k 得到的是属性名
            //     obj[k] 得到是属性值
            // }
        </script>
    </body>
    
    </html>
    

    1.1.5 创建元素的三种方式

        <script>
            // 三种创建元素方式区别 
            // 1. document.write() 创建元素  如果页面文档流加载完毕,再调用这句话会导致页面重绘
             var btn = document.querySelector('button');
             btn.onclick = function() {
                 document.write('<div>123</div>');
             }
    
            // 2. innerHTML 创建元素
            var inner = document.querySelector('.inner');
             for (var i = 0; i <= 100; i++) {
                 inner.innerHTML += '<a href="#">百度</a>'
             }
            var arr = [];
            for (var i = 0; i <= 100; i++) {
                arr.push('<a href="#">百度</a>');
            }
            inner.innerHTML = arr.join('');
            // 3. document.createElement() 创建元素
            var create = document.querySelector('.create');
            for (var i = 0; i <= 100; i++) {
                var a = document.createElement('a');
                create.appendChild(a);
            }
        </script>
    

    1.1.6 innerTHML和createElement效率对比

    innerHTML字符串拼接方式(效率低)

    <script>
        function fn() {
            var d1 = +new Date();
            var str = '';
            for (var i = 0; i < 1000; i++) {
                document.body.innerHTML += '<div style="100px; height:2px; border:1px solid blue;"></div>';
            }
            var d2 = +new Date();
            console.log(d2 - d1);
        }
        fn();
    </script>
    

    createElement方式(效率一般)

    <script>
        function fn() {
            var d1 = +new Date();
    
            for (var i = 0; i < 1000; i++) {
                var div = document.createElement('div');
                div.style.width = '100px';
                div.style.height = '2px';
                div.style.border = '1px solid red';
                document.body.appendChild(div);
            }
            var d2 = +new Date();
            console.log(d2 - d1);
        }
        fn();
    </script>
    

    innerHTML数组方式(效率高)

    <script>
        function fn() {
            var d1 = +new Date();
            var array = [];
            for (var i = 0; i < 1000; i++) {
                array.push('<div style="100px; height:2px; border:1px solid blue;"></div>');
            }
            document.body.innerHTML = array.join('');
            var d2 = +new Date();
            console.log(d2 - d1);
        }
        fn();
    </script>
    
  • 相关阅读:
    jquery选择器[转]
    asp.net调用exe并传递参数然后关闭exe[转]
    JS操作JSON总结[转]
    Newtonsoft.Json序列化和反序列[转]
    jQuery EasyUI自定义DataGrid的Editor【转】
    【转】jquery easy UI datagrid新增一行,columns中editor下拉框之间的联动。
    jquery 表单序列化 转换json
    Jquery组合form元素为json格式,asp.net反序列化[转]
    什么是BOM头,及PHP解决办法
    PHP中去除字符串中的换行的方法
  • 原文地址:https://www.cnblogs.com/jianjie/p/12174451.html
Copyright © 2011-2022 走看看