Cómo agregar esta cadena HTML
var str = '<p>Just some <span>text</span> here</p>';
al DIV con el ID 'test'
que está en el DOM?
(Por cierto div.innerHTML += str;
no es aceptable).
Cómo agregar esta cadena HTML
var str = '<p>Just some <span>text</span> here</p>';
al DIV con el ID 'test'
que está en el DOM?
(Por cierto div.innerHTML += str;
no es aceptable).
Respuestas:
Úselo insertAdjacentHTML
si está disponible; de lo contrario, use algún tipo de respaldo. insertAdherentHTML es compatible con todos los navegadores actuales .
div.insertAdjacentHTML( 'beforeend', str );
Demostración en vivo: http://jsfiddle.net/euQ5n/
insertAdjacentHTML
es más rápido que agregar a innerHTML
, porque insertAdjacentHTML
no serializa ni analiza los elementos secundarios existentes del elemento.
insertAdjacentHTML
mantiene los valores de los elementos de formulario alterados, mientras que agregar a innerHTML
reconstruye el elemento y pierde todo el contexto del formulario.
¿Es esto aceptable?
var child = document.createElement('div');
child.innerHTML = str;
child = child.firstChild;
document.getElementById('test').appendChild(child);
jsFiddle .
Sin embargo , la respuesta de Neil es una solución mejor.
innerHTML
?
insertAdjacentHTML
.
AppendChild
(E) es más del doble de rápido que otras soluciones en Chrome y Safari, insertAdjacentHTML
(F) es más rápido en Firefox. La innerHTML=
(B) (no confundir con +=
(A)) es la segunda solución rápida en todos los navegadores y es mucho más útil que E y F.
Configurar entorno (2019.07.10) MacOs High Sierra 10.13.4 en Chrome 75.0.3770 (64 bits), Safari 11.1.0 (13604.5.6), Firefox 67.0.0 (64 bits)
Puede reproducir la prueba en su máquina aquí
La idea es usar innerHTML
en un elemento intermediario y luego mover todos sus nodos secundarios a donde realmente los desea appendChild
.
var target = document.getElementById('test');
var str = '<p>Just some <span>text</span> here</p>';
var temp = document.createElement('div');
temp.innerHTML = str;
while (temp.firstChild) {
target.appendChild(temp.firstChild);
}
Esto evita eliminar cualquier controlador de eventos, div#test
pero aún le permite agregar una cadena de HTML.
La forma correcta es usar insertAdjacentHTML
. En Firefox anterior a la 8, puede volver a usarlo Range.createContextualFragment
si str
no contiene script
etiquetas.
Si str
contiene script
etiquetas, debe eliminar script
elementos del fragmento devuelto por createContextualFragment
antes de insertar el fragmento. De lo contrario, se ejecutarán los scripts. ( insertAdjacentHTML
marca los scripts como no ejecutables).
createContextualFragment
. Estaba buscando una manera de hacer que algunas inclusiones html con scripts se ejecuten solo si el usuario acepta configurar una cookie.
Hack rápido :
<script>
document.children[0].innerHTML="<h1>QUICK_HACK</h1>";
</script>
Casos de uso :
1: Guarde como archivo .html y ejecútelo en Chrome o Firefox o Edge. (IE no funcionará)
2: usar en http://js.do
En acción: http://js.do/HeavyMetalCookies/quick_hack
Desglosado con comentarios:
<script>
//: The message "QUICK_HACK"
//: wrapped in a header #1 tag.
var text = "<h1>QUICK_HACK</h1>";
//: It's a quick hack, so I don't
//: care where it goes on the document,
//: just as long as I can see it.
//: Since I am doing this quick hack in
//: an empty file or scratchpad,
//: it should be visible.
var child = document.children[0];
//: Set the html content of your child
//: to the message you want to see on screen.
child.innerHTML = text;
</script>
Razón por la que publiqué:
JS.do tiene dos elementos imprescindibles:
Pero no muestra mensajes de console.log. Vine aquí buscando una solución rápida. Solo quiero ver los resultados de algunas líneas de código del bloc de notas, las otras soluciones son demasiado trabajo.
¿Por qué eso no es aceptable?
document.getElementById('test').innerHTML += str
sería la forma de libro de texto de hacerlo.
#test
. Eso generalmente no es deseable.
Esto puede resolver
document.getElementById("list-input-email").insertAdjacentHTML('beforeend', '<div class=""><input type="text" name="" value="" class="" /></div>');
InnerHTML borra todos los datos como eventos para los nodos existentes
append child con firstChild agrega solo el primer niño a innerHTML. Por ejemplo, si tenemos que agregar:
<p>text1</p><p>text2</p>
solo aparecerá el texto1
¿Qué pasa con esto?
agrega una etiqueta especial a innerHTML agregando child y luego edita externalHTML eliminando la etiqueta que hemos creado. No sé qué tan inteligente es, pero funciona para mí o puede cambiar outerHTML a innerHTML para que no tenga que usar la función reemplazar
function append(element, str)
{
var child = document.createElement('someshittyuniquetag');
child.innerHTML = str;
element.appendChild(child);
child.outerHTML = child.outerHTML.replace(/<\/?someshittyuniquetag>/, '');
// or Even child.outerHTML = child.innerHTML
}
<div id="testit">
This text is inside the div
<button onclick="append(document.getElementById('testit'), '<button>dadasasdas</button>')">To div</button>
<button onclick="append(this, 'some text')">to this</button>
</div>
Más corto : 18 caracteres (no confundir +=
(mencionado por OP) con =
más detalles aquí )
test.innerHTML=str
innerHTML
coloca la cadena en el elemento (reemplazando a todos los hijos), mientras que lainsertAdjacentHTML
coloca (1) antes del elemento, (2) después del elemento, (3) dentro del elemento antes del primer hijo o (4) dentro del elemento después del último hijo.