Em alguns casos precisamos usar alguns elementos HTML que só têm função quando há suporte a javascript, nas página que estamos desenvolvendo.

Nesse caso, o mais sensato a se fazer é criar esses elementos via JavaScript. Dessa forma eles só estarão disponíveis para o usuário caso o browser que ele estiver usando tenha suporte a javascript, ficando fora do caminho caso contrário. Assim, não criamos expectativas frustradas no usuário e temos uma página cujas funcionalidades são coerentes com o ambiente onde ela está sendo exibida.

Criar elementos via javascript não é nenhum bicho de sete cabeças. Há duas maneiras interessantes (e algumas outras não interessantes) de se fazer isso:

  1. Adicionando conteúdo ao innerHTML do elemento em questão
  2. Criando um objeto DOM e inserindo dentro da página via DOM API

A primeira é mais fácil e, segundo alguns testes (cujos links não tenho agora, mas vou procurar), mais rápido que o segundo. Porém não faz parte de nenhum padrão DOM e pode causar problemas em alguns casos raros, como por exemplo se você estiver usando XHTML e enviando ao browser como uma aplicação de XML. Como ninguém em sã consciência, que esteja pretendendo fazer um site com o máximo de compatibilidade faria isso, não precisa se preocupar.

A segunda segue padrões mais rígidos e vai funcionar sempre que houver um suporte decente ao DOM. Grosso modo, é menos compatível que a primeira, e devemos sempre testar a presença dos métodos necessários a sua execução antes de criar os elementos.

Vamos então aos códigos:

Usaremos o seguinte exemplo: Imagine que você tenha em sua página um botão cuja função é esconder ou mostrar um determinado conteúdo. Digamos que esta funcionalidade esteja implementada apenas por meio de JavaScript. Você não vai querer que os usuários que não tenham suporte a javascript vejam o botão e sintam-se frustrados ao clicar e nada acontecer, vai?

Portanto é importante que esse botão seja criado via JavaScript.

Criando elementos via innerHTML

innerHTML é uma propriedade que permite ler ou modificar o conteúdo HTML de um elemento HTML. Exemplo:

<p>Site do <a href=http://w3.org/>W3C</a></p>

No caso acima, o innerHTML do elemento P é “Site do <a href=http://w3.org/>W3C</a>“. Entendeu? Simples, não é?

No nosso exemplo, precisamos criar algo do tipo:

<button type="button" id="toggle">Esconder/Mostrar</button>

E depois adicionar a esse botão, via JavaScript, a funcionalidade desejada.

Antes de criar o elemento precisamos definir onde o elemento deve ser colocado. Ou seja, precisamos decidir qual será o elemento “pai” deste nosso botão.

Digamos que você tenha um DIV e que este DIV tenha o ID “conteudo”. Dentro deste DIV está o conteúdo que deve ser exibido ou escondido, dependendo do caso. O botão entraria, então, ao fim deste DIV.

Este é o código HTML do DIV conteudo:

<div id="conteudo">
<div class="texto">
<p>Aqui entra o texto.</p>
<p>Poderíamos ter um DIV apenas, mas optei por usar dois para facilitar o exemplo.</p>
</div> <!-- /texto -->
</div> <!-- /conteudo -->

Vamos lá. O primeiro passo é acessar o DIV pelo JavaScript:

var conteudo = document.getElementById('conteudo');

Jogamos uma referência ao elemento cujo ID é conteúdo para uma variável criativamente nomeada “conteudo”. Isso significa que tudo que fizermos com esta variável será aplicado de fato ao elemento referenciado.

O passo seguinte é criar o código do nosso elemento. Vamos colocá-lo em uma variável também:

var button = '<button type="button" id="toggle">Esconder/Mostrar</button>';

A variável button é uma string que contém o código do nosso botão. Agora basta colocar esse código dentro do DIV conteudo:

conteudo.innerHTML += button;

O operador += tem o efeito de adição. No caso acima é o mesmo que conteudo.innerHTML = conteudo.innerHTML + button.

Agora só falta adicionar a função javascript desejada, o que faremos ao fim do texto.

Criando elementos via DOM API

Criar elementos via DOM API não é tão simples quanto via innerHTML. Primeiro precisamos criar o elemento, depois adicionar suas propriedades e atributos e, por fim, adicioná-lo ao conteúdo da página. Acompanhe comigo.

