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.
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