Einfügen von HTML-Elementen mit JavaScript

104

Anstatt mühsam nach Problemumgehungen für jeden Attribut- und Ereignistyp zu suchen, wenn Sie die folgende Syntax verwenden:

elem = document.createElement("div");
elem.id = 'myID';
elem.innerHTML = ' my Text '
document.body.insertBefore(elem,document.body.childNodes[0]);

Gibt es eine Möglichkeit, das gesamte HTML-Element als Zeichenfolge zu deklarieren? mögen:

elem = document.createElement("<div id='myID'> my Text </div>");
document.body.insertBefore(elem,document.body.childNodes[0]);
Der Blitz
quelle

Antworten:

124

Anstatt direkt damit herumzuspielen, ist innerHTMLes möglicherweise besser, ein Fragment zu erstellen und dann Folgendes einzufügen:

function create(htmlStr) {
    var frag = document.createDocumentFragment(),
        temp = document.createElement('div');
    temp.innerHTML = htmlStr;
    while (temp.firstChild) {
        frag.appendChild(temp.firstChild);
    }
    return frag;
}

var fragment = create('<div>Hello!</div><p>...</p>');
// You can use native DOM methods to insert the fragment:
document.body.insertBefore(fragment, document.body.childNodes[0]);

Leistungen:

  1. Sie können native DOM-Methoden zum Einfügen verwenden, z. B. insertBefore, appendChild usw.
  2. Sie haben Zugriff auf die tatsächlichen DOM-Knoten, bevor sie eingefügt werden. Sie können auf das childNodes-Objekt des Fragments zugreifen.
  3. Die Verwendung von Dokumentfragmenten ist sehr schnell. schneller als das Erstellen von Elementen außerhalb des DOM und in bestimmten Situationen schneller als innerHTML.

Obwohl innerHTMLes innerhalb der Funktion verwendet wird, geschieht alles außerhalb des DOM, sodass es viel schneller ist als man denkt ...

James
quelle
3
Ich wette, dieses createDocumentFragment () wäre nicht so gut wie das "Legacy" innerHTML.
TheFlash
2
Diese Methode funktioniert in allen modernen Browsern. Für IE 5.5 und niedriger können Sie eine Prüfung wie :: if (document.createDocumentFragment) {create ('...'); } else {/ * Benutze innerHTML vielleicht * /}
James
32
crescentfresh, ich helfe bei SO, weil ich es genieße, Menschen zu helfen; Es tut mir leid, wenn eine Lösung nicht in allen Situationen zu 100% funktionsfähig ist. Wenn Sie so besorgt sind, warum nicht Ihre eigene Lösung anbieten, anstatt unnötig kritisch gegenüber bereits angebotenen Antworten zu sein? Bei jeder Abstraktion wird es immer Randfälle geben! Dies ist eine Lernumgebung - wir sind nicht hier, um Menschen eine Lösung auf einem Teller zu geben - wir sind hier, um uns gegenseitig dabei zu helfen, besser zu werden, was wir tun! Und sorry, aber wo hat jemand "AJAX" erwähnt?
James
1
Meinetwegen. Entschuldigen Sie. Ich habe nur das Gefühl, dass es hier so viele Abstraktionen gibt, ohne dass Vorbehalte erwähnt werden.
Crescent Fresh
1
Dies ist viel komplexer als es sein muss - die Antwort von Sime Vidas ist viel besser
JonnyRaa
83

Du willst das

document.body.insertAdjacentHTML( 'afterbegin', '<div id="myID">...</div>' );
Šime Vidas
quelle
13
Ich bin mir nicht sicher, warum dies nicht die akzeptierte Antwort ist. Dies ist viel einfacher und offensichtlicher richtig
JonnyRaa
@JonnyLeeds Dies scheint nicht für bodyElemente zu funktionieren , funktioniert aber für jedes andere Element.
Phill
1
@Phill Natürlich funktioniert es weiter <body>. Tatsächlich ist das Ausführen <body>meine Standardmethode, um Dinge wie Stylesheets über die Konsole in Webseiten einzufügen. Welches Problem haben Sie?
Šime Vidas
@ ŠimeVidas wahrscheinlich, weil das body-Element zur Ausführungszeit nicht definiert wurde ... Ich habe Ihre Zeile mit window.onload = function () {…} gepaart, um dieses Problem zu verhindern
GDY
@Grandy Phill schrieb, dass es auf anderen Elementen funktioniert. Wenn <body>undefiniert wären, wären es auch alle anderen Elemente, also ist dies wahrscheinlich nicht das Problem von Phill.
Šime Vidas
32

Schauen Sie sich insertAdjacentHTML an

var element = document.getElementById("one");
var newElement = '<div id="two">two</div>'
element.insertAdjacentHTML( 'afterend', newElement )
// new DOM structure: <div id="one">one</div><div id="two">two</div>

Position ist die Position relativ zu dem Element, das Sie neben einfügen:

'beforebegin' Vor dem Element selbst

'afterbegin' Nur innerhalb des Elements, vor seinem ersten Kind

'beforeend' Nur innerhalb des Elements, nach seinem letzten Kind

'afterend' Nach dem Element selbst

svnm
quelle
17

In JavaScript der alten Schule können Sie Folgendes tun:

document.body.innerHTML = '<p id="foo">Some HTML</p>' + document.body.innerHTML;

Als Antwort auf Ihren Kommentar:

[...] Ich war daran interessiert, die Quelle der Attribute und Ereignisse eines neuen Elements zu deklarieren, nicht die innerHTMLeines Elements.

Sie müssen den neuen HTML-Code jedoch in das DOM einfügen. Deshalb innerHTMLwird es im JavaScript-Beispiel der alten Schule verwendet. Das innerHTMLvon dem BODYElement wird mit dem neuen HTML vorangestellt. Wir berühren den vorhandenen HTML-Code in der nicht wirklichBODY .

Ich werde das oben genannte Beispiel umschreiben, um dies zu verdeutlichen:

var newElement = '<p id="foo">This is some dynamically added HTML. Yay!</p>';
var bodyElement = document.body;
bodyElement.innerHTML = newElement + bodyElement.innerHTML;
// note that += cannot be used here; this would result in 'NaN'

Die Verwendung eines JavaScript-Frameworks würde diesen Code weniger ausführlich machen und die Lesbarkeit verbessern. Mit jQuery können Sie beispielsweise Folgendes tun:

$('body').prepend('<p id="foo">Some HTML</p>');
Mathias Bynens
quelle
Ziemlich gut. Ich war jedoch daran interessiert, die Quelle der Attribute und Ereignisse eines neuen Elements zu deklarieren, nicht die innerHTML eines Elements.
TheFlash
1
document.getElementsByTagName('body')[0]kann in der Tat durch document.bodyguten Punkt ersetzt werden. Wenn Sie jedoch den neuen HTML-Code anstelle des KÖRPERS an ein anderes vorhandenes Element anhängen oder anhängen möchten, müssen Sie document.getElementById()und / oder verwenden document.getElementsByTagName(). Deshalb habe ich es im Beispiel verwendet.
Mathias Bynens
1
Außerdem kann Ihr Code sehr schnell sehr unordentlich werden, wenn Sie "innerHTML" direkt hinzufügen / einfügen
James
1
@ JimmyP: Was für ein Müll! Der eigentliche Zweck dieser Frage besteht darin, HTML direkt als Zeichenfolgen einfügen zu können, anstatt mit Funktionen herumzuspielen, um es zu konstruieren, Attribut für Attribut, Knoten für Knoten, Element für Element.
TheFlash
1
Dies löst alle Ereignishandler und kann zu großen Speicherlecks führen.
Adardesign
1

Meines Wissens, das, um fair zu sein, ziemlich neu und begrenzt ist, ist das einzige potenzielle Problem bei dieser Technik die Tatsache, dass Sie daran gehindert werden, einige Tabellenelemente dynamisch zu erstellen.

Ich verwende ein Formular für Vorlagen, indem ich einem versteckten DIV "Vorlagen" -Elemente hinzufüge und dann mit cloneNode (true) einen Klon erstelle und ihn nach Bedarf anhänge. Beachten Sie, dass Sie sicherstellen müssen, dass Sie die IDs nach Bedarf neu zuweisen, um Doppelarbeit zu vermeiden.

Rpc
quelle
-1

Wie bereits erwähnt, kann die praktische Funktion zum Voranstellen von jQuery emuliert werden:

var html = '<div>Hello prepended</div>';
document.body.innerHTML = html + document.body.innerHTML;

Während einige sagen, es sei besser, sich nicht mit innerHTML " herumzuschlagen" , ist es in vielen Anwendungsfällen zuverlässig, wenn Sie dies wissen:

Wenn eine <div>, <span>oder <noembed>Knoten ein Kind Textknoten, die die Zeichen enthält ( &), ( <) oder ( >), kehrt diese Zeichen als innerHTML- &amp, &ltund &gtjeweils. Verwenden Sie Node.textContentdiese Option , um eine korrekte Kopie des Inhalts dieser Textknoten zu erhalten.

https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML

Oder:

var html = '<div>Hello prepended</div>';
document.body.insertAdjacentHTML('afterbegin', html)

insertAdjacentHTMList wahrscheinlich eine gute Alternative: https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML

taseenb
quelle
-2

Wenn Sie HTML-Code in das Tag einer vorhandenen Seite einfügen möchten, verwenden Sie Jnerator . Dieses Tool wurde speziell für dieses Ziel erstellt.

Anstatt den nächsten Code zu schreiben

    var htmlCode = '<ul class=\'menu-countries\'><li
        class=\'item\'><img src=\'au.png\'></img><span>Australia </span></li><li
        class=\'item\'><img src=\'br.png\'> </img><span>Brazil</span></li><li
        class=\'item\'> <img src=\'ca.png\'></img><span>Canada</span></li></ul>';
    var element = document.getElementById('myTag');
    element.innerHTML = htmlCode;

Sie können eine verständlichere Struktur schreiben

    var jtag = $j.ul({
        class: 'menu-countries',
        child: [
            $j.li({ class: 'item', child: [
                $j.img({ src: 'au.png' }),
                $j.span({ child: 'Australia' })
            ]}),
            $j.li({ class: 'item', child: [
                $j.img({ src: 'br.png' }),
                $j.span({ child: 'Brazil' })
            ]}),
            $j.li({ class: 'item', child: [
                $j.img({ src: 'ca.png' }),
                $j.span({ child: 'Canada' })
            ]})
        ]
    });
    var htmlCode = jtag.html();
    var element = document.getElementById('myTag');
    element.innerHTML = htmlCode;
Berezh
quelle