web前端练习26----Dom2,节点的 创建添加,删除,替换,克隆,innerHTML,innerText,显示隐藏及练习

Posted zhaihaohao1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了web前端练习26----Dom2,节点的 创建添加,删除,替换,克隆,innerHTML,innerText,显示隐藏及练习相关的知识,希望对你有一定的参考价值。

下面以这个 html 作为例子 操作:

    <!--节点的 创建添加,删除,替换,克隆 -->
    <div>这是几个人</div>
    <ul id="peopleUl" name='ulName'>
        <li id="lip1" type="text">刘备</li>
        <li>关羽</li>
        <li>张飞</li>
    </ul>
    <div>这是几个动物</div>
    <ul id="animalUl">
        <li id="liA1">猪</li>
        <li>狗</li>
        <li>牛</li>
    </ul>
    <button id="buttonAdd">添加子节点</button></br>
    <button id="buttonChaRu">插入子节点</button></br>
    <button id="buttonDel">删除子节点</button></br>
    <button id="buttonTiHuan">替换子节点</button></br>
    <button id="buttonKeLong">克隆节点</button></br>
    <button id="buttonInnerHTML">innerHTML</button></br>
    <button id="buttonInnerText">innerText</button></br>

一、添加子节点:

1、添加子节点

创建并添加子节点,是添加到末尾

创建节点

let liNode = document.createElement('li');

添加子节点

ulNode.appendChild(liNode);

        

            let buttonAdd = document.getElementById('buttonAdd');
            buttonAdd.onclick = function () 
                // 创建一个li节点,并添加文本和属性
                let liNode = document.createElement('li');
                liNode.innerText = '创建的新节点';
                liNode.type = 'zhh';

                let peopleUl = document.getElementById('peopleUl');
                peopleUl.appendChild(liNode);
            
        

2、插入子节点

把给定节点插到子节点的前面

除了插入之外,还有移动功能

把 zhu 插到 liubei 前面

peopleUl.insertBefore(zhu, liubei);

        
            let buttonChaRu = document.getElementById('buttonChaRu');
            buttonChaRu.onclick = function () 
                // 拿到ul节点
                let peopleUl = document.getElementById('peopleUl');
                // 拿到刘备节点
                let liubei = peopleUl.getElementsByTagName('li')[0];

                // 拿到 猪 的节点
                let zhu = document.getElementById('liA1');
                // 把 zhu 插到 liubei 前面
                peopleUl.insertBefore(zhu, liubei);
            

        

二、删除子节点

ulNode.removeChild(bjNode);

        
            let buttonDel = document.getElementById('buttonDel');
            buttonDel.onclick = function () 

                // 拿到刘备节点
                let lbNode = document.getElementById('lip1');
                // 拿到刘备节点的父节点
                let ulNode = lbNode.parentElement;
                // 删除子节点
                ulNode.removeChild(lbNode);
            
        

三、替换子节点

replaceChild 把父元素里面的子节点替换为另外一个节点

        
            
            let buttonTiHuan = document.getElementById('buttonTiHuan');
            buttonTiHuan.onclick = function () 

                let zhu = document.getElementById('liA1');
                // 替换
                // 拿到被替换的节点
                let liubei = document.getElementById('lip1');
                // 拿到父节点,把刘备替换成猪
                let liubeiParent = liubei.parentElement;
                liubeiParent.replaceChild(zhu, liubei);
            
        

四、克隆节点

Node.cloneNode(true) 方法返回调用该方法的节点的一个副本.

点击事件克隆不了,要手动赋值

        
            let buttonKeLong = document.getElementById('buttonKeLong');
            buttonKeLong.onclick = function () 
                let li = document.getElementById('lip1');
                let cloneLi = li.cloneNode(true);
                console.log(cloneLi);
            

        

五、innerHTML 和 innerText

对象.innerHTML拿到里面的子标签,是一个字符串类型。可以查找,修改,增加,删除

对象.innerText 拿到标签里面的文本,是一个字符串类型。可以查找,可以修改

        
            let buttonInnerHTML = document.getElementById('buttonInnerHTML');
            buttonInnerHTML.onclick = function() 
                // 对象.innerHTML拿到里面的子标签,是一个字符串类型
                // 可以查找,可以修改

                let people = document.getElementById('peopleUl');
                // 查找标签
                console.log(people.innerHTML);
                // 修改标签
                people.innerHTML = '<li>猪</li>';
                // 增加标签
                people.innerHTML = people.innerHTML + '<li>狗</li>';
                // 删除标签
                people.innerHTML = '';

            

            let buttonInnerText = document.getElementById('buttonInnerText');
            buttonInnerText.onclick = function() 
                let people = document.getElementById('peopleUl');
                let zhu = people.getElementsByTagName('li')[0];
                // 对象.innerText 拿到标签里面的文本,是一个字符串类型
                // 查找文本
                console.log(zhu.innerText);
                // 修改文本
                zhu.innerText = '狗';

            

        

