Hängt HTML ohne innerHTML an das Containerelement an
Lesezeit: 5 Minuten
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
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
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 Übere.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++;
}
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.
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);
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
14315900cookie-checkHängt HTML ohne innerHTML an das Containerelement anyes
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