比方說,在我的webapp啓動之前,我想先創建所有dom元素並將它們存儲在某個預加載的數組中。例如:javascript內存問題
for (i = 1...100) { preLoader.push($('<div id="' + i + '" />')); }
然後,根據操作,我將從數組中取出正確的元素並將其附加到DOM。
現在我的問題是:如果我以後怎麼辦:
$(div#i).remove()
將它也會影響我的預加載器陣列,或者是一個比DOM中的不同的參考?
比方說,在我的webapp啓動之前,我想先創建所有dom元素並將它們存儲在某個預加載的數組中。例如:javascript內存問題
for (i = 1...100) { preLoader.push($('<div id="' + i + '" />')); }
然後,根據操作,我將從數組中取出正確的元素並將其附加到DOM。
現在我的問題是:如果我以後怎麼辦:
$(div#i).remove()
將它也會影響我的預加載器陣列,或者是一個比DOM中的不同的參考?
將它也會影響我的預加載器陣列
不,它不會。對象將被從內存中移除,僅當且僅當沒有辦法訪問它時,即沒有對它的引用。 $('div#'+i).remove()
後,你不能從DOM訪問它,但你可以通過preLoader[i-1]
。所以你需要從preLoader
陣列明確刪除對象仍然訪問:
preLoader.splice(i-1,1);
DOM中的對象是相同的。如果您想再次重複使用相同的標記,你應該叫
$(div#i).detach();
從jQuery的文檔:
的.detach()方法是一樣的一個.remove(),不同之處在於.detach()保留與刪除的元素相關聯的所有jQuery數據。此方法在以後將被移除的元素重新插入DOM時非常有用。
如果您使用.remove(),您將失去與元素相關聯的事件和數據。但即使使用remove(),也可以通過再次調用.appendTo()來重用相同的元素。
小提琴手的例子:http://jsfiddle.net/sKRCF/1 (抱歉,關於警報,這是簡單的方法)。
我以爲所有的DOM相關的功能(像append)實際採取的參數,並在內存中創建一個新的對象,只爲DOM,然後附加它?所以,例如,如果在追加到DOM之後,我會這樣做:$('div#'+ i).css(width:0),它只會將它應用於DOM中的元素,而不是存儲在我的元素中數組,因爲它們是不同的實體。或者他們是否真的指向了內存中的相同地址,因此修改其中一個,會修改另一個地址? – 2012-07-28 17:42:35
@paulsmith看,jQuery只是一個簡單的使用'DOM'的機制。實際上只有'DOM'和'DOMElement's。所以,當你從'DOM'中移除'DOMElement'時(無論使用jQuery還是其他),它們將不會從jQuery包裝中移除,它存在於'preLoader'數組中, DOMElement'。 – Engineer 2012-07-28 17:55:14
@paulsmith,回答你的問題:「$('div#'+ i).css(width:0),它只會將它應用於DOM中的元素」。不,它也會適用於陣列中的元素。連接到DOM的元素與數組中的元素相同。在下面檢查我的答案。 – devundef 2012-07-28 18:19:32