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

怎么点击第一下没有反应,然后再点击一下删除了3个,然后再点击依次删除一个

<!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");

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

  {

      var x=content.removeChild(content.childNodes[i]);

      x=null;

  }

}

</script>

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


正在回答

48 回答

自己编就想不到这么多==

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

唔,我也遇到这个问题,看到结尾,我懂了,谢谢。

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

有意思,子节点数组的长度是动态变化的,那看来DOM操作很耗内存资源吧?

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

这段代码是个变值,没循环一次,都会-1

content.childNodes.length


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

该任务,要注意一些问题

1. 浏览器兼容问题。

<div id="content">
  <h1>html</h1>
  <h1>php</h1>
  <h1>javascript</h1>
  <h1>jquery</h1>
  <h1>java</h1>
</div>

content孩子节点:

ie下是5个节点,chrome等浏览器是11个节点(因为出现了空白节点,如忘记了可以看看9-11节)。

2. 不管你使用正序还是倒序删除节点,要注意在删除节点同时,content孩子节点的个数和位置也在变化。所以最好删除时正序总删除第一个,倒序总删除最后一个。

3.  可以使用for或while 循环,使用for循环时注意。

function clearText() {
  var content=document.getElementById("content");
  for(i=0;i<content.childNodes.length;i++)
  {
      var x=content.removeChild(content.childNodes[i]);
  }
}

不要把i<content.childNodes.length做为判断条件,举例说明,IE下执行,节点个数5个,当我点一次删除按钮。

注意:5个节点分别对应下标是从0开始:    1[0]         2[0]         3[0]           4[0]          5[0] 

i=0     content.childNodes.length=5      0<5  删除第一个节点后,继续循环

i=1     content.childNodes.length=4      1<4   删除第二个节点后,继续循环

i=2     content.childNodes.length=3       2<3   删除第三个节点后,继续循环

i=3   content.childNodes.length=2          3<2  不成立,所以不继续。

这也就是为什么一次删除不了所以节点。

可以把上面的代码修改下:

 function clearText() {  

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

  nodel=content.childNodes.length

  for(i=0;i<nodel;i++)  {  

      var x=content.removeChild(content.childNodes[0]);  }

   }

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

WingMeng

看过后思路顿然明朗,腰不酸了,腿不痛了,coding也有劲了
2014-12-06 回复 有任何疑惑可以回复我~
#2

柳树

解释的赞,清晰明了。
2014-12-20 回复 有任何疑惑可以回复我~
#3

折叠幸福

老师 帮忙看下为什么这么写没反应 function clearText() { var content=document.getElementById("content"); // 在此完成该函数 for(var i=content.childNodes.length;i<1;i--){ var x=content.removeChild(content.childNodes[i-1]);
2014-12-30 回复 有任何疑惑可以回复我~
#4

pangqianyi 回复 折叠幸福

循环的一开始就没满足条件,i<1 改为 i> =0;还有就是i 的赋值在循环的时候是已经给定了,不会经过.length去返回了,这是for 语句循环的步骤
2015-01-02 回复 有任何疑惑可以回复我~
#5

M_S

醍醐灌顶
2015-01-16 回复 有任何疑惑可以回复我~
#6

zhangxinxin

老师分析的好透彻,完全就知道我们在哪里阵亡
2015-01-16 回复 有任何疑惑可以回复我~
#7

网页设计学习者

回答得太棒了。
2015-01-22 回复 有任何疑惑可以回复我~
#8

maccine

老师,为什么不要把i<content.childNodes.length做为判断条件啊?
2015-02-06 回复 有任何疑惑可以回复我~
#9

ice_camel

赞,想通了! 另外请问下删除返回值可以不赋值吗?直接content.removeChild(content.childNode[0]); 会不会有什么副作用?
2015-03-27 回复 有任何疑惑可以回复我~
#10

马小骏mz

理解了,谢谢老师。
2015-04-10 回复 有任何疑惑可以回复我~
#11

你们城里人真会玩

老师太吊了
2015-05-22 回复 有任何疑惑可以回复我~
#12

voice 回复 折叠幸福

for 里面的循环顺序错了
2015-05-30 回复 有任何疑惑可以回复我~
#13

慕的地8442182 回复 折叠幸福

var i=content.childNodes.length;i<1;i--循环条件不对吧?尤其是第二个条件
2015-06-18 回复 有任何疑惑可以回复我~
#14

qq_芒果加冰_0

可是for(i=0;i<nodel;i++) { var x=content.removeChild(content.childNodes[0]); } }为什么循环的数组是content.childNodes[0]而不是content.childNodes[i]
2015-07-14 回复 有任何疑惑可以回复我~
#15

