这个正常添加后的li序号可以正常显示但是遇到原ul里面的文本节点序号显示就有问题了该怎么解决啊?

来源:7-2 编程练习

Horizn

2018-11-14 17:30:08

<!DOCTYPE html>

<html>


<head>

    <title></title>

    <style type="text/css">

    html,

    body {

        margin: 0;

        padding: 0;

    }


    div:not(:nth-of-type(2)) {

        width: 500px;

        height: 100%;

        background-color: #00c4ff7a;

        margin: 0 auto;

    }

    /*ul默认有外边距*/


    ul {

        width: 300px;

        height: 100%;

        background-color: #f9c3e6d6;

        list-style: none;

        /*清除默认边距*/

        margin: 0;

        padding: 0;

        margin: 20px auto;

        margin-bottom: 30px;

    }


    li {

        width: 200px;

        height: 30px;

        line-height: 30px;

        margin: 30px auto;

        background-color: #cdffc0;

    }

    </style>

</head>


<body>

    <div id="box">

        <button id="btnAdd">添加元素</button>

        <button id="btnRemove">删除元素</button>

        <ul id="list">我是ul

            <li>我是li1</li>

            <li>我是li2</li>

            <li>我是li3</li>

        </ul>

    </div>

    <script type="text/javascript">

    (function(){

      var btnAdd=document.getElementById("btnAdd");

      var btnRemove=document.getElementById("btnRemove");

      var ul=document.getElementById("list");

      var lis=ul.children;

      console.log(lis);

      var i=0;

      var j=0;

      for(i;i<lis.length;i++){

        lis[i].onmouseover=function(){

          this.style.backgroundColor="blue";

        };

        lis[i].onmouseout=function(){

          this.style.backgroundColor="pink";

        };

        btnAdd.onclick=function(){

          var newli=document.createElement("li");

              j=j+1;

              newli.innerHTML="我是li"+(i+j);

              ul.insertBefore(newli,null);

        };

        btnRemove.onclick=function(){

              j=0;

              if(i){

                i=lis.length;

              }

              else{i=0;}

              ul.removeChild(ul.lastChild);

        };

      };

    })();

    </script>

</body>

</html>


写回答

2回答

好帮手慕星星

2018-11-15

ul元素的子节点有7个,包括文本节点,ul.lastChild是最后一个文本节点,如下:

http://img.mukewang.com/climg/5becd4710001728203920052.jpg

http://img.mukewang.com/climg/5becd44500014ece05770092.jpg

所以点击移除按钮的时候,li元素不会移除,点击第二次才会。为了避免这种情况,无论是文本节点还是元素节点,都需要移除li,所以在文本节点时,相当于移除了两次,如下:

http://img.mukewang.com/climg/5becd5340001cfe104940158.jpg

自己可以再测试理解下。

1

好帮手慕星星

2018-11-14

建议将点击事件和移除事件从for循环中分离出来,每次增加或者是删除的时候,都需要重新获取li元素,因为html的结构是变化的。可以参考下面的建议:

http://img.mukewang.com/climg/5bebfdee00019b3107630472.jpg

http://img.mukewang.com/climg/5bebff4300015a0509810629.jpg

自己修改测试下,祝学习愉快!


0
horizn
h btnRemove的点击事件里面if(ul.lastChild.nodeType==3){ ul.removeChild(ul.lastchild)}这一句是当遇到文本节点时就多减了个这个节点,然后下面接着在移除其上的元素节点?还是怎么回事啊?这里有点不懂。
h018-11-14
共1条回复

0 学习 · 4826 问题

查看课程