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

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

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


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕星星 2018-11-15 10:09:04

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

http://img1.sycdn.imooc.com//climg/5becd4710001728203920052.jpg

http://img1.sycdn.imooc.com//climg/5becd44500014ece05770092.jpg

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

http://img1.sycdn.imooc.com//climg/5becd5340001cfe104940158.jpg

自己可以再测试理解下。

好帮手慕星星 2018-11-14 18:57:19

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

http://img1.sycdn.imooc.com//climg/5bebfdee00019b3107630472.jpg

http://img1.sycdn.imooc.com//climg/5bebff4300015a0509810629.jpg

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


  • 提问者 Horizn #1
    btnRemove的点击事件里面if(ul.lastChild.nodeType==3){ ul.removeChild(ul.lastchild)}这一句是当遇到文本节点时就多减了个这个节点,然后下面接着在移除其上的元素节点?还是怎么回事啊?这里有点不懂。
    2018-11-14 19:54:15
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
组件化思想开发电商网页 18版
  • 参与学习           人
  • 提交作业       467    份
  • 解答问题       4826    个

本路径带你通过系统学习HTML5、JavaScript、jQuery的进阶知识,不仅如此,还会学习如何利用组件化的思想来开发网页,知识点+案例,使得所学可以更好的得到实践。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师