DOM对象之节点操作(2)

一、删除节点

node.removeChild(child)

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

 

<!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>
    <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)
        //3.点击按钮一次删除里面的孩子
        btn.onclick=function(){
            if(ul.children.length==0){
                this.disabled=true;
            }else{
                ul.removeChild(ul.children[0]);
            }
        }
    </script>
</body>
</html>

 

二、案例1:删除留言版

案例分析:

  1. 当我们把文本域里面的值赋值给li 的时候,多添加一个删除的链接
  2. 需要把所有的链接获取过来,当我们点击当前的链接的时候,删除当前链接所在的li
  3. 阻止链接跳转需要添加 javascript:void(0); 或者  javascript:;
​
<!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>留言板</title>
    <style>
         * {
            margin: 0;
            padding: 0;
        }
        
        body {
            padding: 100px;
        }
        
        textarea {
            width: 200px;
            height: 100px;
            border: 1px solid pink;
            outline: none;
            resize: none;
        }
        
        ul {
            margin-top: 50px;
        }
        
        li {
            width: 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>
        var btn=document.querySelector('button');
        var text=document.querySelector('textarea');
        var ul=document.querySelector('ul');
        btn.onclick=function(){
            if(text.value==''){
                alert('请输入内容');
                return false;
            }else{
            //(1)创建节点
            var li=document.createElement('li');
            li.innerText=text.value+"<a href='javascript:;'>删除</a>";
            //href=javascript:;阻止跳转
            //(2)添加节点
        //    ul.appendChild(li);
              ul.insertBefore(li,ul.children[0]);
              //删除元素  删除的是当前链接的li 它的父亲
              var as=document.querySelectorAll('a');
              for(var i=0;i<as.length;i++){
                  as[i].onclick=function(){
                      //删除当前a所在的li
                      ul.removeChild(this.parentNode);
                  }
              }
            }
            


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

​

 

 

 

三、复制节点

node.cloneNode() 

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

 注意:

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

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

<!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>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
    <script>
        var ul=document.querySelector('ul');
        //1.复制节点 node.cloneNode 括号为空或者里面是false 浅拷贝 
        var lili=ul.children[0].cloneNode(true);  //深拷贝
        ul.appendChild(lili);
        


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

 

 

四、案例2:动态生成表格

  • 因为里面的学生数据都是动态的,我们需要js 动态生成。 这里我们模拟数据,自己定义好数据。 数据我们采取对象形式存储。
  • 所有的数据都是放到tbody里面的行里面。
  • 因为行很多,我们需要循环创建多个行(对应多少人)
  • 每个行里面又有很多单元格(对应里面的数据),我们还继续使用循环创建多个单元格,并且把数据存入里面(双重for循环)
  • 最后一列单元格是删除,需要单独创建单元格。
  • 最后添加删除操作,单击删除,可以删除当前行。
<!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 {
            width: 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:97
        },{
            name:'米业',
            subject:'JavaScript',
            score:96
        },{
            name:'小伙',
            subject:'JavaScript',
            score:89
        }]
        // 2. 往tbody 里面创建行: 有几个人(通过数组的长度)我们就创建几行
        var tbody=document.querySelector('tbody');
        for(var i=0;i<datas.length;i++){
            //创建节点
            var tr=document.createElement('tr');
            //添加节点
            tbody.appendChild(tr);
            //行里面创建几个单元格 td 
            for(var k in datas[i]){
                //创建几个单元格
                var td=document.createElement('td');
                //把对象里的属性值 给 td
                //console.log(data[i][k]);
                td.innerHTML=datas[i][k];
                tr.appendChild(td);

            }
            //创建有删除两个字的单元格
            var td=document.createElement('td');
            td.innerText='<a href="javascript:;">删除</a>';
            tr.appendChild(td);

            // for(var i in obj){
            //     i:属性名
            //     obj[i]:属性值
            // }
            
            //获取a标签元素
            var as=document.getElementsByTagName('a');
            for(var i=0;i<as.length;i++){
                as[i].onclick=function(){
                    tbody.removeChild(this.parentNode.parentNode);
                }
            }
        }
    </script>
</body>
</html>

 

 

五、三种动态创建数组的区别

 

    document.write()

    element.innerHTML

    document.createElement()

    区别:

  1.   document.write 是直接将内容写入页面的内容流,但是文档流执行完毕,则它会导致页面全部重绘

   2. innerHTML 是将内容写入某个 DOM 节点,不会导致页面全部重绘

   3. innerHTML 创建多个元素效率更高(不要拼接字符串,采取数组形式拼接),结构稍微复杂

   4. createElement() 创建多个元素效率稍低一点点,但是结构更清晰

   总结:不同浏览器下,innerHTML 效率要比 creatElement 高

<!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>
    <button>点击</button>
    <p>abc</p>
    <script>
        window.onload=function(){
            document.write('<div>123</div>');
        }
        //三种创建元素方式区别
        //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>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值