So hängen Sie einen HTML-String wie z
var str="<p>Just some <span>text</span> here</p>";
zum <div>
mit der ID test
?
(Übrigens div.innerHTML += str;
Das ist nicht akzeptabel.)
Sime Vidas
So hängen Sie einen HTML-String wie z
var str="<p>Just some <span>text</span> here</p>";
zum <div>
mit der ID test
?
(Übrigens div.innerHTML += str;
Das ist nicht akzeptabel.)
Neil
Verwenden insertAdjacentHTML
welcher wird in allen aktuellen Browsern unterstützt:
div.insertAdjacentHTML( 'beforeend', str );
Der Positionsparameter beforeend
fügt innerhalb des Elements nach seinem letzten Kind hinzu.
Live-Demo: http://jsfiddle.net/euQ5n/
@alex Es ist das gleiche Konzept: Analysieren einer HTML-Zeichenfolge und Einfügen in das DOM. Aber die Funktionalität ist anders – innerHTML
fügt die Zeichenfolge in das Element ein (wobei alle untergeordneten Elemente ersetzt werden), während insertAdjacentHTML
platziert es (1) vor dem Element, (2) nach dem Element, (3) innerhalb des Elements vor dem ersten untergeordneten Element oder (4) innerhalb des Elements nach dem letzten untergeordneten Element.
– Sime Vidas
6. September 2011 um 23:14 Uhr
@Alex insertAdjacentHTML
ist schneller als das Anhängen an innerHTML
da insertAdjacentHTML
serialisiert und analysiert die vorhandenen untergeordneten Elemente des Elements nicht.
– hsivonen
21. Oktober 2011 um 17:31 Uhr
Ebenfalls, insertAdjacentHTML
behält die Werte geänderter Formularelemente bei, während das Anhängen an innerHTML
baut das Element neu auf und verliert den gesamten Formularkontext.
– Brandon Gano
2. April 2013 um 17:20 Uhr
Kamil Kielczewski
AppendChild
(E) ist mehr als 2x schneller als andere Lösungen auf Chrome und Safari, insertAdjacentHTML
(F) ist am schnellsten auf Firefox. Die innerHTML=
(B) (nicht verwechseln mit +=
(A)) ist die zweitschnellste Lösung für alle Browser 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 den Test auf Ihrem Computer wiederholen Hier
function A() {
container.innerHTML += '<p>A: Just some <span>text</span> here</p>';
}
function B() {
container.innerHTML = '<p>B: Just some <span>text</span> here</p>';
}
function C() {
$('#container').append('<p>C: Just some <span>text</span> here</p>');
}
function D() {
var p = document.createElement("p");
p.innerHTML = 'D: Just some <span>text</span> here';
container.appendChild(p);
}
function E() {
var p = document.createElement("p");
var s = document.createElement("span");
s.appendChild( document.createTextNode("text ") );
p.appendChild( document.createTextNode("E: Just some ") );
p.appendChild( s );
p.appendChild( document.createTextNode(" here") );
container.appendChild(p);
}
function F() {
container.insertAdjacentHTML('beforeend', '<p>F: Just some <span>text</span> here</p>');
}
A();
B();
C();
D();
E();
F();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
This snippet only for show code used in test (in jsperf.com) - it not perform test itself.
<div id="container"></div>
Lesbarkeit ist in der Regel wichtiger als Leistung. Aber danke für die Beinarbeit.
– Jay
18. Oktober 2021 um 21:59 Uhr
@Jay-Optimierung sollte nur verwendet werden, wenn sie benötigt wird und oft reich kommentiert werden muss
– Kamil Kielczewski
19. Oktober 2021 um 18:40 Uhr
Die Verwendung von innerHTML scheint nicht gut zu sein, da der Browser den gesamten HTML-Bund erneut parsen muss, anstatt ihn an den Schwanz hinzuzufügen
– Dee
13. November 2021 um 13:11 Uhr
Alex
Ist das akzeptabel?
var child = document.createElement('div');
child.innerHTML = str;
child = child.firstChild;
document.getElementById('test').appendChild(child);
AberNeils Antwort ist eine bessere Lösung.
@Šime Arbeiten mit der DOM-API immer fühlt sich an wie ein Hack 😛 Möchten Sie die Zeichenfolge lieber deserialisieren ohne innerHTML
?
– Alex
6. September 2011 um 22:55 Uhr
Nun ja, ob es eine andere Möglichkeit gibt, den HTML-Parser des Browsers zu nutzen, würde ich gerne wissen …
– Sime Vidas
6. September 2011 um 22:58 Uhr
@Šime – Ich denke, es gibt nur zwei Möglichkeiten, den HTML-Parser des Browsers zu verwenden, innerHTML und document.write. Und wenn Sie innerHTML für einen Hack halten …
– Alohci
6. September 2011 um 23:02 Uhr
@Alohci Da ist ein anderer Weg: insertAdjacentHTML
.
– Sime Vidas
6. September 2011 um 23:10 Uhr
@Šime -Danke. Ich habe die WHATWG-Version gefunden. Es ist in DOM-Parsing und Serialisierung spez. Es weist darauf hin, dass es neben innerHTML und insertAdjacentHTML auch outerHTML und, glaube ich, createContextualFragment gibt.
– Alohci
6. September 2011 um 23:35 Uhr
Chris Kalo
Die Idee ist zu verwenden innerHTML
auf einem Zwischenelement und verschieben Sie dann alle untergeordneten Knoten dorthin, wo Sie sie wirklich haben 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);
}
Dadurch wird vermieden, dass Event-Handler gelöscht werden div#test
erlaubt Ihnen aber trotzdem, einen HTML-String anzuhängen.
hsivonen
Der richtige Weg ist die Nutzung insertAdjacentHTML
. In Firefox vor Version 8 können Sie auf die Verwendung zurückgreifen Range.createContextualFragment
wenn dein str
enthält Nr script
Stichworte.
Wenn dein str
enthält script
Tags, müssen Sie entfernen script
Elemente aus dem von zurückgegebenen Fragment createContextualFragment
vor dem Einfügen des Fragments. Andernfalls werden die Skripts ausgeführt. (insertAdjacentHTML
markiert Skripte als nicht ausführbar.)
Vielen Dank für die Erwähnung createContextualFragment
. Ich habe nach einer Möglichkeit gesucht, einige HTML-Includes mit Skripten nur dann auszuführen, wenn der Benutzer zustimmt, ein Cookie zu setzen.
– schliflo
9. Mai 2018 um 15:40 Uhr
twitchdotcom Schrägstrich KANJICODER
Schnell Hacken:
<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 funktioniert nicht)
2: Verwendung 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 aber keine console.log-Meldungen an. Kam hierher auf der Suche nach einer schnellen Lösung. Ich möchte nur die Ergebnisse von ein paar Zeilen Scratchpad-Code sehen, die anderen Lösungen sind zu viel Arbeit.
Vielen Dank für die Erwähnung createContextualFragment
. Ich habe nach einer Möglichkeit gesucht, einige HTML-Includes mit Skripten nur dann auszuführen, wenn der Benutzer zustimmt, ein Cookie zu setzen.
– schliflo
9. Mai 2018 um 15:40 Uhr
Nick Brunt
Warum ist das nicht akzeptabel?
document.getElementById('test').innerHTML += str
wäre die Lehrbuchmethode.
Es würde Event-Handler beenden angehängt #test
obwohl. Das ist grundsätzlich nicht erwünscht.
– Alex
6. September 2011 um 22:57 Uhr
Interessant, dass es das tut. Klingt nicht wirklich logisch.
– Nick Brunt
6. September 2011 um 23:04 Uhr
Ich denke, es ist logisch, wenn Sie darüber nachdenken, den HTML-Code in eine Zeichenfolge zu serialisieren und den HTML-Code dann zurückzusetzen.
– Alex
6. September 2011 um 23:05 Uhr
Ich denke, das JavaScript müsste erneut ausgeführt werden, um den Ereignishandler zurückzusetzen. Fair genug.
– Nick Brunt
6. September 2011 um 23:08 Uhr
@Nick Sie möchten einen Teil des DOM nicht stringifizieren (serialisieren), nur damit Sie ihn mit einer anderen Zeichenfolge verketten und dann das Ganze wieder in das DOM parsen können. Wie Alex sagte, zeichnet die Serialisierung (unter anderem) keine gebundenen Ereignishandler auf. Selbst wenn die Serialisierung alles erfassen könnte, würden Sie es trotzdem nicht tun wollen.
– Sime Vidas
6. September 2011 um 23:23 Uhr