为了账号安全,请及时绑定邮箱和手机立即绑定

看有的同学是正序循环的解法,求大佬解答

for(var i=0;i<content.childNodes.length;i++){
      if(content.childNodes[i].nodeType!=1){  
         continue; 
      }else{
         content.removeChild(content.childNodes[i]);   
      }
        
      }


这个试了下结果,没问题,不过有个地方想不明白,这个i<content.childNodes.length,这个 content.childNodes.length不是动态变化的吗,因为每次删除一个节点,这个content.childNodes.length就变小了,那岂不是没法遍历完所有的节点?比如有四个节点,i=0的时候,content.childNodes.length是4, i=1的时候,content.childNodes.length就是3了, i=2的时候,content.childNodes.length就是2了,循环就没了,最后的节点压根没遍历到呀。

正在回答

5 回答

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

      if(content.childNodes[i].nodeType!=1){

  document.write("当i为:"+i+"&nbsp;");

  document.write("长度为:"+content.childNodes.length+"<br>");

         continue;  

      }else{

         content.removeChild(content.childNodes[i]); 

document.write("当i为:"+i+"&nbsp;");

document.write("长度为:"+content.childNodes.length+"<br>"); 

      }

通过这样输出,你就可以看出长度是递减的,i是递增的,存在空白节点,删除一个元素节点,空白节点就会顶上位置。这里最后会留下空白节点(本身这里的if判断就把空白节点留下了)

1 回复 有任何疑惑可以回复我~
#1

LouisDuan

实现了,不知道科学不 function clearText() { var content=document.getElementById("content"); // 在此完成该函数 mylength=content.childNodes.length; for (var i=1; i<mylength; i++){ content.removeChild(content.childNodes[i]); }
2019-03-25 回复 有任何疑惑可以回复我~

可以判断数组长度,重置i=-1,确保再次循环i=0, 进而删除所有节点;

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

      content.removeChild(childNodes[i]);

      x=null;

      if(childNodes.length>0){

         // alert(i+"长度"+childNodes.length);

          i=-1;

      }


0 回复 有任何疑惑可以回复我~

实现了结果,不知道科学不科学

<!DOCTYPE HTML>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<title>无标题文档</title>

</head>


<body>

<div id="content">

  <h1>html</h1>

  <h1>php</h1>

  <h1>javascript</h1>

  <h1>jquery</h1>

  <h1>java</h1>

</div>


<script type="text/javascript">

function clearText() {

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

  // 在此完成该函数

  mylength=content.childNodes.length;

  for (var i=1; i<mylength; i++){

    content.removeChild(content.childNodes[i]);  

  }

  

}

</script>

<button onclick="clearText()">清除节点内容</button>

</body>

</html>


0 回复 有任何疑惑可以回复我~

你直接试试log就能看出来,如果没有前面的if条件,实际上是根本遍历不了所有节点的。如果我猜的没错的话,之所以能遍历,并不是因为i一直是0,而是有空节点,那个length会隔一次减1,不会一直减1.并且如果我这个题目要求的删除所有的子节点,包括空白节点,那这个答案就是错的。


0 回复 有任何疑惑可以回复我~
#1

DP_XL

题目要求的就是空白节点也一并删除,答案的思维很明确了,因为删除一次length就会变一次,所以选择逆序删除,从最后一个一直删除到第一个,答案的思路不一定是唯一解,但确实是可读性强、通用的编程思维,真正到职场上写这种乱七八糟的代码,接手项目的人看到都烦
2019-03-30 回复 有任何疑惑可以回复我~

i不会变,i始终是0  只有content.childNodes.length长度会变

0 回复 有任何疑惑可以回复我~
#1

慕神0996557 提问者

。。。i不会变?循环里面最后一个是i++,循环每走一次这个就会执行一次的啊。。怎么可能i一直是0
2019-03-14 回复 有任何疑惑可以回复我~
#2

阳火锅 回复 慕神0996557 提问者

你把循环理解错了。。 for(var i=0; i< 4 ;i++) 循环格式是这样没错吧。。 我们拆分来理解: i=0 代表从0开始,0只是一个开始条件。。 i<4这个代表循环的一个结束条件。。 i=0他走完循环始终会保持一个初始值进行++.. 意思就是当长度等于3,i还是从0开始加,长度等于2,i还是从0开始加。。 懂不
2019-03-14 回复 有任何疑惑可以回复我~
#3

慕神0996557 提问者 回复 阳火锅

不太懂,循环进行一次之后i不变为了i+1吗。
2019-03-14 回复 有任何疑惑可以回复我~
#4

阳火锅 回复 慕神0996557 提问者

如果初始值i=0 循环一次i+1,i<4 那你告诉我i是不是加到3就退出循环了。。 好那么如果i<3。。 那么i还是从0开始加到2。。 反正不管长度是多少,i始终只会从0开始加。。因为你一开始设定的就是0。。i自身不做累加
2019-03-15 回复 有任何疑惑可以回复我~
#5

慕神0996557 提问者 回复 阳火锅

大兄弟,很感谢你的回答。。不过我觉得你说的应该是错的。for循环一单进去之后,就只会开始进行i=i+1,然后再判断新的i是否满足条件,那个初始值是0,只会用第一次,你的意思我明白,你说的是,里面那个判断条件每次都变了,所以跟着循环也变了,又是从0开始加。我自己在谷歌控制台试了下,这里发不了图,看下面,直接log出i就看的出来
2019-03-15 回复 有任何疑惑可以回复我~
#6

DP_XL 回复 阳火锅

你怕是对for循环本身就有什么误解吧?i=0只会执行一次,而且是在for循环开始的时候执行,然后进行判断,如果判断成功就执行循环代码,然后i++,然后再执行判断,我虽然不是很懂JS,但是在c,c++,java里面都是这样,我并不觉得js会独特对一模一样的写法有不同的解释
2019-03-30 回复 有任何疑惑可以回复我~
#7

神志不清H

i会变的吧,每删除一个节点length都会-1,i会+1吧我认为
2019-04-03 回复 有任何疑惑可以回复我~
查看4条回复

举报

0/150
提交
取消
JavaScript进阶篇
  • 参与学习       468046    人
  • 解答问题       21891    个

本课程从如何插入JS代码开始,带您进入网页动态交互世界

进入课程

看有的同学是正序循环的解法,求大佬解答

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信