关于删除最后一子节的问题

关于删除最后一子节的问题

<!DOCTYPE html>

<html>


<head>

    <title></title>

    <style type="text/css">

    html,

    body {

        margin: 0;

        padding: 0;

    }


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

        width: 800px;

        height: 100%;

        background-color: #a0e4ff;

        margin: 0 auto;

        

    }

    /*ul默认有外边距*/


    ul {

        width: 300px;

        height: 100%;

        background-color: #ecc7ea;

        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>我是li2lastElementChild</li>

            <li>我是li3childNodes[li.length]</li>

            

        </ul>

    </div>

    <script type="text/javascript">

    //此处填写代码

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

    var li = ul.getElementsByTagName("li");

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

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

    btnAdd.onclick = function(){

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

        var num = li.length++;

        var newtext = document.createTextNode("我是li"+(num+1));

        newli.appendChild(newtext);

        ul.appendChild(newli);

    }

    btnRemove.onclick = function(){

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

        var li = ul.getElementsByTagName("li");

        ul.removeChild(ul.lastChild);

    }

    </script>

</body>

</html>

老师好,我这里的想法是ul.remove(ul.childNodes[li.length]);按道理思路是没错的吧,可是实际运行确实删除了倒数第二个,只有完全删除了li后面重新加li后,才能正常实现删除最后一个的功能,这是为什么?这个方法和.lastchild差在了哪里,为什么.lastchild就没这个问题

正在回答

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

2回答

同学你好,可以通过打印看下:

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

多出来的节点,有ul和li标签之间的文字:

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

也有li和li、ul和li之间的换行。

祝学习愉快~

好帮手慕夭夭 2020-04-02 19:04:31

同学你好,问题解答如下:

1.ul.remove(ul.childNodes[li.length]);中remove不对,应该改为removeChild。

2.因为childNodes表示子节点,子节点包含元素节点,同时也包含文本节点。可以使用console.log(ul.childNodes)直接输出一下:

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

节点索引从0开始,所以索引为3的子节点是倒数第二个li。同学可以测试一下,当删除倒数第二个子节点时,再次点击,任何一个li都没有删除,因为此时索引为3的子节点是一个文本节点。所以使用ul.removeChild(ul.childNodes[li.length]);是不对的。

3.lastChild也是包含文本节点的,同学可以测试一下 ,先点击一次删除,此时没有任何li被删除。需要再点击一次才可以。因为第一次点击时,最后一个子节点是文本。

4.这里应该使用lastElementChild,即最后一个元素节点,这样不包含文本节点,就能正常删除了。

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

如果我的回答帮助到了你,欢迎采纳,祝学习愉快~

  • 提问者 慕雪9296518 #1
    谢谢老师,回复的很详细,我想再问个问题,就是这里的多出来文本节点是指的li之间的换行和ul和li之间的换行吗?还是指的li中的文本
    2020-04-03 09:12:22
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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