2012-07-28 50 views
0

比方說,在我的webapp啓動之前,我想先創建所有dom元素並將它們存儲在某個預加載的數組中。例如:javascript內存問題

for (i = 1...100) { preLoader.push($('<div id="' + i + '" />')); } 

然後,根據操作,我將從數組中取出正確的元素並將其附加到DOM。
現在我的問題是:如果我以後怎麼辦:

$(div#i).remove()

將它也會影響我的預加載器陣列,或者是一個比DOM中的不同的參考?

回答

2

將它也會影響我的預加載器陣列

不,它不會。對象將被從內存中移除,僅當且僅當沒有辦法訪問它時,即沒有對它的引用。 $('div#'+i).remove()後,你不能從DOM訪問它,但你可以通過preLoader[i-1]。所以你需要從preLoader陣列明確刪除對象仍然訪問:

preLoader.splice(i-1,1); 
+0

我以爲所有的DOM相關的功能(像append)實際採取的參數,並在內存中創建一個新的對象,只爲DOM,然後附加它?所以,例如,如果在追加到DOM之後,我會這樣做:$('div#'+ i).css(width:0),它只會將它應用於DOM中的元素,而不是存儲在我的元素中數組,因爲它們是不同的實體。或者他們是否真的指向了內存中的相同地址,因此修改其中一個,會修改另一個地址? – 2012-07-28 17:42:35

+0

@paulsmith看,jQuery只是一個簡單的使用'DOM'的機制。實際上只有'DOM'和'DOMElement's。所以,當你從'DOM'中移除'DOMElement'時(無論使用jQuery還是其他),它們將不會從jQuery包裝中移除,它存在於'preLoader'數組中, DOMElement'。 – Engineer 2012-07-28 17:55:14

+0

@paulsmith,回答你的問題:「$('div#'+ i).css(width:0),它只會將它應用於DOM中的元素」。不,它也會適用於陣列中的元素。連接到DOM的元素與數組中的元素相同。在下面檢查我的答案。 – devundef 2012-07-28 18:19:32

1

DOM中的對象是相同的。如果您想再次重複使用相同的標記,你應該叫

$(div#i).detach(); 

從jQuery的文檔:

的.detach()方法是一樣的一個.remove(),不同之處在於.detach()保留與刪除的元素相關聯的所有jQuery數據。此方法在以後將被移除的元素重新插入DOM時非常有用。

如果您使用.remove(),您將失去與元素相關聯的事件和數據。但即使使用remove(),也可以通過再次調用.appendTo()來重用相同的元素。

小提琴手的例子:http://jsfiddle.net/sKRCF/1 (抱歉,關於警報,這是簡單的方法)。