Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.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中删除也可以访问?_Javascript_Jquery_Html_Events_Dom - Fatal编程技术网

Javascript 为什么一个元素即使从DOM中删除也可以访问?

Javascript 为什么一个元素即使从DOM中删除也可以访问?,javascript,jquery,html,events,dom,Javascript,Jquery,Html,Events,Dom,window.a={ 第1部分:$(“#第1部分”), img1:$(“#img1”) }; $(a.img1)。单击(函数(){ a、 html(“”); $('#img2')。单击(函数(){ $(a.img1).attr('src','https://www.gstatic.com/webp/gallery/3.sm.jpg'); }); }); 您已经从DOM树中删除了节点,但它仍然存在,因为window.img1仍然指向它(间接地,通过指向一个jQuery对象,而jQuery对象又指向

window.a={
第1部分:$(“#第1部分”),
img1:$(“#img1”)
};
$(a.img1)。单击(函数(){
a、 html(“”);
$('#img2')。单击(函数(){
$(a.img1).attr('src','https://www.gstatic.com/webp/gallery/3.sm.jpg');
});
});

您已经从DOM树中删除了节点,但它仍然存在,因为
window.img1仍然指向它(间接地,通过指向一个jQuery对象,而jQuery对象又指向它),所以它不能被垃圾收集。如果将
window.img1
设置为不同的值(例如
null
undefined
),则可以对元素进行垃圾收集

可以这样想:首先,图像的父元素(以及各种同级元素,但暂时忽略)指向它:

+---------------------+ +-------------------+ | (some DOM elements) |--------->| | +---------------------+ | | | the image element | +------+ | | | img1 |------------------------>| | +------+ +-------------------+ 释放最后一个引用,元素就可以被回收/释放。

window.a={
第1部分:$(“#第1部分”),
img1:函数(){
return$(“>img[id]”,this.div1)
}
};
功能切换(e){
a、 html(/1/.test(e.target.src)
? '' 
: $('')
。单击(切换)
);
$(“#img2”)。在(“单击”上,函数(e){
a、 img1().attr({
“src”:”https://www.gstatic.com/webp/gallery/3.sm.jpg',
“id”:“img3”
})
。单击(切换)
});
}
a、 img1()。单击(切换)


您已经从DOM树中删除了节点,但它仍然存在,因为
窗口。img1
仍然指向它-因此它不能被垃圾收集。“为什么从DOM中删除元素后仍然可以访问?”元素从
DOM中删除的位置在哪里?@guest271314
a.div1.html()
应该删除它。“是吗?”伊斯梅尔是的,你说得对;从
DOM
中删除,但仍然是
窗口的jQuery对象。a.img1
如果您从酒店房间偷了遥控器,当您按下按钮时,它仍然会闪烁灯光,即使它对任何其他电视都没有任何作用……仍然是浏览器向
https://www.gstatic.com/webp/gallery/3.sm.jpg
。在“网络”选项卡上选中。控制台确实显示
未定义
。@IsmailS:控制台显示
未定义
的唯一原因是代码输出
a.img
,而不是
a.img1
。在删除元素之前执行
检查不会使元素在以后神奇地消失。如果使用a,您会看到
a.img1
仍然是一个jQuery对象(当然),
a.img1[0]
仍然引用
HTMLInputElement
对象(当然)。@IsmailS:您的问题的答案是Marc B早些时候说的:它仍然存在,因为仍然有对它的引用。在显示图像之前,使用断开连接的
img
获取图像是一种常见的技术。要避免这种情况发生,请清除
img1
。这是一个真实的答案,那么为什么要将其作为社区wiki?@IsmailS:CWs是真实的答案。当我看到有人评论(不完整的版本)如果答案简短,我会用什么来回答时,我经常勾选CW框。我不在乎rep,它似乎有助于避免“窃取”评论中“答案”的投诉。(我不认为马克B会那样抱怨,但我从其他人那里得到过,所以…)这就是你的伟大,先生!不管怎样,如果有人抱怨盗取答案,那一定是他们的错。你已经详细阐述过了。他们没有 +-------------------+ | | | | | the image element | +------+ | | | img1 |------------------------>| | +------+ +-------------------+