六、元素的显示隐藏

https://www.cnblogs.com/chenlimei/p/11134358.html

练习

案例1插入节点练习

js自带的函数中是有 insertBefore();从子元素的前面插入一个元素,没有从子元素的后面插入的函数,
我们可以自己定义一个insertAfter();从子元素的后面插入一个元素的函数
具体实现如下:

<!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>
</head>

<body>
     <!-- 把给定节点插到子节点的后面 -->
    <ul id="idPeople">
        <li id="liubei">刘备</li>
        <li>关羽</li>
        <li id="zhangfei">张飞</li>
    </ul>

    <ul>
        <li id="idZhu">猪</li>
        <li>狗</li>
        <li>牛</li>
    </ul>
    <button id="charu">插入节点</button>


    <script>
       let charu = document.getElementById('charu');

       charu.onclick = function()
        let zhu = document.getElementById('idZhu');
        let liubei = document.getElementById('liubei');
        // 把 猪 插到 刘备 的后面
        afterInsterNode(zhu,liubei);

       
     

        // 自定义把给定节点,插入到子节点的后面
        function afterInsterNode(newNode, selfNode) 
            // 拿到person节点
            let ulPeople = selfNode.parentElement;
            let lis = ulPeople.getElementsByTagName('li');
            //拿到最后一个节点
            let li= lis[(lis.length-1)];
            
            if(selfNode == li)
                ulPeople.appendChild(newNode);
            else
                //拿到下一个兄弟节点
                let nextNode= selfNode.nextSibling;
                ulPeople.insertBefore(newNode,nextNode);
            
            
           

        


    </script>
</body>

</html>

 

案例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>
        table 
            border: 1px solid black;
            border-collapse: collapse;
            margin-top: 30px;
        
 
        th 
            border: 1px solid red;
        
 
        td 
            border: 1px solid blue;
        
    </style>
 
</head>
 
<body>
    <!-- 添加删除节点的练习 -->
    <div>员工信息</div>
    姓名:<input type="text" name="姓名" id="idName" placeholder="输入姓名" value="zhhhhhh">
    邮箱:<input type="text" name="邮箱" id="idEmail" placeholder="输入邮箱" value="584816642@qq.com">
    工资:<input type="text" name="工资" id="idGongzi" placeholder="输入工资" value="50000">
    <div><button id="idButton">提交员工信息</button></div>
    <table>
        <tbody id="idTbody">
            <!-- 第一行 -->
            <tr>
                <th>姓名</th>
                <th>邮箱</th>
                <th>工资</th>
                <th></th>
            </tr>
            <!-- 第二行 -->
            <tr>
                <td>zhhhhh</td>
                <td>58481662@qq.com</td>
                <td>50000</td>
                <td><a href="https://www.baidu.com/">删除</a></td>
            </tr>
            <!-- 第三行 -->
            <tr>
                <td>zhhhhh</td>
                <td>58481662@qq.com</td>
                <td>50000</td>
                <td><a href="https://www.baidu.com/">删除</a></td>
            </tr>
 
        </tbody>
    </table>
    <script>
        // js 逻辑先拿到三个输入框的对象
        // 拿到名称
        let nameEle = document.getElementById('idName');
        // 拿到邮箱
        let emailEle = document.getElementById('idEmail');
        // 拿到工资
        let gongziEle = document.getElementById('idGongzi');
        // 拿到提交按钮
        let buttonEle = document.getElementById('idButton');
        // 拿到表内容的 idTbody
        let tbodyEle = document.getElementById('idTbody');
 
 
 
 
        // 拿到里面的值
        buttonEle.onclick = function () 
            let nameValue = nameEle.value;
            let emailValue = emailEle.value;
            let gongziValue = gongziEle.value;
            // 创建tr标签
            let tr = document.createElement('tr');
            // 创建4个td标签
            let td1 = document.createElement('td');
            td1.innerText = nameValue;
 
            let td2 = document.createElement('td');
            td2.innerText = emailValue;
 
            let td3 = document.createElement('td');
            td3.innerText = gongziValue;
 
            // 添加一个删除
            let td4 = document.createElement('td');
            let a = document.createElement('a');
            a.href = 'https://www.baidu.com/';
            a.innerText = '删除';
            td4.appendChild(a);
 
            tr.appendChild(td1);
            tr.appendChild(td2);
            tr.appendChild(td3);
            tr.appendChild(td4);
 
            tbodyEle.appendChild(tr);
            // 函数调用一下
            deleteRow();
        
        // 删除一行
        function deleteRow() 
            // 拿到所有的a链接
            let aArray = document.getElementsByTagName('a');
            // 循环 a 获得点击设置点击事件
            for (let i = 0; i < aArray.length; i++) 
                aArray[i].onclick = function () 
                    // 拿到表内容
                    let tbody = this.parentElement.parentElement.parentElement;
                    // 当前点击的那一行
                    let tr = this.parentElement.parentElement
                                      
                    let shanchu = confirm('真的要删除吗'+tr.innerText);
                    if (shanchu) 
                        tbody.removeChild(tr);
                    
                    // 取消默认行为,跳转
                    return false;
                    
                
            
        
 
 
 
 
 
 
 
 
 
    </script>
</body>
 
</html>

   

案例3替换和克隆的练习

写个例子,节点的互换
点击北京,北京和中国 两个节点互换
点击上海,上海和英国 两个节点互换
效果图如下:

<!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>
</head>

<body>
    <!-- 替换节点的练习 -->
    <div>你喜欢那个城市</div>
    <ul id="ulCity">
        <li id="bj">北京</li>
        <li>上海</li>
        <li>广州</li>
        <li>深圳</li>
    </ul>
    <div>你喜欢那个国家</div>
    <ul id="ulGuoJia">
        <li id="zg">中国</li>
        <li>英国</li>
        <li>德国</li>
        <li>法国</li>
    </ul>
    <script>
        let city = document.getElementById('ulCity');
        let citys = city.getElementsByTagName('li');

        let guojia = document.getElementById('ulGuoJia');
        let guojias = guojia.getElementsByTagName('li');


        for (let i = 0; i < citys.length; i++) 
            citys[i].onclick = function () 
                huhuan(citys[i], guojias[i]);
            
        

        for (let j = 0; j < guojias.length; j++) 
            guojias[j].onclick = function () 
                huhuan(citys[j], guojias[j]);
            

        


        function huhuan(bj, zg) 
            let chishiUl = bj.parentElement;
            let guojiaUl = zg.parentElement;
            // 克隆城市
            let zg2 = zg.cloneNode(true);
            zg2.onclick = zg.onclick;

            let bj2 = bj.cloneNode(true);
            bj2.onclick = bj.onclick;

            chishiUl.replaceChild(zg2, bj);
            guojiaUl.replaceChild(bj2, zg);

        



    </script>
</body>

</html>

案例4 左右联动

选择左边的省,右边对应选择省的城市

效果图:

代码如下:

<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>
</head>

<body>
    <select id="province"></select>
    <select id="city"></select>

    <script>
        // 造一组数据
        let data = [
            province: '陕西',
            citys: ['西安', '咸阳', '宝鸡', '商洛'],
        , 
            province: '江苏',
            citys: ['南京', '无锡', '徐州', '常州'],
        , 
            province: '甘肃',
            citys: ['天水', '白银', '平凉', '酒泉'],
        ];
        // 拿到节点
        // 拿到省的节点
        let provinceElement = document.getElementById('province');
        // 拿到市的节点
        let cityElement = document.getElementById('city');
        data.forEach(function(value, index) 
            //先把省显示出来
            let option = document.createElement('option');
            option.innerText = value.province;
            provinceElement.appendChild(option);

            if (value.province == '陕西') 
                // 拿到的省 默认陕西,城市默认陕西的城市
                let cityArray = value.citys;
                cityArray.forEach(function(value, index) 
                    let option = document.createElement('option');
                    option.innerHTML = value;
                    cityElement.appendChild(option);
                );
            
        );
        // 选择左边的省,对应右边的城市
        provinceElement.onchange = function() 
            let shengValue = provinceElement.options[provinceElement.selectedIndex].value;
            data.forEach(function(value, index) 
                if (value.province == shengValue) 
                    let cityArray = value.citys;
                    cityElement.innerHTML = '';
                    cityArray.forEach(function(value, index) 
                        let option = document.createElement('option');
                        option.innerHTML = value;
                        cityElement.appendChild(option);
                    );


                

            );

        
    </script>
</body>

</html>

案例5 购物车全选

