Como anexar esta string HTML
var str = '<p>Just some <span>text</span> here</p>';
para o DIV com o ID 'test'
que está no DOM?
(Btw div.innerHTML += str;
não é aceitável.)
Como anexar esta string HTML
var str = '<p>Just some <span>text</span> here</p>';
para o DIV com o ID 'test'
que está no DOM?
(Btw div.innerHTML += str;
não é aceitável.)
Respostas:
Use insertAdjacentHTML
se estiver disponível, caso contrário, use algum tipo de reserva. insertAdjacentHTML é compatível com todos os navegadores atuais .
div.insertAdjacentHTML( 'beforeend', str );
Demonstração ao vivo: http://jsfiddle.net/euQ5n/
insertAdjacentHTML
é mais rápido do que anexar a innerHTML
, porque insertAdjacentHTML
não serializa e reanalisa os filhos existentes do elemento.
insertAdjacentHTML
mantém os valores dos elementos alterados do formulário, ao passo que anexar para innerHTML
reconstruir o elemento e perder todo o contexto do formulário.
Isso é aceitável?
var child = document.createElement('div');
child.innerHTML = str;
child = child.firstChild;
document.getElementById('test').appendChild(child);
jsFiddle .
Mas , a resposta de Neil é uma solução melhor.
innerHTML
?
insertAdjacentHTML
.
AppendChild
(E) é mais de 2x mais rápido do que outras soluções no Chrome e Safari, insertAdjacentHTML
(F) é mais rápido no Firefox. O innerHTML=
(B) (não confunda com +=
(A)) é a segunda solução rápida em todos os navegadores e é muito mais prático do que E e F.
Ambiente de configuração (10/07/2019) MacOs High Sierra 10.13.4 no Chrome 75.0.3770 (64 bits), Safari 11.1.0 (13604.5.6), Firefox 67.0.0 (64 bits)
Você pode reproduzir o teste em sua máquina aqui
A ideia é usar innerHTML
em um elemento intermediário e, em seguida, mover todos os seus nós filhos para onde você realmente os deseja 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);
}
Isso evita apagar qualquer manipulador de eventos, div#test
mas ainda permite que você anexe uma string de HTML.
O jeito certo é usar insertAdjacentHTML
. No Firefox anterior ao 8, você pode voltar a usar Range.createContextualFragment
se str
não contiver script
tags.
Se o seu str
contém script
tags, você precisa remover os script
elementos do fragmento retornado por createContextualFragment
antes de inserir o fragmento. Caso contrário, os scripts serão executados. ( insertAdjacentHTML
marca os scripts como não executáveis.)
createContextualFragment
. Eu estava procurando uma maneira de fazer alguns inclusões de html com scripts executados apenas se o usuário concordar em definir um cookie.
Hack rápido :
<script>
document.children[0].innerHTML="<h1>QUICK_HACK</h1>";
</script>
Casos de uso :
1: Salve como arquivo .html e execute em chrome ou firefox ou edge. (IE não funciona)
2: Use em http://js.do
Em ação: http://js.do/HeavyMetalCookies/quick_hack
Dividido com comentários:
<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ão pela qual postei:
JS.do tem dois itens obrigatórios:
Mas não mostra mensagens console.log. Vim aqui em busca de uma solução rápida. Eu só quero ver os resultados de algumas linhas de código do scratchpad, as outras soluções dão muito trabalho.
Por que isso não é aceitável?
document.getElementById('test').innerHTML += str
seria a maneira clássica de fazer isso.
#test
embora. Isso geralmente não é desejável.
Isso pode resolver
document.getElementById("list-input-email").insertAdjacentHTML('beforeend', '<div class=""><input type="text" name="" value="" class="" /></div>');
InnerHTML limpa todos os dados como eventos para nós existentes
anexar filho com firstChild adiciona apenas o primeiro filho a innerHTML. Por exemplo, se tivermos que acrescentar:
<p>text1</p><p>text2</p>
apenas text1 irá aparecer
Que tal isso:
adiciona tag especial a innerHTML anexando filho e, em seguida, edita outerHTML excluindo a tag que criamos. Não sei o quão inteligente é, mas funciona para mim ou você pode alterar outerHTML para innerHTML para que não precise usar a função substituir
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>
Mais curto - 18 caracteres (não confunda +=
(menção por OP) com =
mais detalhes aqui )
test.innerHTML=str
innerHTML
coloca a string no elemento (substituindo todos os filhos), enquantoinsertAdjacentHTML
coloca (1) antes do elemento, (2) depois do elemento, (3) dentro do elemento antes do primeiro filho ou (4) dentro do elemento após o último filho.