Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当您引用一个DOM对象(var o=docume…)并且该DOM对象通过parent.innerHTML='';?_Javascript_Dom_Reference_Garbage Collection_Innerhtml - Fatal编程技术网

Javascript 当您引用一个DOM对象(var o=docume…)并且该DOM对象通过parent.innerHTML='';?

Javascript 当您引用一个DOM对象(var o=docume…)并且该DOM对象通过parent.innerHTML='';?,javascript,dom,reference,garbage-collection,innerhtml,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

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

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

 <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>

var i=document.getElementById('myImage');
document.getElementById('parent')。innerHTML='';
//变量i不应该是“未定义”的,对吗?chrome调试器说不!
我已经在chromes调试器中对此进行了测试,似乎即使DOM对象不再存在,引用仍然“存在”。。。我说得对吗?执行console.log(i)(对于上面的示例),仍然会返回对象及其所有属性。。。既然DOM中不再存在该引用,垃圾收集器是否应该启动并“未定义”该引用

除了chrome之外,有人知道其他浏览器(更具体地说,IE6…)如何处理类似的事情吗

我之所以这么问是因为我们全局存储了一些引用(取决于用户操作),以便在用户稍后执行另一个操作时使用。。。我们基本上需要一种方法来测试DOM对象是否仍然存在

我创建了一个小JSFIDLE,以使一切都变得清晰:

谢谢


更新:我现在知道问题不太清楚了。。。我如何测试这个对象是否仍然以跨浏览器兼容的方式存在于DOM中?

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

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

思考:当您使用
document.createElement
添加新元素时,新元素尚未附加。但是如果您可以使用jQuery,它显然不是未定义的

$(文档).has($(i)).length

如果
i
仍在DOM中,则应为
1
,如果不在DOM中,则应为
0

执行console.log(i)(对于上面的示例),仍然会返回 对象及其所有属性。。。垃圾收集器不应该踢吗 和“未定义”此引用,因为它不再存在于 多姆


事实上,使用
i
变量,您正在维护对对象的引用,以防止它被垃圾收集。

+1请注意,通过维护对对象的引用,可以防止垃圾收集。。。不知道这一点。请注意,如果父元素测试是与DOM断开连接的“i”的祖先,则该测试将不起作用(请参阅)。在这种情况下,您必须向上移动层次结构,直到到达document元素。