Come aggiungere questa stringa HTML
var str = '<p>Just some <span>text</span> here</p>';
al DIV con l'ID 'test'che è nel DOM?
(Btw div.innerHTML += str;non è accettabile.)
Come aggiungere questa stringa HTML
var str = '<p>Just some <span>text</span> here</p>';
al DIV con l'ID 'test'che è nel DOM?
(Btw div.innerHTML += str;non è accettabile.)
Risposte:
Usa insertAdjacentHTMLse è disponibile, altrimenti usa una sorta di fallback. insertAdjacentHTML è supportato in tutti i browser correnti .
div.insertAdjacentHTML( 'beforeend', str );
Demo dal vivo: http://jsfiddle.net/euQ5n/
insertAdjacentHTMLè più veloce dell'aggiunta a innerHTML, perché insertAdjacentHTMLnon serializza e analizza gli elementi secondari esistenti dell'elemento.
insertAdjacentHTMLmantiene i valori degli elementi del modulo modificati, mentre l'aggiunta a innerHTMLricostruisce l'elemento e perde tutto il contesto del modulo.
È accettabile?
var child = document.createElement('div');
child.innerHTML = str;
child = child.firstChild;
document.getElementById('test').appendChild(child);
jsFiddle .
Ma , la risposta di Neil è una soluzione migliore.
innerHTML ?
insertAdjacentHTML.
AppendChild(E) è più di 2 volte più veloce di altre soluzioni su Chrome e Safari, insertAdjacentHTML(F) è più veloce su Firefox. La innerHTML=(B) (da non confondere con +=(A)) è la seconda soluzione veloce su tutti i browser ed è molto più utile di E ed F.
Configurazione dell'ambiente (2019.07.10) MacOs High Sierra 10.13.4 su Chrome 75.0.3770 (64 bit), Safari 11.1.0 (13604.5.6), Firefox 67.0.0 (64 bit)
Puoi riprodurre il test nella tua macchina qui
L'idea è di utilizzare innerHTMLun elemento intermedio e quindi spostare tutti i suoi nodi figlio dove li vuoi veramente 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);
}
Ciò evita di cancellare tutti i gestori di eventi div#testma consente comunque di aggiungere una stringa di HTML.
Il modo giusto è usare insertAdjacentHTML. In Firefox precedente a 8, puoi tornare a utilizzare Range.createContextualFragmentse strnon contiene scripttag.
Se i tag strcontiene script, è necessario rimuovere gli scriptelementi dal frammento restituito da createContextualFragmentprima di inserire il frammento. Altrimenti, gli script verranno eseguiti. ( insertAdjacentHTMLcontrassegna gli script come non eseguibili.)
createContextualFragment . Stavo cercando un modo per eseguire alcuni include html con script solo se l'utente accetta di impostare un cookie.
Hack rapido :
<script>
document.children[0].innerHTML="<h1>QUICK_HACK</h1>";
</script>
Casi d'uso :
1: salva come file .html ed esegui in chrome, firefox o edge. (IE non funzionerà)
2: utilizzare in http://js.do
In azione: http://js.do/HeavyMetalCookies/quick_hack
Suddiviso con commenti:
<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>
Motivo per cui ho pubblicato:
JS.do ha due must have:
Ma non mostra i messaggi console.log. Sono venuto qui cercando una soluzione rapida. Voglio solo vedere i risultati di poche righe di codice per appunti, le altre soluzioni sono troppo impegnative.
Perché non è accettabile?
document.getElementById('test').innerHTML += str
sarebbe il modo da manuale di farlo.
#testperò. Questo generalmente non è desiderabile.
Questo può risolvere
document.getElementById("list-input-email").insertAdjacentHTML('beforeend', '<div class=""><input type="text" name="" value="" class="" /></div>');
InnerHTML cancella tutti i dati come eventi per i nodi esistenti
aggiungi figlio con firstChild aggiunge solo il primo figlio a innerHTML. Ad esempio, se dobbiamo aggiungere:
<p>text1</p><p>text2</p>
solo text1 verrà visualizzato
Che dire di questo:
aggiunge un tag speciale a innerHTML accodando il figlio e quindi modifica outerHTML eliminando il tag che abbiamo creato. Non so quanto sia intelligente ma per me funziona o potresti cambiare outerHTML in innerHTML in modo che non debba usare la funzione di sostituzione
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>
Più breve - 18 caratteri (non confondere +=(menzione da OP) con =maggiori dettagli qui )
test.innerHTML=str
innerHTMLinserisce la stringa nell'elemento (sostituendo tutti i figli), mentre lainsertAdjacentHTMLmette (1) prima dell'elemento, (2) dopo l'elemento, (3) all'interno dell'elemento prima del primo figlio o (4) all'interno dell'elemento dopo l'ultimo figlio.