MouseOver Studio

MouseOver Studio header image 2

O que fazer quando innerHTML não é suficientemente rápido?

September 17th, 2007 por Diego Carrion · 3 comentários

Durante o desenvolvimento de RegexPal, Steven Levithan notou que ao utilizar a propriedade innerHTML de um elemento se perde muito tempo limpando os elementos filhos em comparação a criação dos novos.

Conhecendo isso podemos combinar a velocidade de destruir elementos tirando o elemento pai ao utilizar os métodos do DOM com criar novos elementos utilizando innerHTML.

Foi assim que uma solução foi sugerida e devido a participação dos leitores nos comentários foi melhorada notavelmente. DrSlump percebeu que mesmo a função sendo bem mais rápida que o innerHTML no Firefox, no IE era mais lenta e recomendou uma compilação condicional. Por sua parte, Dean Edwards sugeriu a utilização do método cloneNode para poder transferir todos os atributos de um elemento pra outro. Ao final a função ficou assim:

function replaceHtml(element, html) {
	var oldElement =
			(typeof element === "string" ? document.getElementById(element): element);
	/*@cc_on // innerHTML puro e mais rápido em IE
		oldElement.innerHTML = html;
		return oldElement;
	@*/
	var newElement = oldElement.cloneNode(false);
	newElement.innerHTML = html;
	oldElement.parentNode.replaceChild(newElement, oldElement);
	/* Como acabamos de remover o elemento antigo do DOM, retornar uma referenca
	ao novo elemento, o qual pode ser utilizado para restaurar referencias da variable */
	return newElement;
};

Para testar os resultados podem acessar a página criada pelo mesmo Steven.

Tags: JavaScript · otimização

3 respostas ate agora ↓

  • 1 Rodrigo Fante // Sep 18, 2007 at 5:08 am

    Interessante mesmo.

  • 2 Micox // Oct 10, 2007 at 5:46 pm

    Um grande achado. Vai pra minha lib.
    Valeu por compartilhar. Continua ae.

  • 3 Jed Riggs // Nov 12, 2008 at 7:31 pm

    ws7i6jpkxe6hfktj

Deixar um comentário