So hängen Sie diese HTML-Zeichenfolge an
var str = '<p>Just some <span>text</span> here</p>';
zum DIV mit der ID, 'test'
die sich im DOM befindet?
(Übrigens div.innerHTML += str;
ist nicht akzeptabel.)
So hängen Sie diese HTML-Zeichenfolge an
var str = '<p>Just some <span>text</span> here</p>';
zum DIV mit der ID, 'test'
die sich im DOM befindet?
(Übrigens div.innerHTML += str;
ist nicht akzeptabel.)
Antworten:
Verwenden Sie, insertAdjacentHTML
wenn es verfügbar ist, andernfalls verwenden Sie eine Art Fallback. insertAdjacentHTML wird in allen aktuellen Browsern unterstützt .
div.insertAdjacentHTML( 'beforeend', str );
Live-Demo: http://jsfiddle.net/euQ5n/
insertAdjacentHTML
ist schneller als das Anhängen an innerHTML
, da insertAdjacentHTML
die vorhandenen untergeordneten Elemente des Elements nicht serialisiert und analysiert werden.
insertAdjacentHTML
auch die Werte geänderter Formularelemente bei, während das Anhängen an innerHTML
das Element neu erstellt wird und der gesamte Formularkontext verloren geht.
Ist das akzeptabel?
var child = document.createElement('div');
child.innerHTML = str;
child = child.firstChild;
document.getElementById('test').appendChild(child);
jsFiddle .
Aber , Neil Antwort ist eine bessere Lösung.
innerHTML
?
insertAdjacentHTML
.
AppendChild
(E) ist mehr als 2x schneller als andere Lösungen auf Chrom und Safari, insertAdjacentHTML
(F) ist auf Firefox am schnellsten. Das innerHTML=
(B) (nicht mit +=
(A) verwechseln ) ist die zweitschnelle Lösung in allen Browsern und viel praktischer als E und F.
Einrichtungsumgebung (2019.07.10) MacOs High Sierra 10.13.4 auf Chrome 75.0.3770 (64-Bit), Safari 11.1.0 (13604.5.6), Firefox 67.0.0 (64-Bit)
Sie können Test in Ihrem Gerät abspielen hier
Die Idee ist, innerHTML
ein Zwischenelement zu verwenden und dann alle untergeordneten Knoten an die Stelle zu verschieben, über die Sie sie wirklich möchten 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);
}
Auf diese Weise wird vermieden, dass Ereignishandler gelöscht werden div#test
, Sie können jedoch eine HTML-Zeichenfolge anhängen.
Der richtige Weg ist mit insertAdjacentHTML
. In Firefox vor 8 können Sie auf die Verwendung zurückgreifen, Range.createContextualFragment
wenn Ihre str
keine script
Tags enthält .
Wenn Ihr Tag Tags str
enthält script
, müssen Sie script
Elemente aus dem von zurückgegebenen Fragment entfernen, createContextualFragment
bevor Sie das Fragment einfügen. Andernfalls werden die Skripte ausgeführt. ( insertAdjacentHTML
Markiert Skripte als nicht ausführbar.)
createContextualFragment
. Ich habe nach einer Möglichkeit gesucht, einige HTML-Includes mit Skripten nur dann auszuführen, wenn der Benutzer dem Setzen eines Cookies zustimmt.
Schneller Hack :
<script>
document.children[0].innerHTML="<h1>QUICK_HACK</h1>";
</script>
Anwendungsfälle :
1: Als HTML-Datei speichern und in Chrome, Firefox oder Edge ausführen. (IE wird nicht funktionieren)
2: Verwenden Sie in http://js.do
In Aktion: http://js.do/HeavyMetalCookies/quick_hack
Aufgeschlüsselt mit Kommentaren:
<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>
Grund warum ich gepostet habe:
JS.do hat zwei Must-Haves:
Zeigt jedoch keine console.log-Nachrichten an. Kam hierher auf der Suche nach einer schnellen Lösung. Ich möchte nur die Ergebnisse einiger Zeilen Scratchpad-Code sehen, die anderen Lösungen sind zu viel Arbeit.
Warum ist das nicht akzeptabel?
document.getElementById('test').innerHTML += str
wäre das Lehrbuch, wie man es macht.
#test
. Das ist im Allgemeinen nicht wünschenswert.
Dies kann lösen
document.getElementById("list-input-email").insertAdjacentHTML('beforeend', '<div class=""><input type="text" name="" value="" class="" /></div>');
InnerHTML löscht alle Daten wie Ereignisse für vorhandene Knoten
Kind mit firstChild anhängen fügt innerHTML nur das erste Kind hinzu. Zum Beispiel, wenn wir anhängen müssen:
<p>text1</p><p>text2</p>
Es wird nur Text1 angezeigt
Was ist damit:
Fügt innerHTML ein spezielles Tag hinzu, indem Sie ein Kind anhängen, und bearbeiten Sie dann OuterHTML, indem Sie das von uns erstellte Tag löschen. Ich weiß nicht, wie schlau es ist, aber es funktioniert für mich, oder Sie können OuterHTML in InnerHTML ändern, sodass keine Funktion zum Ersetzen verwendet werden muss
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>
Kürzeste - 18 Zeichen (nicht zu verwechseln +=
(Erwähnung durch OP) mit =
weiteren Details hier )
test.innerHTML=str
innerHTML
Setzt die Zeichenfolge in das Element (ersetzt alle untergeordneten Elemente), währendinsertAdjacentHTML
sie (1) vor dem Element, (2) nach dem Element, (3) innerhalb des Elements vor dem ersten untergeordneten Element oder (4) platziert wird. innerhalb des Elements nach dem letzten Kind.