朝夕v8 回复 qq_芒果加冰_0

意思就是这个循环执行时,每次都是删除div下第一个子节点。
2015-07-17 回复 有任何疑惑可以回复我~
#16

superli18

你那里改过以后将nodel=content.childNodes.length for(i=0;i<nodel;i++) 。。。。。。。 不把content.childNodes的长度不放在循环中,是一直将他的长度不变是吗?
2015-08-25 回复 有任何疑惑可以回复我~
#17

dingxin

为什么把老师写的代码复制过去点击一下就全部删除了
2015-08-29 回复 有任何疑惑可以回复我~
#18

零下的夏天 回复 superli18

console了一下,是nodel的长度一直没变
2015-09-19 回复 有任何疑惑可以回复我~
#19

再去西藏 回复 qq_芒果加冰_0

0代表数组中的第一个元素, 每次删掉一个第二个元素就成了数组中的第一个,如果用i就会出现老师举例的情况,就是当i=3,数组长度为二了,这样就执行不下去了。 我这么说能理解吗
2015-09-28 回复 有任何疑惑可以回复我~
#20

雨丶辰 回复 折叠幸福

循环变量i的判断条件应该是i>0吧,如果是i<1,初始的i都不满足条件肯定不会执行循环了。
2015-10-05 回复 有任何疑惑可以回复我~
#21

hassk

解释赞一个。顿时豁然开朗呀~~~~~
2015-10-28 回复 有任何疑惑可以回复我~
#22

kkkkkvvv

了解了。。我现在这样写 content.removeChild(content.firstChild);
2015-11-17 回复 有任何疑惑可以回复我~
#23

门内的野蛮人

大神,真赞!
2015-12-15 回复 有任何疑惑可以回复我~
#24

Im陳小旭

