删除div中的所有子DOM元素

Dav*_*.ca 122 javascript dojox.gfx

我有以下dojo代码在div下创建表面图形元素:

....
<script type=text/javascript>
....
   function drawRec(){
      var node = dojo.byId("surface");
      //   remove all the children graphics
      var surface = dojox.gfx.createSurface(node, 600, 600);

      surface.createLine({
         x1 : 0,
         y1 : 0,
         x2 : 600,
         y2 : 600
      }).setStroke("black");
   }
....
</script>
....
<body>
<div id="surface"></div>
....
Run Code Online (Sandbox Code Playgroud)

drawRec()将第一次绘制矩形图形.如果我在锚点href中再次调用此函数,如下所示:

 <a href="javascript:drawRec();">...</a>
Run Code Online (Sandbox Code Playgroud)

它会再次绘制另一个图形.我需要清理div下的所有图形,然后再次创建.如何添加一些dojo代码呢?

Mau*_*rry 283

while (node.hasChildNodes()) {
    node.removeChild(node.lastChild);
}
Run Code Online (Sandbox Code Playgroud)

  • 只是迂腐 - 删除没有相应JS对象的DOM节点会导致内存泄漏. (17认同)
  • @Tom:dojox.gfx创建JavaScript对象以与底层图形系统进行通信,这些图形系统可能具有DOM节点(SVG,VML)或不具有DOM节点(Silverlight,Flash,Canvas).从DOM中删除DOM节点不会删除这些JavaScript对象,并且**也不会删除**DOM节点,因为JavaScript对象仍然具有对这些DOM节点的引用.我在这个问题的答案中描述了处理这种情况的正确方法. (7认同)
  • @robocat它与IE无关:JS对象引用DOM对象将它们保存在内存中,底层JS对象通过其他JS对象的引用保存在内存中.例如:gfx表面引用其所有子项,组也引用其所有子项,依此类推.仅删除DOM节点是不够的. (3认同)
  • @ david-chu-ca - 可能是Eugene(dojo GFX库的主要作者)的后期答案应该被标记为已接受的答案.尤金 - 谢谢你的澄清. (3认同)
  • @Eugene:你能谈谈更多吗? (2认同)

Che*_*try 43

node.innerHTML = "";
Run Code Online (Sandbox Code Playgroud)

非标准,但速度快,支持良好.

  • 与删除节点相比,*更慢*:http://jsperf.com/innerhtml-vs-removechild/15 (6认同)
  • 似乎是HTML 5中的标准.上面的博客条目是用户错误.https://developer.mozilla.org/en-US/docs/DOM/element.innerHTML (4认同)
  • IE不支持.检查:http://www.theogray.com/blog/2009/06/internet-explorer-unknown-runtime-error (2认同)

Eug*_*kin 24

首先,你需要创建一个表面并将其保存在方便的地方.例:

var surface = dojox.gfx.createSurface(domNode, widthInPx, heightInPx);
Run Code Online (Sandbox Code Playgroud)

domNode通常是一个简单的<div>,用作表面的占位符.

您可以一次性清除曲面上的所有内容(所有现有的形状对象都将失效,之后不要使用它们):

surface.clear();
Run Code Online (Sandbox Code Playgroud)

所有与表面相关的函数和方法都可以在dojox.gfx.Surface的官方文档中找到.使用的例子可以在dojox/gfx/tests/.


Jam*_*mes 20

while(node.firstChild) {
    node.removeChild(node.firstChild);
}
Run Code Online (Sandbox Code Playgroud)


Bri*_*n C 18

在Dojo 1.7或更高版本中,使用domConstruct.empty(String|DomNode):

require(["dojo/dom-construct"], function(domConstruct){
  // Empty node's children byId:
  domConstruct.empty("someId");
});
Run Code Online (Sandbox Code Playgroud)

在较旧的Dojo中,使用dojo.empty(String|DomNode)(在Dojo 1.8中弃用):

dojo.empty( id or DOM node );
Run Code Online (Sandbox Code Playgroud)

这些empty方法中的每一个都安全地删除节点的所有子节点.