老师,有两个问题..

老师,有两个问题..

<!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 change(){

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

var lis=document.querySelectorAll("li");

for(var i=0;i<lis.length;i++){

if(i>=3){

return;

}

lis[i].onmouseover=function(){

this.style.backgroundColor="blue";

}

lis[i].onmouseout=function(){

this.style.backgroundColor="pink";

}

}

}

change();

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

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

add.onclick=function(){

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

var len=ul.children.length;

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

var txt=document.createTextNode("我是li"+(len+1));

newLi.appendChild(txt);

list.appendChild(newLi);

change();

}

remove.onclick=function(){

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

var len=ul.children.length;

if(len==0){

return;

}

list.removeChild(list.lastChild);

ul.removeChild(ul.lastChild);

}

</script>

</body>

</html>

这个在删除的时候会出现bug,先点击之后添加了节点,然后去删除的时候有时候会把ul的文本也删了,有时候没删除,为什么呢?

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

这里第二个if判断的是ul的文本节点吗?

正在回答

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

3回答

1、第二个if意思是判断三个li后面跟的文本节点,有的话就删除,理解的是正确的。

2、chirden不会获取自己的文本节点,只获取它的子元素。理解的是正确的,主要就是两个属性的区别:

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

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

children只获取元素节点,不包括文本节点,所有在判断是否有元素节点的时候,直接判断是否与0相等就可以:

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

自己可以测试理解下。

好帮手慕星星 2018-11-26 18:49:06

就按照上面的方式,直接判断是否有文本节点就可以了:

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

有文本节点的时候再删除两次。

自己可以测试下。

  • 提问者 沧海的雨季 #1
    这里第二个if意思是判断三个li后面跟的文本节点,有的话就删除,是这么理解么? 第一个判断的是li长度为0才返回,最后不是还有"我是ul"这个文本节点么?照理说应该长度为1才不会删除这个节点吧?chirden不会获取自己的文本节点,只获取它的子元素?
    2018-11-26 19:30:49
好帮手慕星星 2018-11-26 09:57:05

1、经测试点击添加之后再删除就有问题了,是因为开始三个li元素存在的时候,还有文本节点,在这也就是换行符,所以移除两次lastChild才会删除一个li元素,但是添加的内容是没有文本节点的,也就是没有换行符,所以删除一次就可以把li元素去掉:

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

删除两次就是点击一次去掉两个,len的值就会有错误,因为是先判断再移除的,所以会出现最后把ul也删除掉的问题,自己可以在控制台输出len的值看看。

2、是的,nodeType的值为3的时候,判断的就是文本节点,自己可以修改试试看。

祝学习愉快!


  • 提问者 沧海的雨季 #1
    老师,这个正确的代码是如何来写的呢?
    2018-11-26 18:43:28
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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