I attached a demo file and two prototype 1.6 files...
The fixed version was made by myself, but you can user the prototype version 1.5 that also does not have the leak.
I have added a line to the Event.createWrapper
method, as follow
function createWrapper(element, eventName, handler) {
var id = getEventID(element);
var c = getWrappersForEventName(id, eventName);
if (c.pluck("handler").include(handler)) return false;
var wrapper = function(event) {
if (!Event || !Event.extend ||
(event.eventName && event.eventName != eventName))
return false;
Event.extend(event);
handler.call(element, event)
};
wrapper.element = element; // added
wrapper.handler = handler;
c.push(wrapper);
return wrapper;
}
Added an unloadCache, similar to v1.5:
function unloadCache() {
for (var id in cache)
for (var eventName in cache[id]) {
var els = cache[id][eventName];
for (var i = 0; i < els.length; i++) {
var wrapper = els[i];
Event.stopObserving(wrapper.element, eventName, wrapper.handler);
}
}
};
Changed the unload hook to this:
window.attachEvent("onunload", unloadCache);