引用DOM对象(var o = docume ...)并通过parent.innerHTML =''删除DOM对象时会发生什么?

时间:2013-06-07 08:39:17

标签: javascript dom reference garbage-collection innerhtml

希望问题的标题清楚,但是:

发生以下情况会发生什么:

 <div id="parent">
      <img src="..." id="myImage"/>
 </div>

 <script>
 var i=document.getElementById('myImage');
 document.getElementById('parent').innerHTML='';
 // variable i should not be 'undefined' right? chrome debugger says nope!
 </script>

我已经在chromes调试器中对此进行了测试,看起来即使在DOM对象不再存在之后,引用仍然“存在”......我是否正确?执行console.log(i)(对于上面的示例),仍然返回对象及其所有属性...垃圾收集器不应该启动并且“未定义”此引用,因为它不再存在于DOM中?

有人知道除了Chrome之外,其他浏览器(更具体地说,IE6 ......)是如何处理这样的事情的?

我问的原因是因为我们全局存储一些引用(取决于用户操作),如果用户稍后执行另一个操作就会被使用...而且我们基本上需要一种方法来测试DOM对象是否仍然存在或不.. ..

我已经创建了一个小的jsfiddle来使一切清楚:http://jsfiddle.net/9HCKt/

感谢。

更新:我现在看到的问题还不是很清楚......如何以跨浏览器兼容的方式测试此对象是否仍然存在于DOM中?

2 个答案:

答案 0 :(得分:2)

你的小提琴使事情变得更糟:)为什么你需要知道删除元素的类型?在删除之前它将是对象,之后也是。如果问题会发生什么:您的元素是Element。您可以使用i instanceof Element进行检查。它只是与DOM断开连接。你实际上可以再次连接它,在DOM的其他或相同的地方,它将是合法的。如果问题如何检查元素是否连接到DOM :只需检查它是否是父类定义。

if (i.parentElement) {
   // i connected to DOM
} else {
   // i disconnected
};

请注意:当您使用document.createElement添加新元素时,您的新元素尚未附加。但它显然不是undefined

答案 1 :(得分:1)

如果你可以使用jQuery,

$(document).has($(i)).length

如果1仍在DOM中,则

应为i,否则为0

  

执行console.log(i)(对于上面的示例),仍然返回   对象及其所有属性......垃圾收集器不应该踢   in和'undefined'这个引用,因为它不再存在于   DOM?

事实上,使用您的i变量,您将维护对该对象的引用,从而防止它被垃圾回收。