Agregar contenido HTML al elemento HTML existente mediante JavaScript
-
Inconveniente de usar
InnerHTML
para agregar un nuevo nodo HTML - Agregar contenido HTML sin reemplazar los elementos DOM
-
Uso de
appendChild()
para agregar contenido HTML en JavaScript -
Uso de
insertAdjectedHTML()
para agregar un nodo HTML
Agregar contenido HTML a un div u otro elemento HTML con javascript es fácil. Podemos establecer la propiedad HTMLElement.innerHTML
del elemento con el nuevo contenido HTML. Pero durante el proceso, borrará todos los atributos dinámicos agregados.
Inconveniente de usar InnerHTML
para agregar un nuevo nodo HTML
- El
HTMLElement.innerHTML
funciona eliminando el contenido HTML dentro del elemento y luego volviéndolo a agregar con la nueva pieza de HTML incluida en él. En esencia, reemplaza el contenido HTML en lugar de simplemente agregar uno nuevo. - Cuando agregamos un nuevo elemento HTML al DOM con la propiedad
innerHTML
, también eliminará todos los nodos descendientes y luego los reemplazará con los nuevos nodos construidos al analizar el nuevo contenido HTML (la cadena HTML que se asigna ainnerHTML
propiedad) y renderice todo el HTML de nuevo. - No se sabe mucho que al utilizar
innerHTML
en un proyecto que se somete a una revisión de ciberseguridad, el código puede ser rechazado. Es aconsejable no utilizarinnerHTMl
directamente, ya que puede tener un riesgo potencial de seguridad (para obtener más detalles, consulte el enlace MDN).
Agregar contenido HTML sin reemplazar los elementos DOM
Para agregar un fragmento de código HTML a nuestro DOM existente, podemos usar las siguientes funciones incorporadas de javascript sin tener el temor de perder cualquier contenido dinámico ya adjunto con ellas.
appendChild()
insertAdjacentHTML()
Uso de appendChild()
para agregar contenido HTML en JavaScript
appendChild()
tiene el mismo propósito que el innerHTML
. Podemos usar ambos métodos para agregar contenido HTML a un nodo. La diferencia entre los dos enfoques es que appendChild()
es una función, mientras que innerHTML
es una propiedad. appendChild()
agregará un nodo al elemento DOM existente en lugar de reemplazar el contenido del DOM como lo hace la propiedad 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);
}
Hemos creado un formulario para capturar el name
y la address
del usuario utilizando el código anterior. La dirección suele tener más de una línea. Por lo tanto, hemos creado un botón que agrega nuevos campos de entrada cuando se hace clic para capturar estas líneas de dirección adicionales. A continuación se muestra el proceso seguido para crear un nuevo campo de entrada.
- Llamamos a la función
addAddressLine
en el evento de clic del botónAdd Address Line
. - En la función, creamos HTML
input
dinámicamente con la funcióndocument.createElement('input')
. Devuelve el elemento deinput
creado que se almacenó en la variablei
. - A continuación, establecemos los atributos
type
yplaceholder
a la variableinput
creada con el métodosetAttribute()
. - Tenemos el elemento
input
listo para ser agregado a la estructuradiv
existente. Por lo tanto, consultamos laaddress
div
usandodocuemnt.getElementById()
que devuelve la estructura div como un todo y luego usamos la funciónappendChild(i)
de JavaScript. - La función
appendChild(i)
agrega el elementoinput
creado dinámicamente en poder de la variablei
y lo coloca al final de laaddress
div
. UsamoslineCount
para incrementar el valor del marcador de posición cada vez que agregamos un nuevo campo de entrada.
Nota
- También podemos usar el método más nuevo
append()
para agregar el elemento creado al DOM. El método javascriptappend
nos permite utilizar DOMString (textos de cadena simple) como argumento y no devuelve ningún valor. Tenga en cuenta que el navegador Internet Explorer no admite el métodoappend()
más reciente. - Todos los navegadores web modernos, incluido Internet Explorer, admiten la función anterior
appendChild()
.
Uso de insertAdjectedHTML()
para agregar un nodo HTML
Las funciones appendChild()
e incluso append()
son capaces de agregar nuevos elementos al nodo HTML dado. Ambos métodos insertan el elemento después del último hijo. Puede que no sea útil para todos los escenarios. Especialmente si deseamos agregar el nodo HTML en una posición específica en la estructura HTML. Para tales casos, se puede utilizar la función insertAdjectedHTML()
. Se necesitan un par de parámetros, la posición y el texto en esa posición.
-
Posición
:insertarHTML adyacente
admite cuatro valores en el parámetro de posición.beforebegin
: Para insertar el nodo HTML antes del inicio del elemento.afterbegin
: como sugiere el nombre, esta opción inserta el elemento justo después de la etiqueta de apertura del nodo seleccionado y lo coloca antes del primer hijo.beforeend
: Éste es similar alappendChild()
. Como sugiere el nombre, la posiciónbeforeend
coloca el elemento justo después del último hijo.afterend
: se refiere a la posición después de que se cierra la etiqueta de nodo HTML de destino.
-
String
: Podemos insertar el HTML en formato string como segundo parámetro. Por ejemplo:<div> Hello World!</div>
.
De un vistazo, la representación es la siguiente.
<!-- beforebegin -->
<div>
<!-- afterbegin -->
<p>
<!-- beforeend -->
</div>
<!-- afterend -->
Veamos el mismo ejemplo que discutimos para appendChild()
con la función insertAdjectedHTML()
de 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);
}
En este código, hemos utilizado la opción beforeend
en el parámetro para agregar el elemento de entrada creado dinámicamente al final del div address
. Puede intentar jugar con los otros atributos como los parámetros afterend
, beforebegin
y afterbegin
.