关于删除最后一子节的问题
<!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就没这个问题
正在回答
同学你好,可以通过打印看下:
多出来的节点,有ul和li标签之间的文字:
也有li和li、ul和li之间的换行。
祝学习愉快~
同学你好,问题解答如下:
1.ul.remove(ul.childNodes[li.length]);中remove不对,应该改为removeChild。
2.因为childNodes表示子节点,子节点包含元素节点,同时也包含文本节点。可以使用console.log(ul.childNodes)直接输出一下:
节点索引从0开始,所以索引为3的子节点是倒数第二个li。同学可以测试一下,当删除倒数第二个子节点时,再次点击,任何一个li都没有删除,因为此时索引为3的子节点是一个文本节点。所以使用ul.removeChild(ul.childNodes[li.length]);是不对的。
3.lastChild也是包含文本节点的,同学可以测试一下 ,先点击一次删除,此时没有任何li被删除。需要再点击一次才可以。因为第一次点击时,最后一个子节点是文本。
4.这里应该使用lastElementChild,即最后一个元素节点,这样不包含文本节点,就能正常删除了。
如果我的回答帮助到了你,欢迎采纳,祝学习愉快~
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星