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元素。