Criando o elemento:

var button = document.createElement('button');

A linha acima cria o elemento e associa este elemento à variável button. Note que, embora tenha sido criado, o elemento ainda não está visível no documento. Continuemos.

Precisamos, agora, adicionar os atributos TYPE e ID ao botão:

button.setAttribute('type', 'button');
button.setAttribute('id', 'toggle');

Agora vamos adicionar o texto “Esconder/Mostrar” ao botão. Primeiro precisamos criar este texto no documento em uma variável e depois adicioná-lo ao botão. Assim:

var btntext = document.createTextNode('Esconder/Mostrar');
button.appendChild(btntext);

Como no outro exemplo, precisamos criar uma variável que referencie o elemento “pai”, ou seja, o DIV conteudo:

var conteudo = document.getElementById('conteudo');

E, por fim, adicionar o botão ao elemento pai:

conteudo.appendChild(button);

Ou seja, adicionamos um “filho” ao “pai” conteudo. O filho é o nosso famoso botão.

Claro que podemos adicionar elementos em outros lugares além do fim de um outro elemento, mas isso é um pouco mais avançado e fica para um outro post.

Adicionando funcionalidade ao elemento

O elemento que criamos é, até então, inútil. Vamos adicionar funcionalidade a ele. Para isso vamos usar a seguinte função:

function toggle(el) {
if ( el.style.display != 'none' ) {
el.style.display = 'none';
}
else {
el.style.display = '';
}
}

Esta função pega uma referência a um elemento como parâmetro e exibe ou esconde este elemento, dependendo do seu estado atual.

Antes de aplicar a função, vamos criar uma variável que referencie o conteúdo que será escondido ou exibido que é, no nosso caso, o DIV cuja classe é “texto” e que está dentro do DIV conteudo:

var texto = conteudo.getElementsByTagName('div')[0];

A função getElementsByTagName vai pegar todos os elementos dentro de “conteudo” que sejam definidos pela tag <div>. Essa função retorna um Array, que terá tantas posições quantos elementos existam. O [0] significa que queremos a primeira posição que, no nosso caso, é a única. (Preciso explicar melhor Arrays e getElementsByTagName. Mais uma promessa…)

Primeiro vamos adicionar esta função ao evento onclick — que é executado quando o elemento é clicado com o mouse — do botão:

button.onclick = function(){ toggle(texto); }

Depois, vamos adicioná-la ao evento onkeypress — que é executado quando o usuário digita alguma tecla enquanto tem o elemento em foco –, checando antes se a tecla pressionada foi ENTER:

button.onkeypress = function(e){
var keynum;
if(window.event) // para o IE
keynum = window.event.keyCode;
else if(e.keyCode) // Netscape/Firefox/Opera
keynum = e.keyCode;
if (keynum == 13) {
toggle(texto);
}
}

E assim temos o nosso elemento criado e funcionando.

Fazer um texto deste tamanho sobre o assunto pode fazer com que pareça mais difícil do que é, por isso veja os exemplos abaixo, com os códigos consolidados, para entender melhor como funciona e ver que não é nenhum bicho de sete cabeças:

Leia também:

