Anhängen einer HTML-Zeichenfolge an das DOM

Lesezeit: 7 Minuten

Anhangen einer HTML Zeichenfolge an das DOM
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.)

Anhangen einer HTML Zeichenfolge an das DOM
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 innerHTMLda 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

Anhangen einer HTML Zeichenfolge an das DOM
Kamil Kielczewski

Leistung

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.

Einzelheiten

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)

Geben Sie hier die Bildbeschreibung ein

  • auf Chrome E (140.000 Operationen pro Sekunde) ist am schnellsten, B (47.000) und F (46.000) sind an zweiter Stelle, A (332) ist am langsamsten
  • Auf Firefox ist F (94k) am schnellsten, dann B(80k), D (73k), E(64k), C (21k) am langsamsten ist A(466)
  • auf Safari E(207k) ist am schnellsten, dann B(89k), F(88k), D(83k), C (25k), am langsamsten ist A(509)

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

1645918512 114 Anhangen einer HTML Zeichenfolge an das DOM
Alex

Ist das akzeptabel?

var child = document.createElement('div');
child.innerHTML = str;
child = child.firstChild;
document.getElementById('test').appendChild(child);

jsFiddle.

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


1645918513 510 Anhangen einer HTML Zeichenfolge an das DOM
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.

1645918514 803 Anhangen einer HTML Zeichenfolge an das DOM
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

1645918515 643 Anhangen einer HTML Zeichenfolge an das DOM
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:

  1. Keine automatische Vervollständigung
  2. Vertikaler Monitor freundlich

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

1645918516 764 Anhangen einer HTML Zeichenfolge an das DOM
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

869490cookie-checkAnhängen einer HTML-Zeichenfolge an das DOM

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy