Hängt HTML ohne innerHTML an das Containerelement an

Lesezeit: 5 Minuten

Bobs Benutzeravatar
Bob

Ich brauche eine Möglichkeit, HTML an ein Containerelement anzuhängen, ohne innerHTML zu verwenden. Der Grund, warum ich innerHTML nicht verwenden möchte, ist, dass, wenn es so verwendet wird:

element.innerHTML += htmldata

Es funktioniert, indem zuerst der gesamte HTML-Code ersetzt wird, bevor der alte HTML-Code und der neue HTML-Code hinzugefügt werden. Das ist nicht gut, weil es dynamische Medien wie eingebettete Flash-Videos zurücksetzt …

Ich könnte es so machen, was funktioniert:

var e = document.createElement('span');
e.innerHTML = htmldata;
element.appendChild(e);

Das Problem dabei ist jedoch, dass das Dokument jetzt dieses zusätzliche Span-Tag enthält, das ich nicht möchte.

Wie kann dies dann geschehen? Vielen Dank!

  • Warum nicht Jquery verwenden? Überprüfen Sie meine ausführliche Antwort unten. stackoverflow.com/a/50482776/5320562

    – Loukan ElKadi

    6. August 2018 um 6:25 Uhr


Benutzeravatar von alnafie
alnafie

Kasse das insertAdjacentHTML() Methode. Der erste Parameter ist, wo die Zeichenfolge angehängt werden soll und dauert (“beforebegin”, “afterbegin”, “beforeend”, “afterend”). In der Situation des OP würden Sie “beforeend” verwenden. Der zweite Parameter ist nur der HTML-String.

Grundlegende Verwendung:

var d1 = document.getElementById('one');
d1.insertAdjacentHTML('beforeend', '<div id="two">two</div>');

  • Ich habe gerade Ihre Lösung sowie die akzeptierte ausprobiert. Beides funktioniert, aber deine besteht nur aus 2 Zeilen und keinen Schleifen. Klingt für mich nach einem Gewinner.

    – Corwin01

    8. Mai 2012 um 23:45 Uhr

  • Als Hinweis für alle, die diesen Weg wählen könnten: Diese Methode spielt nicht gut mit Tabellen in IE9.

    – Corwin01

    17. Mai 2012 um 15:49 Uhr

  • In Chrome sagt es mir Uncaught TypeError: undefined is not a function !

    – J86

    20. November 2014 um 12:54 Uhr

  • Dieses versteckte Juwel braucht mehr Aufmerksamkeit.

    – Seth

    8. Januar 2015 um 0:16 Uhr

  • Ziemlich ärgerlich, dass diese Methode in der Chrome-Webkonsole nicht automatisch vervollständigt wird. v79

    – lasec0203

    28. Dezember 2019 um 8:23 Uhr

Benutzeravatar von Felix Kling
Felix Klinge

Um eine Alternative zu geben (als using DocumentFragment scheint nicht zu funktionieren): Sie können es simulieren, indem Sie über die Kinder des neu generierten Knotens iterieren und nur diese anhängen.

var e = document.createElement('div');
e.innerHTML = htmldata;

while(e.firstChild) {
    element.appendChild(e.firstChild);
}

  • Ich dachte, wir suchen nach einer Lösung, die “innerHTML” nicht verwendet.

    – Kennydelacruz

    18. Oktober 2018 um 21:41 Uhr

  • @kennydelacruz: Das OP wollte nicht anhängen neuen HTML-Code in einen vorhandenen HTML-Code umwandeln, da er die vorhandenen Elemente zerstört und neu erstellt. Das OP fand eine Lösung, indem es ein neues Element erstellte und dieses anhängte, aber es wollte kein zusätzliches Element hinzufügen. Ich habe diese Lösung nur erweitert, um zu zeigen, dass sie die neu erstellten Elemente verschieben/anhängen können, was sich nicht auf die vorhandenen Elemente auswirkt.

    – Felix Klinge

    19. Oktober 2018 um 3:52 Uhr

  • Ich weiß, das ist alt, aber kann mir jemand erklären, warum man über e.firstChild iterieren kann?

    – Toastgeraet

    18. April 2019 um 9:14 Uhr

  • @Toastgeraet: Dies ist ein Beispiel, das nicht iteriert Über e.firstChild. Vielmehr wird geprüft, ob e hat ein Kind und wenn ja, Bewegung dieses Kind hinüber zum Element.

    – Felix Klinge

    18. April 2019 um 18:04 Uhr

alnafie hat eine großartige Antwort auf diese Frage. Ich wollte ein Beispiel für seinen Code als Referenz geben:

var childNumber = 3;

