Anexar conteúdo HTML ao elemento HTML existente usando JavaScript
-
Desvantagem de usar
InnerHTMLpara adicionar um novo nó HTML - Adicionar conteúdo HTML sem substituir os elementos DOM
-
Usando
appendChild()para acrescentar conteúdo HTML em JavaScript -
Usando
insertAdjacentHTML()para adicionar o nó HTML
Adicionar conteúdo HTML a um div ou outro elemento HTML com javascript é fácil. Podemos definir a propriedade HTMLElement.innerHTML do elemento com o novo conteúdo HTML. Mas durante o processo, ele apagará todos os atributos dinâmicos adicionados a ele.
Desvantagem de usar InnerHTML para adicionar um novo nó HTML
- O
HTMLElement.innerHTMLfunciona excluindo o conteúdo HTML dentro do elemento e, em seguida, adicionando-o novamente com o novo pedaço de HTML incluído nele. Em essência, ele substitui o conteúdo HTML em vez de apenas adicionar um novo. - Quando adicionamos um novo elemento HTML ao DOM com a propriedade
innerHTML, ele também remove todos os nós descendentes e os substitui pelos novos nós construídos analisando o novo conteúdo HTML (a string HTML que é atribuída à propriedadeinnerHTML) e renderizar todo o HTML novamente. - Não é muito conhecido que ao usar
innerHTMLem um projeto que passa por uma revisão de segurança cibernética, o código pode ser rejeitado. É aconselhável não usarinnerHTMldiretamente, pois pode apresentar um risco de segurança potencial (para obter mais detalhes, consulte o link MDN).
Adicionar conteúdo HTML sem substituir os elementos DOM
Para adicionar um pedaço de código HTML ao nosso DOM existente, podemos usar as seguintes funções integradas do javascript sem medo de perder qualquer conteúdo dinâmico já anexado a elas.
appendChild()insertAdjacentHTML()
Usando appendChild() para acrescentar conteúdo HTML em JavaScript
appendChild() tem o mesmo propósito que o innerHTML. Podemos usar esses dois métodos para adicionar conteúdo HTML a um nó. A diferença entre as duas abordagens é que appendChild() é uma função, enquanto innerHTML é uma propriedade. appendChild() adicionará um nó ao elemento DOM existente em vez de substituir o conteúdo do DOM como feito pela propriedade innerHTML.
<div>
<div>User Details</div>
<div>
<label>Name:</label>
<input type="text" id="name" placeholder="Name">
</div>
<div id="adress">
<label>Address:</label>
<input type="text" id="contact" placeholder="Address">
</div>
<button id="add_address" onclick="addAddressLine()">Add Address Line</button>
</div>
var lineCount = 0;
addAddressLine = function() {
var i = document.createElement('input');
i.setAttribute('type', 'text');
i.setAttribute('placeholder', 'Address Line ' + ++lineCount);
var addressContainer = document.getElementById('adress');
addressContainer.appendChild(i);
}
Criamos um formulário para capturar o name e address do usuário usando o código acima. O endereço geralmente tem mais de uma linha. Portanto, criamos um botão que adiciona novos campos de entrada quando clicado para capturar essas linhas de endereço adicionais. A seguir está o processo seguido para criar um novo campo de entrada.
- Chamamos a função
addAddressLineno evento click do botãoAdd Address Line. - Na função, criamos HTML
inputdinamicamente com a funçãodocument.createElement('input'). Ele retorna o elementoinputcriado que é armazenado na variáveli. - Em seguida, definimos os atributos
typeeplaceholderpara a variávelinputcriada com o métodosetAttribute(). - Temos o elemento
inputpronto para ser adicionado à estruturadivexistente. Portanto, consultamos oaddressdivusandodocuemnt.getElementById()que retorna a estrutura div como um todo e, em seguida, usamos a funçãoappendChild(i)do JavaScript. - A função
appendChild(i)adiciona o elementoinputcriado dinamicamente mantido pela variávelie o coloca no final doaddressdiv. UsamoslineCountpara incrementar o valor do marcador cada vez que adicionamos um novo campo de entrada.
Observação
- Também podemos usar o método mais recente
append()para anexar o elemento criado ao DOM. O método javascriptappendnos permite usar DOMString (textos de string simples) como um argumento e não retorna nenhum valor. Esteja ciente de que o navegador Internet Explorer não oferece suporte ao métodoappend()mais recente. - Todos os navegadores modernos, incluindo o Internet Explorer, suportam a função
appendChild()mais antiga.
Usando insertAdjacentHTML() para adicionar o nó HTML
As funções appendChild() e até mesmo as funções append() são capazes de adicionar novos elementos a um determinado nó HTML. Ambos os métodos inserem o elemento após o último filho. Pode não ser útil para todos os cenários. Especialmente se quisermos adicionar o nó HTML em uma posição especificada na estrutura HTML. Para tais casos, a função insertAdjacentHTML() pode ser usada. Leva alguns parâmetros, a posição e o texto nessa posição.
-
Position:insertAdjacentHTMLsuporta quatro valores no parâmetro de posição.beforebegin: para inserir o nó HTML antes do início do elemento.afterbegin: Como o nome sugere, esta opção insere o elemento logo após a tag de abertura do nó selecionado e o coloca antes do primeiro filho.beforeend: Este é semelhante aoappendChild(). Como o nome sugere, a posiçãobeforeendcoloca o elemento logo após o último filho.afterend: refere-se à posição após o fechamento da tag do nó HTML de destino.
-
String: podemos inserir o HTML no formato de string como um segundo parâmetro. Por exemplo:<div> Hello World!</div>.
À primeira vista, a representação é a seguinte.
<!-- beforebegin -->
<div>
<!-- afterbegin -->
<p>
<!-- beforeend -->
</div>
<!-- afterend -->
Vejamos o mesmo exemplo que discutimos para appendChild() com a função insertAdjacentHTML() do JavaScript.
<div>
<div>User Details</div>
<div>
<label>Name:</label>
<input type="text" id="name" placeholder="Name">
</div>
<div id="address">
<label>Address:</label>
<input type="text" id="contact" placeholder="Address">
</div>
<button id="add_address" onclick="addAddressLine()">Add Address Line</button>
</div>
var lineCount = 0;
addAddressLine = function() {
var i = document.createElement('input');
i.setAttribute('type', 'text');
i.setAttribute('placeholder', 'Address Line ' + ++lineCount);
var addressContainer = document.getElementById('adress');
addressContainer.insertAdjacentElement('beforeend', i);
}
Neste código, usamos a opção beforeend no parâmetro para anexar o elemento de entrada criado dinamicamente no final do div address. Você pode tentar brincar com os outros atributos, como os parâmetros afterend, beforebegin e afterbegin.