Isabel, el problema de memoria al que hacés referencia ocurría en Explorer 6. No estoy seguro que ocurra en las versiones siguientes. No obstante, lo que se hace para evitarlo es agregar una función al evento onunload que desatache todos los eventos asignados.
Un ejemplo:
Código PHP:
var panino=(function(){
/* ---- métodos privados ---- */
var metodosPrivados={
addEvent: function(type, fn ) {
if ( this.addEventListener ) {
this.addEventListener( type, fn, false );
} else if(this.attachEvent){
var _this=this;
var f= function(){fn.call(_this,window.event);}
this.attachEvent( 'on'+type, f);
this[fn.toString()+type]=f;
}else{
this['on'+type]=fn;
}
var ev={_obj:this,_evType:type,_fn:fn};
window.EvRegister=window.EvRegister || [];
window.EvRegister.push(ev);
return this;
},
removeEvent: function(type, fn ) {
if( this.removeEventListener){
this.removeEventListener( type, fn, false );
}
else if(this.detachEvent){
this.detachEvent('on'+type,this[fn.toString()+type]);
this[fn.toString()+type]=null;
}
else{
this['on'+type]=function(){};
}
for (var ii= 0, l=window.EvRegister.length; ii < l ; ii++) {
if (window.EvRegister[ii]._evType== type && window.EvRegister[ii]._obj==this && window.EvRegister[ii]._fn==fn) {
window.EvRegister.splice(ii, 1);
break;
}
}
return this;
},
extendido:true
}
/* ---- métodos públicos ---- */
return{
extend:function(el,obj){
if(el.extendido && el!=metodosPrivados)return el;
for(var i in obj)
el[i]=obj[i];
return el;
},
get:function(id){
if(!document.getElementById(id))return false;
return panino.extend(document.getElementById(id),metodosPrivados);
},
getO:function(obj){
return panino.extend(obj,metodosPrivados);
},
add:function(obj){
panino.extend(metodosPrivados,obj);
},
unregisterAllEvents:function(){
if(window.EvRegister)
while (window.EvRegister.length > 0) {
panino.getO(window.EvRegister[0]._obj).removeEvent(window.EvRegister[0]._evType,window.EvRegister[0]._fn);
}
window.EvRegister=null;
for(var i=0;el=document.getElementsByTagName('*')[i];i++)
if(el.extendido)
for(var ii in metodosPrivados)
el[ii]=null;
panino=null;
}
}
})();
var $=panino.get;
panino.getO(window).addEvent('unload',panino.unregisterAllEvents);
Fijate cómo por cada evento asignado se guarda un objeto en la variable EvRegister y luego se utilizan esos objetos para remover los eventos durante el evento unload.