Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Thiago Stopa

Acúmulo de memória

Recommended Posts

Olá pessoal,

 

Esta é a primeira vez que posto algo aqui, portanto se eu fizer alguma coisa errada, peço desculpa antecipadamente.

 

Estou tentando fazer um script em javascript que funciona mais ou menos como aquele lightbox para quem já viu, para quem não sabe do que estou falando, seria o seguinte: tenho uma página html e tenho um link qualquer... quando a pessoa clica nesse link, uma <div> é inserida nessa página, cobrindo todo o corpo da página, porém a div não é totalmente opaca, ela é preta transparente, o que dá um efeito de escurecimento no site. Aí por cima desta div eu apresentaria fotos ou qualquer outra coisa, e quando a pessoa clicar nessa div, ela é retirada da página fazendo a página voltar a "cor normal".

 

Eu até consegui fazer isso tudo, porém notei que cada vez que o efeito é executado, posso ver no 'Gerenciador de tarefas' do windows que o Internet Explorer aumenta o uso de memória em 5kb... imagino que deva ser pelo fato de que variáveis foram criadas, a div foi inserida na página, etc... porém quando o usuário clica na div e ela é retirada da página, pelo menos na minha forma de pensar, estas variáveis deveriam ser retiradas da memória (se é que o problema é esse)... mas ao invés disso a div some e o consumo de memória no Gerenciador de tarefas permanece o mesmo, e se a pessoa clica denovo no link... mais 5kb são usados e assim por diante...

 

Gostaria de saber se alguém poderia me ajudar a descobrir o porque disso e como resolver o problema.

Seguem os códigos do programinha:

 

index.html

---------------------------------------------------------------------------------------------------------------------------------------------

<html><head><link href="estilos.css" rel="stylesheet" type="text/css" media="screen">	<script type="text/javascript" src="controles.js"></script></head><body id="corpo">	<a href="java script:void(null);" onClick="java script:div(1,20,80);">Teste</a>	</body></html>

controles.js

---------------------------------------------------------------------------------------------------------------------------------------------

//Javascriptfunction div(o,x,y) {	var altura;	var largura;	var local;		local = document.all.corpo;		var div = new criarDiv(local);	div.mostrarDiv(); 		var box = document.getElementById('box');		if(o==0) {		//		//	Efeito de transição		//		div.moverDiv(x,y);	}		if(o==1) {		//		//	Efeito de escurecimento		//		div.escurecerDiv(x,y);	}		box.onclick = function() {		div.removerDiv();	}}//// Cria a div//function criarDiv(local) {	//	// Definição dos atributos da div	//	var div;		//	// Método construtor	//	function construirDiv(local) {				//		// Cria a div		//		div = document.createElement("div");		div.setAttribute('id','box');		//		// Pega os estilos da div		//		var estilo = div.style;				//		// Aplicando os estilos		//		estilo.position = "absolute";		estilo.top = 0;		estilo.left = 0;		estilo.height = "100%";		estilo.width = "100%";		estilo.border = "solid 1px #000000";		estilo.background = "#000000";		estilo.filter = "alpha(opacity=75)";	}		//	// Exibe a div	//	this.mostrarDiv = function() {		local.appendChild(div);	}		//	// Remove a div do local	//	this.removerDiv = function() {		try{			local.removeChild(div);		}		catch(e){}	}		//	// Atualiza a div	//	function atualizarDiv() {		removerDiv();		mostrarDiv();	}		//	// Redimensiona a Div	//	function redimensionarDiv(largura,altura) {		div.style.height = altura;		div.style.width = largura;	}		//	// Escurece a div	//	this.escurecerDiv = function(velocidade,opacidade) {		div.style.filter = "alpha(opacity=0)";				while(velocidade <= opacidade) {			velocidade += velocidade;			div.style.filter = "alpha(opacity="+velocidade+")";		}		div.style.filter = "alpha(opacity="+opacidade+")";	}		//	// Move a div	//	this.moverDiv = function(velocidade,opacidade) {		div.style.filter = "alpha(opacity="+opacidade+")";		var valor = div.offsetWidth;		var posicao = -valor;		div.style.left = posicao;			while(posicao <= 0) {			posicao += velocidade;			div.style.left = posicao;		}		div.style.left = 0;	}	construirDiv(local);}
estilos.css

---------------------------------------------------------------------------------------------------------------------------------------------

/*CSS*/body{	margin:0;	padding:0;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

e ae stopa,

 

dei uma olhada por cima no codigo,

acredito q mudando algumas linhas no codigo você consiga resolver seu problema.

 

acontece q, toda vez q você chama a funcao, você da um var div = new criarDiv(local);

o problema ai eh o new, você cria um novo objeto na memoria.

 

e quando manda fechar local.removeChild(div);

esta retirando o objeto div da visualizacao da tela... mas nao destruindo ele na memoria.

 

entao, como você ja viu, ele vai acumulando objeto em cima de objeto na memoria.

 

você tem as seguintes opcoes agora,

apos remover da child o objeto div, você pode destruir ele.

 

ou, cria um unico objeto div ao iniciar a pagina, e no momento de exibir,

apenas mostra o objeto global criado ao iniciar a pagina,

ai na hora de sumir, eh soh deixar como esta, retirando apenas do elemento child.

 

ou, antes de criar o objeto ali no inicio do codigo, coloque um if para saber se ele ja existe.

se existir apenas exibe, senao cria e exibe. e o resto fica como esta.

 

faça sua escolha e coloca pra quebrar.

 

ah! e o problema de colocar varios objetos na memoria, se você prestar atencao,

e deixar o navegador um tempinho parado, ele mesmo identifica as variaveis q nao

estao sendo usadas e descarta para liberar memoria.

 

era isso,

sucesso ai,

Compartilhar este post


Link para o post
Compartilhar em outros sites

e ae Thiago,

 

fiquei curioso com seu problema, e fiz umas pesquisas pela internet.

 

e delete div deveria funcionar, ate onde eu sei...

se nao funcionou, eh pq tem alguem usando o objeto, alguma outra referencia no codigo.

 

por exemplo, você criou uma variavel chamada local, q recebe document.all.corpo.

talvez aquele acumulo de memoria nao esteja na new Div... e sim em na variavel local.

eh dificil saber.

 

eu vi em uma pagina da IBM, q outras pessoas ja tiveram esse tipo de problema,

e pra resolver eles tiveram q mudar a implementacao do codigo.

provavelmente tentaram retirar da memoria e tb nao conseguiram... alias,

parece q nao conseguem pq o IE nao deixa, nao da acesso ao garbage collection.

entao, soh refazendo o codigo pra tentar otimizar o uso da memoria.

 

esta em ingles, nao sei se você consegue se virar por la:

http://www-128.ibm.com/developerworks/web/...ary/wa-memleak/

 

ate o exemplo 5 eles mostram como fazer errado...

o exemplo 6, 7 e 8 eh uma solucao para os exemplos anteriores.

 

foi o q eu entendi tb, meus ingles tb nao eh la essas coisas.

sucesso ai,

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.