寫jQuery代碼是,經常會做清空一個標簽內容的操作。那么你是怎么做的呢?比如
<div id="box"> <p>星期一</p> <p>星期二</p> <p>星期三</p> <p>星期四</p> <p>星期五</p> <p>星期六</p> <p>星期天</p> </div>
我們要清除掉box中的所有元素。
你可能會好不猶豫的寫下代碼:
$('#box').html('');
首先必須承認,這么寫能實現清空box的效果。
但是,這么寫不好。因為這么寫有可能會引起內存泄露。
何謂內存泄露?就是你的程序由於某種原因,占用了過多的內存空間,並且,在你不需要使用這些內存空間之后,仍然無法釋放掉這些內存空間;當你由此占用的空間越來越多,達到一定程度后,就有可能引起程序崩潰;此所謂內存泄露。
那問題來了,這個$obj.html('')方法為啥會引起內存泄露?(ps:這里的$obj表示一個jQuery對象)
$obj.html('')只清空該對象的內部元素,但是不會清楚注冊在內部元素上的事件。
比如上例中,如果div#box里的p標簽上還注冊有事件,那么這些事件代碼當然要占用內存。如果你使用$('#box').html('')來清空所有的p,那么box的內容確實被清空了,但是注冊在這些p標簽上的事件代碼並沒有被清理掉,這些事件代碼仍然保留在內存里,並且無法得到釋放。
解決之道:使用empty()
$('#box').empty();
empty()會清空一切,包括那些被清理掉的元素身上注冊的事件,這樣就防止發生內存泄露。
ps:你可能會說,現在內存動不動都4G,8G,你要是因為這卡了,是你電腦太爛。你非要這么說,我也無話可說。不過話說回來了,有更好的,正確的,為啥不用呢?勿以善小而不為嘛