为什么一个元素即使在从DOM中删除后也可以访问
Why is an element accessible even after being removed from DOM?
window.a = {
div1: $('#div1'),
img1: $('#img1')
};
$(a.img1).click(function() {
a.div1.html('<img id="img2" src="https://www.gstatic.com/webp/gallery/2.sm.jpg" />');
$('#img2').click(function() {
$(a.img1).attr('src', 'https://www.gstatic.com/webp/gallery/3.sm.jpg');
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="div1">
<img id="img1" src="https://www.gstatic.com/webp/gallery/1.sm.jpg" />
</div>
当第9行执行时,即$(a.img1).attr('src', 'https://www.gstatic.com/webp/gallery/3.sm.jpg');
第二次单击图像时,a.img1不应存在。那个么,为什么那个URL的HTTP请求会被发送到服务器(网络选项卡中的通知(?我使用的是Chrome版本45.0.2454.85 m。不要认为这是浏览器错误。同样适用于Firefox 39。
还做了一个小提琴手http://jsfiddle.net/ismusidhu/vvmwntcd/.
正如Marc B所说,您已经从DOM树中删除了该节点,但它仍然存在,因为window.img1
仍然指向它(间接地,通过指向一个jQuery对象,该对象又指向它( mdash;所以它不能被垃圾收集。如果将window.img1
设置为不同的值(如null
或undefined
(,则可以对元素进行垃圾回收。
这样想:你从图像的父元素(和各种兄弟元素,但现在忽略它(指向它开始:
+---------------------++-------------------+|(某些DOM元素(|-------->||+---------------------+|||图像元素|+------+|||img1|------------------------>||+------++-------------------+
然后,当您在其祖先上调用html
时,DOM将删除对该元素的所有引用,您将得到以下内容:
+-------------------+|||||图像元素|+------+|||img1|------------------------>||+------++-------------------+
释放最后一个引用,元素就可以被回收/释放。
window.a = {
div1: $('#div1'),
img1: function() {
return $("> img[id]", this.div1)
}
};
function toggle(e) {
a.div1.html(/1/.test(e.target.src)
? '<img id="img2" src="https://www.gstatic.com/webp/gallery/2.sm.jpg" />'
: $('<img id="img1" src="https://www.gstatic.com/webp/gallery/1.sm.jpg" />')
.click(toggle)
);
$("#img2").on("click", function(e) {
a.img1().attr({
'src': 'https://www.gstatic.com/webp/gallery/3.sm.jpg',
"id": "img3"
})
.click(toggle)
});
}
a.img1().click(toggle);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="div1">
<img id="img1" src="https://www.gstatic.com/webp/gallery/1.sm.jpg" />
</div>
jsfiddlehttp://jsfiddle.net/vvmwntcd/6/
相关文章:
- 如何从DOM中删除Aloha编辑器
- 如何修复:当javascript更改DOM时,iOS会删除CSS文件
- 从dom中删除任何元素后,Touchmove事件停止触发
- IE9-添加和删除DOM元素会破坏父keydown事件
- 如何使用jQuery从DOM中删除所有单选按钮元素
- 如何在删除脚本后刷新/重新编译dom中的脚本
- JQuery.删除DOM树中的上一个同级
- 在jquery中是否有任何方法或位置可以编写从Dom中删除页面后调用的方法
- 如何从DOM(KnockoutJS)中删除$data、$parent等
- 从 DOM 中删除/删除 Javascript 用户定义的数组
- 从 DOM 数组中删除 DOM 对象
- 通过删除其相关的 DOM 存在来重新初始化 jQuery 插件
- 在 IE 中从 DOM 中删除选项时,滚动选择元素会跳到顶部
- 如何在单击按钮时删除 DOM 元素
- 如何删除DOM事件处理程序的重复JavaScript代码
- 删除在加载dom之后创建的动态元素
- 在p5-dom上单击提交按钮后,我如何删除该按钮
- 删除的DOM元素仍然显示在移动safari(iOS 5.1)中
- Angular指令删除只调用一次的DOM元素
- chrome javascript dom删除iframe背景图像