javascript内存问题
比如说,在我的webapp启动之前,我想首先创建所有dom元素,并将它们存储在一些预加载的数组中。比如:javascript内存问题,javascript,html,jquery,Javascript,Html,Jquery,比如说,在我的webapp启动之前,我想首先创建所有dom元素,并将它们存储在一些预加载的数组中。比如: for (i = 1...100) { preLoader.push($('<div id="' + i + '" />')); } (i=1…100){preload.push($('');}的 然后,根据操作的不同,我将从数组中获取正确的元素并将其附加到DOM中。 现在我的问题是:如果我以后要做: $(div#i).remove() 它是否也会影响我的预加载程序数组,或
for (i = 1...100) { preLoader.push($('<div id="' + i + '" />')); }
(i=1…100){preload.push($('');}的
然后,根据操作的不同,我将从数组中获取正确的元素并将其附加到DOM中。
现在我的问题是:如果我以后要做:
$(div#i).remove()
它是否也会影响我的预加载程序数组,或者它与DOM中的引用不同?DOM中的对象是相同的。如果你想再次使用同一个标签,你应该调用
$(div#i).detach();
从jquery文档:
.detach()方法与.remove()方法相同,不同之处在于.detach()保留与已删除元素关联的所有jQuery数据。当删除的元素稍后要重新插入DOM时,此方法非常有用
如果使用.remove(),则将丢失与要删除的元素关联的事件和数据。但是,即使使用remove(),也可以通过再次调用.appendTo()来重用相同的元素
小提琴手的例子:
(很抱歉发出警报,这是最简单的方法)。DOM中的对象是相同的。如果你想再次使用同一个标签,你应该调用
$(div#i).detach();
从jquery文档:
.detach()方法与.remove()方法相同,不同之处在于.detach()保留与已删除元素关联的所有jQuery数据。当删除的元素稍后要重新插入DOM时,此方法非常有用
如果使用.remove(),则将丢失与要删除的元素关联的事件和数据。但是,即使使用remove(),也可以通过再次调用.appendTo()来重用相同的元素
小提琴手的例子:
(对于警报,很抱歉,这是最简单的方法)
它还会影响我的预加载程序阵列吗
不,不会的。对象将从内存中删除,并且只有在没有方法访问它时,也就是说没有对它的引用。在$('div#'+i).remove()之后,您无法从DOM访问它,但仍然可以通过预加载程序[i-1]
访问它。因此,您需要从预加载程序数组显式地删除对象:
preLoader.splice(i-1,1);
它还会影响我的预加载程序阵列吗
不,不会的。对象将从内存中删除,并且只有在没有方法访问它时,也就是说没有对它的引用。在$('div#'+i).remove()之后,您无法从DOM访问它,但仍然可以通过预加载程序[i-1]
访问它。因此,您需要从预加载程序数组显式地删除对象:
preLoader.splice(i-1,1);
我认为所有与DOM相关的函数(比如append)实际上都会接受这个参数,并在内存中为它创建一个新的对象,只是为了DOM,然后附加它?因此,例如,如果在附加到DOM之后,我执行:$('div#'+I).css(宽度:0),它将只应用于DOM中的元素,而不是存储在数组中的元素,因为它们是不同的实体。或者它们实际上指向内存中的同一地址,因此修改一个地址也会修改另一个地址吗?@paulsmith看,jQuery只是一种易于使用DOM
的机制。实际上,只有DOM
和DOMElement
s。因此,当您从DOM
中删除DOMElement
时(使用jQuery或smthn-else无法实现),它们不会从jQuery包装器中删除,jQuery包装器存在于预加载程序
数组中,其中包含对相应DOMElement
的引用@paulsmith,回答您的问题:“$('div#'+i).css(宽度:0),它将仅将其应用于DOM中的元素”。不,它也将应用于数组中的元素。附加到DOM的元素与数组中的元素相同。检查我下面的答案。我认为所有与DOM相关的函数(比如append)实际上都会接受这个参数,并在内存中为它创建一个新的对象,只是为了DOM,然后附加它?因此,例如,如果在附加到DOM之后,我执行:$('div#'+I).css(宽度:0),它将只应用于DOM中的元素,而不是存储在数组中的元素,因为它们是不同的实体。或者它们实际上指向内存中的同一地址,因此修改一个地址也会修改另一个地址吗?@paulsmith看,jQuery只是一种易于使用DOM
的机制。实际上,只有DOM
和DOMElement
s。因此,当您从DOM
中删除DOMElement
时(使用jQuery或smthn-else无法实现),它们不会从jQuery包装器中删除,jQuery包装器存在于预加载程序
数组中,其中包含对相应DOMElement
的引用@paulsmith,回答您的问题:“$('div#'+i).css(宽度:0),它将仅将其应用于DOM中的元素”。不,它也将应用于数组中的元素。附加到DOM的元素与数组中的元素相同。检查下面我的答案。