说的有道理,但是你运行一下我这代码试试 function clearText() { var content=document.getElementById("content"); // 在此完成该函数 for(var i=0;i < content.childNodes.length-1;i++){ var x = content.removeChild(content.childNodes[i]); document.write("删除节点:"+content.childNodes[i].innerHTML+"</br>"); } }
2015-12-18 回复 有任何疑惑可以回复我~
#25

慕斯卡4106679

<script type="text/javascript"> function clearText() { var content=document.getElementById("content"); // 在此完成该函数 var a=content.childNodes while(a.length>0){ content.removeChild(a[0]); } } w我这么写怎么一下就删光了
2015-12-31 回复 有任何疑惑可以回复我~
#26

really4you 回复 再去西藏

childNodes[0]是数组的第一个元素,但是请问为什么第二个就成了第一个了?是不是所有删掉的元素都会占用上一个元素的位置?这点没想通
2016-01-18 回复 有任何疑惑可以回复我~
#27

Leon_tu

果然是大神 敬佩
2016-01-21 回复 有任何疑惑可以回复我~
#28

uwenhao2008

MARK一下,解释的好详细哦。谢谢了 思密达~~~~~
2016-01-27 回复 有任何疑惑可以回复我~
#29

横断潇云 回复 折叠幸福

因为每次删的都是那个空白标签,所以没反应。
2016-01-31 回复 有任何疑惑可以回复我~
#30

qq_A_46

那么子节点数组的下标不会改变吗。
2016-02-04 回复 有任何疑惑可以回复我~
#31

prettywinter 回复 折叠幸福

循环条件写错了。 for(var i=content.childNodes.length;i>1;i--)
2016-02-17 回复 有任何疑惑可以回复我~
#32

prettywinter 回复 maccine

每次循环后,length的值会改变
2016-02-17 回复 有任何疑惑可以回复我~
#33

prettywinter 回复 qq_芒果加冰_0

每次删除的是数组中的第一个元素,删除元素后,数组中元素的位置会发生改变
2016-02-17 回复 有任何疑惑可以回复我~
#34

prettywinter 回复 superli18

就是这个意思
2016-02-17 回复 有任何疑惑可以回复我~
#35

格劳修斯 回复 qq_芒果加冰_0

因为每循环一次[0]位置的节点都被删除了
2016-03-02 回复 有任何疑惑可以回复我~
#36

张威1992

为什么要改成0?
2016-03-04 回复 有任何疑惑可以回复我~
#37

Lshah0 回复 折叠幸福

你看老师的解释。 i=content.childNodes.length 不能使用这个做循环条件, content.removeChild(content.childNodes[i-1]);
2016-03-18 回复 有任何疑惑可以回复我~
#38

纪行川

给你点赞
2016-03-26 回复 有任何疑惑可以回复我~
#39

Richardsh 回复 折叠幸福

i<1改为i>0
2016-04-05 回复 有任何疑惑可以回复我~
#40

不知所语

能解释一下为什么第一次点击的时候没反应吗
2016-04-11 回复 有任何疑惑可以回复我~
#41

不知所语

还有把代码改成你给的那样,还是不能一次性就删除掉
2016-04-11 回复 有任何疑惑可以回复我~
#42

干枯的海绵 回复 折叠幸福

for循环中起始条件i取值超出范围,应该是var i=content.childNodes.length-1;
2016-04-13 回复 有任何疑惑可以回复我~
#43

Swibinchter

柳暗花明
2016-04-14 回复 有任何疑惑可以回复我~
#44

qq_没有美腿的宝马_0

把for里面的i改成i=1这样 为什么可以直接删除所有的
2016-04-19 回复 有任何疑惑可以回复我~
#45

qq_路易十四_0

感觉比此节内容学到的还多,受益了,谢谢答主
2016-05-18 回复 有任何疑惑可以回复我~
#46

夕颜egao 回复 折叠幸福

i<1条件不成立
2016-06-07 回复 有任何疑惑可以回复我~
#47

慕姐8289045

你好,不太理解,第一个问题,就算你的序号2说的,什么正着删除一个,倒着删除一个?什么意思? 第二个问题,序号3我懂了一次性删除3个,那为啥后两个是一次删除一个呢? 第三个问题,序号3改的代码是不是var x=content.removeChild(content.childNodes[0]);里面应该是content.childNodes[i],而不是content.childNodes[0]啊?、、、、求大神你解答《,,,,,,,,,嘻嘻
2016-07-26 回复 有任何疑惑可以回复我~
#48

小瓶绿芬达

for(var i=0;i<content.childNodes.length;i++){ var x=content.removeChild(content.childNodes[0]); } }为什么结果不一样
2016-08-08 回复 有任何疑惑可以回复我~
#49

慕慕1265030

解释的太棒了 简单明了
2016-08-15 回复 有任何疑惑可以回复我~
#50

这你都晓得 回复 再去西藏

稍微理解了点 但是var x=content.removeChild(content.childNodes[0] 这个是会重复执行的么?
2016-09-01 回复 有任何疑惑可以回复我~
#51

lewandowski

说的好好,谢谢
2016-10-20 回复 有任何疑惑可以回复我~
#52

Delivw

谢谢老师,瞬间明白
2016-11-03 回复 有任何疑惑可以回复我~
#53

qq_在迷宫_0

var childList=content.childNodes; for(var i=0;i<childList.length;i++){ while(childList[i]&&childList[i]!=1){ } content.removeChild(childList[i]); } 如果定义一个变量来接收content.childNodes,那么这个时候childNodes的长度就不会动态变化而是在变量中存着了,但是还是会出现点击第一下没有反应,然后再点击一下删除了3个,然后再点击依次删除一个
2016-11-12 回复 有任何疑惑可以回复我~
#54

蔡华3618527

var x=content.removeChild(content.childNodes[0]); 这里为什么不是i而是0呢,那这个i都没用用上,循环用来起什么作用呢
2017-01-05 回复 有任何疑惑可以回复我~
#55

移动的城堡上住着小智

茅塞顿开,感谢楼主
2017-03-11 回复 有任何疑惑可以回复我~
#56

斟酒独酢 回复 折叠幸福

for(var i=content.childNodes.length;i<1;i--) i要大于1,i小于1,怎么循环。
2017-03-11 回复 有任何疑惑可以回复我~
#57

青黄不一

厉害了
2017-03-20 回复 有任何疑惑可以回复我~
#58

Jeoop

谢谢,豁然开朗!
2017-04-23 回复 有任何疑惑可以回复我~
#59

浮若绊笙 回复 折叠幸福

你的循环条件 for(var i=content.childNodes.length;i<1;i--) 应该改成 for(var i=content.childNodes.length; i>=0; i- -) 上面的循环条件 i<1是有问题的
2017-07-25 回复 有任何疑惑可以回复我~
#60

qq_wonderful_6

我有点不明白:为什么Chrome浏览器会变11个节点不是10个?
2017-09-20 回复 有任何疑惑可以回复我~
#61

路人戊_

6666666,就是比我们想得多,看到循环就习惯性用那些变量做条件了,根本没仔细想
2017-11-19 回复 有任何疑惑可以回复我~
#62

qq_巴卡拉_0

老师无敌,厉害,有get到一个点了
2018-03-30 回复 有任何疑惑可以回复我~
查看60条回复

如果用while循环的话,可以这么些,如下:

<script type="text/javascript">
    function clearText() {
        var content=document.getElementById("content");
        while(content.childNodes.length != 0){
            var x=content.removeChild(content.childNodes[0]);
        }
    }
</script>


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

maccine

老师,用while循环和for循环function clearText() { var content=document.getElementById("content"); for(i=0;i<content.childNodes.length;i++) { var x=content.removeChild(content.childNodes[i]); } }为什么while可以全部删完?而for循环只能一次删除三个呀?
2015-02-06 回复 有任何疑惑可以回复我~
#2

maccine

上面那段代码复制错了,是下面这段代码。求老师帮忙解答一下 function clearText() { var content=document.getElementById("content"); for(i=0;i<content.childNodes.length;i++) { var x=content.removeChild(content.childNodes[0]); } }
2015-02-06 回复 有任何疑惑可以回复我~
#3

qq_三亚旅游摄影_0 回复 maccine

i<content.childNodes.length 第次循环是:2<3 成立 删除,第4次循环是:3<2 所以就没然后了
2015-08-23 回复 有任何疑惑可以回复我~
#4

鸭梨同学

这个好像更简洁
2016-01-07 回复 有任何疑惑可以回复我~
#5

prettywinter 回复 maccine

没删除一个节点,数组的长度会改变。
2016-02-17 回复 有任何疑惑可以回复我~
查看2条回复

这个是运算时候的逻辑问题,你写的循环是从上往下删除,就会产生这样一个问题,举个例子,比如一排人有5个,分别对应1,2,3,4,5,那么这个时候1号有事临时走了,那么重新排队,是不是剩下的所有序号都要往前移一位,就是原来的2号是1号,3号是2号以此类推。你写的这个循环中就有这个问题,就是删除一次以后再次循环的时候顺序就会重新排列,这个时候再删除的时候就不是删除以前的节点,而是他的下一个节点了,因此这种写法,不是最好的,可以参考一下给出的代码,或者尝试一下用while语句去写

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

qq_A_46

那样随着位置每次的变化,每删除第一个节点之后,之后的节点又充当第一个节点。那么就只要删除第一个节点就好了吧。
2016-02-04 回复 有任何疑惑可以回复我~
#2

米虫懒得聪明 回复 qq_A_46

对的,我认为也是这样
2016-07-04 回复 有任何疑惑可以回复我~
#3

稻穗陈落入梦来

正解,不过我把for循坏的I换成固定数,还是只能输出3个
2016-09-27 回复 有任何疑惑可以回复我~
首页上一页12345下一页尾页

举报

0/150
提交
取消

怎么点击第一下没有反应,然后再点击一下删除了3个,然后再点击依次删除一个

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