diff --git a/CHANGELOG b/CHANGELOG index f23ae4eff..dbbd267b8 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +* Add event cleanup on Element#update and Element#replace so that replaced content does not leak memory. (jddalton, Andrew Dupont) + * Loop through all elements and remove all handlers on page unload. IE needs this in order to prevent memory leaks. (kangax, jddalton, Andrew Dupont) * Fix issue where IE fails to GC when the page is navigated away from before it's done loading. (jddalton, Andrew Dupont) diff --git a/src/dom.js b/src/dom.js index e9b878c40..39d933feb 100644 --- a/src/dom.js +++ b/src/dom.js @@ -877,6 +877,27 @@ else if (Prototype.Browser.IE) { onchange: v._getEv }); })(Element._attributeTranslations.read.values); + + // Wrap Element#update and Element#replace to clean up event handlers on + // newly-removed elements. Prevents memory leaks in IE. + Element._purgeObservers = function(element, includeRoot) { + Element.select(element, '*').each(Event.stopObserving); + if (includeRoot === true) Event.stopObserving(element); + }; + + Element.Methods.update = Element.Methods.update.wrap( + function(proceed, element, contents) { + Element._purgeObservers(element, false); + return proceed(element, contents); + } + ); + + Element.Methods.replace = Element.Methods.replace.wrap( + function(proceed, element, contents) { + Element._purgeObservers(element, true); + return proceed(element, contents); + } + ); } else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {