Até agora, nós modificamos um monte
de elementos existentes na página.
Mas e se quiséssemos adicionar
novos elementos na página?
Poderíamos fazer isso com 'innerHTML',
escrevendo o HTML para as tags
dentro da cadeia de caracteres que
passamos, como fizemos aqui.
Isso pode ficar um pouco bagunçado,
especialmente se você quer criar
múltiplas tags com diferentes
atributos, estilos e classes.
Então, em vez disso, podemos usar um
conjunto inteiro de métodos de documento
para criar novos elementos do zero
e adicioná-los na página.
Vamos dizer que queremos adicionar
uma imagem de um gato na página
porque nós não achamos
que tem o suficiente ainda.
O primeiro passo é criar esse
novo elemento '< img >' , certo?
Nós queremos criá-lo.
Então vamos começar criando
uma variável para guardá-lo, catEl
E então vamos usar
document.createElement
e passar o nome da tag
que estamos criando, img.
Então agora você pode imaginar que
o navegador fez uma tag de imagem, assim.
E está flutuando no espaço em algum lugar.
Próximo passo é atribuir uma fonte a ele.
Então, catEl.src é igual a...
e vamos pegar nossa fonte daqui de cima.
- deveríamos adiciona um alt para fazer
essa imagem mais acessível -
não andei fazendo isso, mas deveria
sempre ter alt tags em nossas imagens.
Então agora você pode imaginar que essa
tag '< image >' que nós fizemos
tem um 'src' e também tem
um 'alt = "Foto de um gato fofo".
Então isso é o que fizemos
usando JavaScript aqui.
A tag '< img >' que fizemos
ainda está flutuando no espaço
porque nós não dissemos
ao navegar onde colocá-la.
E há tantos lugares diferentes
em nosso DOM em que ela poderia ir.
Vamos fazer a coisa mais fácil e apenas
fazer ela aparecer no final da página.
Podemos fazer isso colocando ela
no final da tag '< body >', então dizemos:
document.body.appendChild(catEl);
Aí está ela!
É bem grande também.
Gato muito grande - assustador.
Você pode chamar 'appendChild' em
qualquer nó DOM existente em sua página
e isso fará o elemento passado
o filho final desse nó.
Isso é onde realmente ajuda
visualizar o DOM como uma árvore.
A tag '< body >' é um nó nessa árvore
e tem um monte de filhos
como '< h1 >' e '< p1 >'
e você está adicionando mais
um filho no final de seus filhos.
Então, na verdade, ela estaria depois
da tag '< script >', logo aqui.
Usando métodos DOM, você deveria em teoria
ser capaz de adicionar elementos
em qualquer lugar dentro da árvore DOM.
Apenas colocamos no lugar
mais fácil e mais óbvio.
Vamos fazer mais um exemplo.
Usamos 'innerHTL' aqui embaixo para pôr
a tag '< strong >' dentro de '< span >'.
Em vez disso, poderíamos
usar 'createElement'.
var strongEl =
document.createElement("strong");
E eu escrevi errado
e a grafia é muito importante.
Então isso cria uma tag '< strong >'
vazia, flutuando no espaço.
Então, a primeira coisa que vamos
fazer é definir o seu texto.
strongEl.textContent = "cat";
Certo?
Alternativamente, na verdade,
poderíamos fazer essa coisa onde
criamos o que é conhecido
como um 'textNode'.
Muitos nós DOM na árvore DOM podem
ter tipos especiais de nós, 'textNode's,
como seus filhos.
E esses nós não são elementos mas
eles ainda são nós na árvore DOM.
Nós chamamos eles de
"nós folhas" porque eles são
a última coisa mesmo
que pode ter em uma árvore.
var strongText =
document.createTextNode("cat");
E vamos apenas passar o texto, "cat".
Se usarmos essa técnica, nós agora
criamos dois nós que estão flutuando
no espaço: uma tag '< strong >'
e então esse 'textNode',
que apenas diz "cat".
E nós precisamos conectá-los um ao outro.
E queremos a tag '< strong >'
para ser o pai de "cat".
Então o que vamos fazer é dizer
'strongEl.appendChild(strongText);'
Então agora nós temos a tag
'< strong >' com "cat" dentro,
e temos que colocá-la onde queremos
porque ela ainda está flutuando no espaço.
Nós estamos dentro do loop for
para 'nameEls', e cada 'nameEl'
está onde queremos colocar
a tag '< strong >'.
Então aqui,
'nameEls[i].appendChild(strongEl);'
E agora nós vemos duplicado
porque eu deixei o jeito antigo.
Ali está adicionando à tag '< span >'
que já tem uma tag '< strong >' nela.
Poderíamos mudar essa linha para
'innerHTML' é igual a uma string vazia
que vai efetivamente limpar a span
antes de adicionarmos a ela.
Agora como você viu, isso levou muito mais
linhas de código que a versão 'innerHTML'.
Então, por quê fizemos isso?
Bem, muitos desenvolvedores não gostam
de modificar o documento desse jeito
porque precisa de muito mais código.
A maioria dos desenvolvedores usa
bibliotecas, como jQuery,
para fazer modificações no DOM por eles,
o que provê funções que
fazem o mesmo código com muito menos
linhas para você como o desenvolvedor
porque você está usando as
funções da biblioteca no lugar.
Gosto de escrever meu código desse jeito
porque eu gosto de poder
ver exatamente como estou modificando
a árvore DOM, uma linha por vez.
E me parece mais limpo que empurrar tudo
dentro de uma string de innerHTML.
Mas talvez você odeie.
De qualquer forma, agora
você sabe que existe.
Então você pode usar se precisar
e você consegue entender
o que bibliotecas como jQuery estão
realmente fazendo por trás dos panos.
[Legendado por: Alberto Oliveira]
[Revisado por: Fernando dos Reis]