全选,取消全选,所有的产品都选择,全选会选中

效果图:

代码如下:

<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>
</head>

<body>

    <label>选择商品:<input type="checkbox" id="isAll" />全选</label></br>
    <label><input type="checkbox" name="star" /> 衣服</label></br>
    <label><input type="checkbox" name="star" /> 电脑</label></br>
    <label><input type="checkbox" name="star" /> 手机</label></br>
    <label><input type="checkbox" name="star" /> 帽子</label></br>
    <label><input type="checkbox" name="star" /> 袜子</label></br>
    <script>
        let isAllElement = document.getElementById('isAll');
        // 拿到明星的集合
        let starCollection = document.getElementsByName('star');
        let starArray = [...starCollection];
        isAllElement.onclick = function() 
                let isChecked = isAllElement.checked;
                if (isChecked) 
                    // 全选
                    starArray.forEach(function(value, index) 
                        let inputElement = value;
                        inputElement.checked = true;
                    );

                 else 
                    // 全不选
                    starArray.forEach(function(value, index) 
                        let inputElement = value;
                        inputElement.checked = false;
                    );

                
            
            // 给明星选择框加点击事件
        starArray.forEach(function(value, index) 
            let inputElement = value;
            inputElement.onclick = function() 
                let count = 0;
                starArray.forEach(function(value, index) 
                    if (value.checked) 
                        count++;
                    
                );

                if (count == starArray.length) 
                    isAllElement.checked = true;
                 else 
                    isAllElement.checked = false;
                
            

        );
    </script>
</body>

</html>

案例6 改变图片练习:

需求:
点击按钮切换图片:

效果图:

实现思路:
1把图片路径放到一个数组中
2设置一个记录数组下标的变量
3点击按钮用数组的不同下标拿到不同的图片显示出来

实现代码如下:

<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">
    <meta content="width=device-width, initial-scale=1.0, user-scalable=no" name="viewport">
    <title>Document</title>
    <style>
        * 
            margin: 0px;
            padding: 0px;
        
        
        .root 
            display: flex;
            flex-direction: column;
            align-items: center;
            background-color: gold;
        
    </style>
</head>

<body>
    <div class="root">
        <p style="color:blue;" id="pid">说明</p>
        <img id="image" style="width: 200px; height: 300px;" src="images/1.jpg">
        <span>
            <button id="buttonLast">上一页</button>
            <button id="buttonNext">下一页</button>
        </span>
    </div>
    <script>
        // 开始写js完成图片切换
        let imgArray = [
            'https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=3191706504,3660193373&fm=26&gp=0.jpg',
            'https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=25834440,1968595786&fm=26&gp=0.jpg',
            'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2179462493,1065615808&fm=26&gp=0.jpg',
            'https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1738712335,2051263509&fm=26&gp=0.jpg',
            'https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=315442729,2232652672&fm=26&gp=0.jpg'
        ];
        // 图片节点对象
        let image = document.getElementById('image');
        image.src = imgArray[0];
        // 上一个按钮对象
        let buttonLast = document.getElementById('buttonLast');
        // 下一个按钮对象
        let buttonNext = document.getElementById('buttonNext');
        let pid = document.getElementById('pid');
        // 设置上面的标题
        pid.innerText = `一共有$imgArray.length张,现在是第1张`;
        // 设置一个变量,来记录数组中的下标
        let index = 0;
        // 上一个按钮
        buttonLast.onclick = function() 
                index--;
                if (index < 0) 
                    index = imgArray.length - 1;
                
                image.src = imgArray[index];
                pid.innerText = `一共有$imgArray.length张,现在是第$index+1张`;
            
            // 下一个按钮
        buttonNext.onclick = function() 
            index++;
            if (index > (imgArray.length - 1)) 
                index = 0;
            
            image.src = imgArray[index];
            pid.innerText = `一共有$imgArray.length张,现在是第$index+1张`;
        
    </script>



</body>

</html>

 

 

 

 

 

 

 

以上是关于web前端练习26----Dom2,节点的 创建添加,删除,替换,克隆,innerHTML,innerText,显示隐藏及练习的主要内容,如果未能解决你的问题,请参考以下文章

web前端练习25----Dom1,元素节点(自己,父节点,子节点,兄弟节点),属性节点,文本节点

好程序员web前端教程分享前端javascript练习题之promise

web前端练习24----es5,es6重要语法总结

web前端练习17----es6新语法4,数组,Set集合,Map集合

web前端练习22----js中的原型对象prototype,原型链(重要)

web前端分享:性能优化之文档碎片处理