From 4c68d391dd1d218a69e0f211ffbb503f30d9eb62 Mon Sep 17 00:00:00 2001 From: Cristian Carlesso Date: Thu, 12 Apr 2012 20:31:13 +0200 Subject: [PATCH] Fix IE leaks caused by ._fireEvent circular reference changed empty, now it uses destroy to clean every children tree this change need a check on destroy, because childNodes returns textNodes on dispose i removed the _fireEvent reference breaking the circular reference and allowing the gc to clean up the memory (tested with sIEve-0.0.8) set('html',...) don't leak but set('text',...) does, so added a Element.Properties.text setter and done empty() before setting the text I setup a test page that creates 1000 divs, added these divs to the body and then use empty(), set('html', ...) and set('text', ...) to get rid of them, causing a 1000 element leak, with these changes I managed to drop the leaks from 1000 to 0. --- Source/Element/Element.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Source/Element/Element.js b/Source/Element/Element.js index e35f68b11..4d3008b09 100644 --- a/Source/Element/Element.js +++ b/Source/Element/Element.js @@ -800,6 +800,7 @@ var formProps = {input: 'checked', option: 'selected', textarea: 'value'}; Element.implement({ destroy: function(){ + if(! this.getElementsByTagName) return null; //textNode var children = clean(this).getElementsByTagName('*'); Array.each(children, clean); Element.dispose(this); @@ -807,11 +808,12 @@ Element.implement({ }, empty: function(){ - Array.from(this.childNodes).each(Element.dispose); + Array.from(this.childNodes).each(Element.destroy); return this; }, dispose: function(){ + this._fireEvent = null; return (this.parentNode) ? this.parentNode.removeChild(this) : this; }, @@ -949,6 +951,13 @@ Element.Properties.html = { }; +// fix for IE leak on Element.set('text','') +Element.Properties.text = { + set: function(text){ + Element.prototype.empty.call(this).setProperty('text',text); + } +} + var supportsHTML5Elements, supportsTableInnerHTML, supportsTRInnerHTML; /**/