function addChild() {
  var parent = document.getElementById('i-want-more-children');
  var newChild = '<p>Child ' + childNumber + '</p>';
  parent.insertAdjacentHTML('beforeend', newChild);
  childNumber++;
}
body {
  text-align: center;
}
button {
  background: rgba(7, 99, 53, .1);
  border: 3px solid rgba(7, 99, 53, 1);
  border-radius: 5px;
  color: rgba(7, 99, 53, 1);
  cursor: pointer;
  line-height: 40px;
  font-size: 30px;
  outline: none;
  padding: 0 20px;
  transition: all .3s;
}
button:hover {
  background: rgba(7, 99, 53, 1);
  color: rgba(255,255,255,1);
}
p {
  font-size: 20px;
  font-weight: bold;
}
<button type="button" onclick="addChild()">Append Child</button>
<div id="i-want-more-children">
  <p>Child 1</p>
  <p>Child 2</p>
</div>

Hoffentlich ist dies hilfreich für andere.

  • Ich hasse es, ein Verfechter der Regeln zu sein, aber ich denke, es wäre besser gewesen, wenn Sie eine Demo (jsfiddle, Codepen usw.) erstellt und diese dann zu Alnafies Antwort hinzugefügt hätten, indem Sie die Bearbeitungsfunktion verwendet oder einen Kommentar eingereicht haben. Das Erstellen einer Antwort nur, um die Antwort eines anderen Benutzers zu demonstrieren, funktioniert nicht mit SO, unabhängig davon, wie nützlich die von Ihnen bereitgestellten Informationen sind. Stellen Sie sich vor, jeder Benutzer würde entscheiden, eine andere Antwort zu demonstrieren, indem er eine Antwort erstellt – es würde chaotisch werden.

    – Martin Jakob

    23. Juli 2018 um 11:13 Uhr


Benutzeravatar von Raynos
Raynos

Das ist was DocumentFragment war dafür gedacht.

var frag = document.createDocumentFragment();
var span = document.createElement("span");
span.innerHTML = htmldata;
for (var i = 0, ii = span.childNodes.length; i < ii; i++) {
    frag.appendChild(span.childNodes[i]);
}
element.appendChild(frag);

document.createDocumentFragment, .childNodes

<div id="Result">
</div>

<script>
for(var i=0; i<=10; i++){
var data = "<b>vijay</b>";
 document.getElementById('Result').innerHTML += data;
}
</script>

Weisen Sie die Daten für div mit dem Symbol “+=” zu. Sie können Daten einschließlich früherer HTML-Daten anhängen

  • Die Frage erfordert ausdrücklich nicht verwenden element.innerHTML += data.

    – Musiknichts

    18. Juni 2015 um 22:47 Uhr

Benutzeravatar von John
John

Wie man fischt und bei der Verwendung von striktem Code. Am Ende dieses Beitrags sind zwei erforderliche Funktionen erforderlich.

xml_add('before', id_('element_after'), '<span xmlns="http://www.w3.org/1999/xhtml">Some text.</span>');

xml_add('after', id_('element_before'), '<input type="text" xmlns="http://www.w3.org/1999/xhtml" />');

xml_add('inside', id_('element_parent'), '<input type="text" xmlns="http://www.w3.org/1999/xhtml" />');

Fügen Sie mehrere Elemente hinzu (Namespace muss sich nur auf dem übergeordneten Element befinden):

xml_add('inside', id_('element_parent'), '<div xmlns="http://www.w3.org/1999/xhtml"><input type="text" /><input type="button" /></div>');

Dynamischer wiederverwendbarer Code:

function id_(id) {return (document.getElementById(id)) ? document.getElementById(id) : false;}

function xml_add(pos, e, xml)
{
 e = (typeof e == 'string' && id_(e)) ? id_(e) : e;

 if (e.nodeName)
 {
  if (pos=='after') {e.parentNode.insertBefore(document.importNode(new DOMParser().parseFromString(xml,'application/xml').childNodes[0],true),e.nextSibling);}
  else if (pos=='before') {e.parentNode.insertBefore(document.importNode(new DOMParser().parseFromString(xml,'application/xml').childNodes[0],true),e);}
  else if (pos=='inside') {e.appendChild(document.importNode(new DOMParser().parseFromString(xml,'application/xml').childNodes[0],true));}
  else if (pos=='replace') {e.parentNode.replaceChild(document.importNode(new DOMParser().parseFromString(xml,'application/xml').childNodes[0],true),e);}
  //Add fragment and have it returned.
 }
}

  • Die Frage erfordert ausdrücklich nicht verwenden element.innerHTML += data.

    – Musiknichts

    18. Juni 2015 um 22:47 Uhr

1431590cookie-checkHängt HTML ohne innerHTML an das Containerelement an

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

Privacy policy