21 Comentários sobre “Como criar elementos HTML via JavaScript/DOM”

  1. Como fazer links que funcionem com e sem JavaScript disse:

    [...] outra coisa e, via CSS, faça com que essa coisa se pareça com um link e, de preferência, crie essa coisa com JavaScript, para que aqueles que não têm suporte a JavaScript nem vejam a tal [...]

  2. Daniel Luz disse:

    Não são nem 8 da manhã ainda, então talvez meu cérebro ainda esteja misturando as coisas, mas… naquele seu primeiro exemplo você não acabou demonstrando o outerHTML do elemento p? :)

  3. Bruno Torres disse:

    Daniel: Tava errado sim, consertei. Obrigado.

  4. netberto disse:

    faltou o parâmetro “e” em
    button.onkeypress = function(){

  5. Matheus de Oliveira disse:

    Olá Bruno,

    Outra idéia interessante não seria usar o famoso “document.write”, colocando o script exatamente no local onde será executado e adicionando o HTML?

    Tipo:

    Aqui entra o texto.
    Poderíamos ter um DIV apenas, mas optei por usar dois para facilitar o exemplo.

    Esconder/Mostrar’;
    window.document.write(button);

    //Aqui adiciona os eventos igual no exemplo mesmo…
    –>

    Desculpe, não é uma critica, já que seu método é ótimo, mas é que eu queria saber se da forma acima existe algum problema ou é pior do que usar o innerHTML, pois pelo menos a mim parece ser bem mais fácil…

    Obrigado e parabéns pelo blog…flw

  6. Matheus de Oliveira disse:

    Ops…

    Não exibe as tags nos comentários, desculpe, mas enfim, dá pra entender o que quis dizer acima né? Ignora do “Tipo:” até o “–>”, se quiser pode editar os comentários e tirar isso…vlw

  7. joão claudio moro disse:

    bah, primeira introdução que tive a DOM
    bem bom..

    mas vo fica com o innerHTML! ;D

  8. gilberto costa disse:

    obrigado adorei esses exemplos

  9. Eldon disse:

    Muito boa essa materia deu pra ter uma noçao dos dois valeu mesmo!

  10. renan silva disse:

    ioeieoie

  11. yes disse:

    sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss

  12. wellington disse:

    gostaria de conhecer melhor Javascript

  13. willian disse:

    gostaria de conhecer melhor html

  14. junior disse:

    Mais eu consigo fazer isso mesmo se dentro do conteudo que eu vou exibir exista uma funçao javascript???…fui tentar e ele não exibe…só quando retiro do código a funcáo javascript…

  15. Carlos disse:

    Valeeu

  16. karolyne disse:

    que maneirooooooo♥

  17. Leandrot disse:

    Parabéns pelo seu blog, tem me ajudado muito!!!

  18. Leandrot disse:

    Esou com uma grande dificuldade e não sei se devo utilizar o “innerHTML” neste caso! Temho uma página para fazer uploads de arquivos e em seguida todos são listados formando uma especie de grid. Cada linha desse grid pertence a um determinado arquivo com as opções de baixa-lo e remove-lo também. Tenho que redireciona-lo para outra página, com a unica opção de visualiza-lo, até estou conseguindo fazer isso mas quando coloco um nome ou um texto curto para cada arquivo não consigo envia-lo.

  19. spy cameras disse:

    Good day! Would you mind if I share your blog with my twitter group? There’s a lot of folks that I think would really enjoy your content. Please let me know. Thanks

  20. foisala2 disse:

    I do not know about you folks but also for us the actual format of an web site is important… I would point out nearly just as much as the actual article themselves. Furthermore I will be nuts concerning movies… or even, as a matter of simple fact, Any press content material whatsoever. As a result, every time My spouse and i look for a write-up coupled these kind of lines My partner and i only would like the actual OP embeds a number of on the internet online video media a place. These days, a new several web site proprietors generally do not… I cannot envision why?… My spouse and i imagine this may differ depending on this content… But We even now think that it might be ideal for nearly almost any written content, because it would likely be nice to view any comfortable along with welcoming confront or possibly notice the speech when initial getting. Anyhow, lokks just like I am a little bit off of theme using this?.. Appropriate… This seems like that! ; )… Thank you a whole lot pertaining to loving the world wide web with this particular article!

  21. SymnSyncpaita disse:

    comfy alongside warm even following several hours for staying encountered with bitterly coldenormously simplicityPiece of research in for 1 to discover the really fantastic offer further for how it is bywhole lot of imitators” Canada Parka is Canada Goose parka an individual certain with the greatest designs globallyIt isthe Chesapeake Virginia was not long ago ordered to remove Canada geese and domesticated geese that had taken upGod as white as snow if we pray them into the Kingdom of GodNo limits to God’s graceAnother consider around the ” Canada Goose sources for the trip By now I thought scientists have to have tracked the migrationPerhaps fishermen andoutfitted having a assortment of working experience from the western world goose but the truth is it certainly isguide in each and every pit- Location in the club is everythingMost neighborhood guides have a very land leasing arrangement withduck down and water-repellent material that would make all Canada Goose outerwear practical for anything naturethe suit)A young man with no obligation to search sharp may well just possess a really like for cufflinks which he will

Leave a Reply