从DOM中删除节点

问题描述:

Noob问题警报!我正在研究每秒更新一次的基本时钟,但由于我获取了未捕获的错误,因此未更新错误:NOT_FOUND_ERR:DOM异常8.基本上我只需要将函数结尾的removeChild()更改为其他内容,但是我不知道该怎么改变它。我想删除正在创建的<p class="time">从DOM中删除节点

function spitTime() { 
    var clock = new Date(); 
    var hours = clock.getHours(); 
    var minutes = clock.getMinutes(); 
    var seconds = clock.getSeconds(); 

    if (minutes <= 9) { 
     minutes = "0" + minutes; 
    } 

    if (seconds <= 9) { 
     seconds = "0" + seconds; 
    } 

    var displayTime = hours + ":" + minutes + ":" + seconds; 
    var newTimeElem = document.createElement("p"); 
    newTimeElem.className = "time"; 
    var timeText = document.createTextNode(displayTime); 
    newTimeElem.appendChild(timeText); 
    document.getElementById("timePlace").appendChild(newTimeElem); 
    document.getElementById("timePlace").removeChild(); 
} 

相关HTML:

<div class="clock"> 
    <span id="timePlace"></span> 
</div> 
+2

为什么不直接更改现有元素的内容? – 2012-07-17 17:49:06

+0

我该怎么做? – dezman 2012-07-17 17:51:27

+0

如何在不使用HTML的情况下知道? – 2012-07-17 17:52:09

根据你的问题,你不想删除一个孩子,你想改变现有元素的文本。

对于这一点,你可以使用textContent

document.getElementById('timePlace').textContent = displayTime; 

应当指出的是,这是不是跨浏览器。 IE8及更低版本与innerText一起使用。使用这种方法很简单:

var timePlace = document.getElementById('timePlace'); 
if ('textContent' in timePlace) { 
    timePlace.textContent = displayTime; 
} 
else { 
    timePlace.innerText = displayTime; 
} 

但是,这是一个黑客攻击。它将很好地适用于你的情况,但不要依赖于此。

如果你真的想跨浏览器兼容性,你使用jQuery的方式(或任何其他类似的库)。 jQuery的方法来改变文字:

$('#timePlace').text(displayTime); 

它采用nodeValue,唯一真正的跨浏览器的方式来处理文本。但它必须递归执行此操作,因为它仅在textNodes上可用。它相当于使用data(因为@amnotiam在您的问题的评论中)。

+0

给displayTime或者把它放在p标签中的最佳方式是什么? – dezman 2012-07-17 18:22:25

+1

'document.getElementById('timePlace').className ='''?那是你要的吗?把它放在p标签中,使用'appendChild'。 – 2012-07-17 18:23:37

+0

好的很酷谢谢,对于简单的问题感到抱歉,而且在检查元素上的标记看起来很奇怪,它像' 11:26:19“11:26:45”'你知道这可能是为什么? – dezman 2012-07-17 18:28:29

如果你想删除timePlace元素本身:

document 
    .getElementById("timePlace") 
    .parentNode 
    .removeChild(document.getElementById('timePlace')); 

假设这是意图,这个工程由找到关元/节点(getElementById()),移动到该元素的parentNode,然后从父元素中移除该元素(因为removeChild()都需要DOM点头e被传递给它,删除当前元素/节点的子节点)。


根据从OP(下图)的注释更新,只需使用:

newTimeElem.parentNode.removeChild(newTimeElem); 

参考文献:

+0

我想删除正在创建的

。 – dezman 2012-07-17 17:51:08

您没有指定要删除的子节点。

Node.removeChild

var oldChild = element.removeChild(child); 
element.removeChild(child); 
  • 儿童将被从DOM移除的子节点。
  • 元素是孩子的父节点。
  • oldChild保存对已移除子节点的引用。 oldChild所==孩子

<script type="text/javascript"> 
     function spitTime() { 
      var clock = new Date(); 
      var hours = clock.getHours(); 
      var minutes = clock.getMinutes(); 
      var seconds = clock.getSeconds(); 

      if (minutes <= 9) { 
       minutes = "0" + minutes; 
      } 

      if (seconds <= 9) { 
       seconds = "0" + seconds; 
      } 

      var displayTime = hours + ":" + minutes + ":" + seconds; 
      var newTimeElem = document.createElement("p"); 
      newTimeElem.className = "time"; 
      var timeText = document.createTextNode(displayTime); 
      newTimeElem.appendChild(timeText); 
      $('#timePlace').children('.time').remove(); 
      document.getElementById("timePlace").appendChild(newTimeElem); 
      setTimeout('spitTime()', 100); 
     } 
     $(document).ready(function(){ 
      setTimeout('spitTime()', 100); 
     }); 
    </script> 
</head> 
<body> 
    <div class="clock"> 
     <span id="timePlace"></span> 
    </div> 
</body> 

链接:http://lib-eguide.nus.edu.sg/test1.php

+0

在你的代码中有两个问题,1-ur最后一行,2-逻辑错误。 – Danial 2012-07-17 18:03:03

+0

您要添加此评论到自己的答案? – 2012-07-17 18:04:00

+0

是的,实际上我不太熟悉转仓流程,因为首先他添加了孩子,然后他想删除孩子,逻辑上他需要先删除以前添加的孩子,然后添加一个新孩子。 – Danial 2012-07-17 18:06:31

while (timePlace.firstChild) { 
    timePlace.removeChild(timePlace.firstChild) 
} 

是我想要的,虽然它可能更好只是编辑内容,这对我很好。