JavaScript:如何检测节点是否已被删除?

时间:2012-05-14 09:32:25

标签: javascript jquery memory

我认为描述我的问题的最好方法是在这样的事情中创建一些图像对象:

<div id="image_collection">
    <div class="image" data-src="http://image1.jpg"></div>
    <div class="image" data-src="http://image2.jpg"></div>
</div>

在我的JavaScript中,我可以拥有以下内容:

$('.image').each(function( index, element ){
    var image = new Image(); //NEW INSTANCE(S) CREATED (IN MEMORY)
    image.src = $(this).attr('data-src');
    $(this).parent().append(image);
});

请记住,这是我真实脚本中的一个示例new Image()是一个自定义对象。

此脚本自动完成,因此无论何时放置<div class="image" data-src="http://image1.jpg"></div>都会创建一个图像。现在一些程序员使用这个脚本并导入它并使用以下代码创建自己的脚本:

$('#image_collection').remove(); //OR 
$('#image_collection').html('Some new content');

现在我的脚本首先触发,它将转换所有图像,创建新实例,但是当程序员删除了image_collection中的节点时,我相信那些图像实例仍将保留在内存中。如果不再在DOM中使用这些图像实例,我该如何删除它们?

3 个答案:

答案 0 :(得分:2)

.remove()函数从DOM中删除节点并返回它们。如果你没有对返回值做任何事情,他们最终会被清理干净。

答案 1 :(得分:1)

如果您真的担心内存,可以将这些图像放在全局图像(或自定义对象)数组中,而不是将其放在局部变量中。 采取全局变量

var image_cleaned=false;

使用计时器(即setTimeOut)检查din是否包含类image的img标记。 如果找不到任何匹配的元素(并且image_cleaned为false),则删除该数组。然后设置image_cleaned=true;。然后删除计时器(可选但更好)。

答案 2 :(得分:1)

当$(。image).each()的范围结束时,Image()对象被销毁:实际上,'image'var在该范围内创建,并且在.each()结束后无法生存。< / p>

到目前为止,您只有DOM节点,但它已被.remove()删除。

你可以感到舒服:P