Ver Mensaje Individual
  #24 (permalink)  
Antiguo 06/02/2011, 14:47
Avatar de Panino5001
Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 5 meses
Puntos: 834
Respuesta: Crear objeto THIS

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(typefn ) {
            if ( 
this.addEventListener ) {
                
this.addEventListenertypefnfalse );
            } else if(
this.attachEvent){
                var 
_this=this;
                var 
f= function(){fn.call(_this,window.event);}
                
this.attachEvent'on'+typef);
                
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(typefn ) {
            if( 
this.removeEventListener){
                
this.removeEventListenertypefnfalse );
            }
            else if(
this.detachEvent){
                
this.detachEvent('on'+type,this[fn.toString()+type]);
                
this[fn.toString()+type]=null;
            }
            else{
                  
this['on'+type]=function(){};
            }
            for (var 
ii0l=window.EvRegister.lengthii ii++) {
                if (
window.EvRegister[ii]._evType== type && window.EvRegister[ii]._obj==this && window.EvRegister[ii]._fn==fn) {
                    
window.EvRegister.splice(ii1);
                    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.