¿Cómo renderizar HTML en cadena con Javascript?

3 minutos de lectura

Tengo el siguiente código javascript:

var html="<div class="col-lg-4 col-references" idreference=""+response+'"><span class="optionsRefer"><i class="glyphicon glyphicon-remove delRefer" style="color:red; cursor:pointer;" data-toggle="modal" data-target="#modalDel"></i><i class="glyphicon glyphicon-pencil editRefer" data-toggle="modal" data-target="#modalRefer" style="cursor:pointer;"></i></span><div id="contentRefer'+response+'">'+refer_summary+'</div><span id="nameRefer'+response+'">'+refer_name+'</span></div>';
$("#references").append(html);

Cuando se ejecuta este código, el refer_summary variable en realidad contiene una cadena que puede contener etiquetas HTML como <b>, <i> etc., sin embargo, esas etiquetas se muestran en la página en lugar de representar su comportamiento.

Por ejemplo, en la página mostraría <b> en lugar de hacer el contenido en negrita.

¿Cómo puedo procesar las etiquetas HTML cuando se agrega el valor?

En mi plantilla de Django uso {% autoescape off %}{{content}}{% endautoescape %} entonces, cuando cargo la página por primera vez, el contenido se representa correctamente con negrita, etc. Pero, ¿cómo puedo hacer lo mismo al agregar el html desde javascript?

¡Gracias por la ayuda!

  • Suena como un ataque XSS esperando a suceder.

    –Robby Cornelissen

    25 de enero de 2017 a las 4:59

Avatar de usuario de Shubham Sureka
Shubham Sureka

Puedes renderizar HTML usando documento.escribir()

document.write('<html><body><h2>HTML</h2></body></html>');

Pero para agregar una cadena HTML existente, debe obtener la identificación del nodo/etiqueta bajo el cual desea insertar su cadena HTML.

Hay dos formas en las que puedes lograr esto:

  1. Usando DOM –
var tag_id = document.getElementById('tagid');
var newNode = document.createElement('p');
newNode.appendChild(document.createTextNode('html string'));
  1. Usando HTML interno –
var tag_id = document.getElementById('tagid');
tag_id.innerHTML = 'HTML string';

  • La ventaja de 2 es que no hay nuevo elemento/dom como con write y se crea 1. Parece una solución pura.

    – Timo

    31 de marzo de 2021 a las 18:19

  • Debe agregarse para mayor claridad que en 1 y 2, cualquier marcado HTML contenido en el 'html string' será de hecho analizado y convertido a DOM nodos. Así que esto es una forma de hacer crecer el DOM, no solo para insertar cadenas de texto.

    –Marcin Wojnarski

    11 de agosto de 2021 a las 22:57

Use $.parseHTML antes de agregar html como

var html="<div class="col-lg-4 col-references" idreference=""+response+'"><span class="optionsRefer"><i class="glyphicon glyphicon-remove delRefer" style="color:red; cursor:pointer;" data-toggle="modal" data-target="#modalDel"></i><i class="glyphicon glyphicon-pencil editRefer" data-toggle="modal" data-target="#modalRefer" style="cursor:pointer;"></i></span><div id="contentRefer'+response+'">'+refer_summary+'</div><span id="nameRefer'+response+'">'+refer_name+'</span></div>';
html = $.parseHTML( html);
$("#references").append(html);

  • Los otros enfoques no me funcionaron en Outsystems, pero este fue perfecto. Gracias.

    – Souza

    21 de febrero de 2020 a las 14:51

Puedes usar Javascript document.createRange().createContextualFragment:

const frag = document.createRange().createContextualFragment('<div>One</div><div>Two</div>');
console.log(frag);

/*
  #document-fragment
    <div>One</div>
    <div>Two</div>
*/

https://davidwalsh.name/convert-html-stings-dom-nodos

Si desea hacerlo en ReactJS, puede usar el atributo “dangerouslySetInnerHTML”, en lugar del atributo “innerHTML”.

Como permite a los atacantes inyectar códigos (XSS), ¡se llama peligroso!

const myHtmlData = `
    <ul>
        <li>Item1<li>
        <li>Item2<li>
    </ul>`;
...
<div
    dangerouslySetInnerHTML={{
        __html: myHtmlData
}}>

Debe asignar una identificación a un div en particular y luego procesar/cambiar la interfaz de usuario en el div específico en consecuencia.

Dado aquí es una excelente explicacion.

¿Ha sido útil esta solución?