1092 Stimmen

Wie fügt man ein Element nach einem anderen Element in JavaScript ein, ohne eine Bibliothek zu verwenden?

Es gibt insertBefore() in JavaScript, aber wie kann ich ein Element einfügen nach ein anderes Element, ohne jQuery oder eine andere Bibliothek zu verwenden?

4 Stimmen

Wenn Sie den Sonderfall des allerletzten untergeordneten Knotens benötigen - stackoverflow.com/questions/5173545/

4 Stimmen

@AlanLarimer das ist großartig. danke. wissen Sie, wann insertAdjacentElement eingeführt wurde?

1714voto

karim79 Punkte 333786
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);

Wo referenceNode ist der Knoten, den Sie in newNode nach. Wenn referenceNode das letzte Kind innerhalb seines Elternelements ist, ist das in Ordnung, denn referenceNode.nextSibling wird sein null y insertBefore behandelt diesen Fall durch Hinzufügen am Ende der Liste.

Also:

function insertAfter(newNode, referenceNode) {
    referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}

Sie können es mit dem folgenden Ausschnitt testen:

function insertAfter(referenceNode, newNode) {
  referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}

var el = document.createElement("span");
el.innerHTML = "test";
var div = document.getElementById("foo");
insertAfter(div, el);

<div id="foo">Hello</div>

15 Stimmen

Vielen Dank für die tolle Antwort, aber ist es nicht verwirrend, referenceNode und newNode in der Argumentliste zu vertauschen? Warum wird nicht die insertBefore-Syntax verwendet?

11 Stimmen

Dieses Codeschnipsel behandelt nicht, wenn der referenceNode das letzte Kind ist, in dem es appendChild sein sollte.

0 Stimmen

@BradVogel Ich glaube, er erklärt, dass der von Ihnen erwähnte Fall von insertBefore? behandelt wird.

224voto

Modular Punkte 4694

Obwohl einfügenVor() ist großartig und wird in den meisten Antworten hier erwähnt. Für zusätzliche Flexibilität und um ein wenig deutlicher zu sein, können Sie verwenden:

Le site insertAdjacentElement() como refElem.insertAdjacentElement(position, newElem) können Sie auf ein beliebiges Element verweisen und das zu verschiebende Element genau an der gewünschten Stelle einfügen (die Position kann eine der folgenden sein: 'beforebegin' , 'afterbegin' , 'beforeend' , 'afterend' ) wie unten dargestellt:

// refElem.insertAdjacentElement('beforebegin', myElem); 
<p id="refElem">
    // refElem.insertAdjacentElement('afterbegin', myElem);
    ... content ...
    // refElem.insertAdjacentElement('beforeend', myElem);
</p>
// refElem.insertAdjacentElement('afterend', myElem); 

Andere, die für ähnliche Anwendungsfälle in Frage kommen: insertAdjacentHTML() y insertAdjacentText()

Referenzen:

https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentElement https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentText

11 Stimmen

Diese Antwort sollte man sich wirklich zu Herzen nehmen, denn sie ist der moderne Ansatz für die 2020er Jahre, die sich schnell nähern.

20 Stimmen

Wie kommt es, dass diese Antwort so tief vergraben ist? Ich werde sie mit einigen Punkten belohnen, um mehr Aufmerksamkeit zu erregen.

2 Stimmen

Eine kleine Randbemerkung, dass es bei Dokumentfragmenten nicht funktioniert.

181voto

Armando Punkte 1711

Einfaches JavaScript wäre das Folgende:

Anhängen vor:

element.parentNode.insertBefore(newElement, element);

Anhängen nach:

element.parentNode.insertBefore(newElement, element.nextSibling);

Aber werfen Sie einige Prototypen ein, um die Nutzung zu vereinfachen

Wenn Sie die folgenden Prototypen erstellen, können Sie diese Funktionen direkt aus neu erstellten Elementen aufrufen.

  • newElement.appendBefore(element);

  • newElement.appendAfter(element);

.appendBefore(element) Prototyp

Element.prototype.appendBefore = function (element) {
  element.parentNode.insertBefore(this, element);
},false;

.appendAfter(element) Prototyp

Element.prototype.appendAfter = function (element) {
  element.parentNode.insertBefore(this, element.nextSibling);
},false;

Und um das Ganze in Aktion zu sehen, führen Sie den folgenden Codeschnipsel aus

/* Adds Element BEFORE NeighborElement */
Element.prototype.appendBefore = function(element) {
  element.parentNode.insertBefore(this, element);
}, false;

/* Adds Element AFTER NeighborElement */
Element.prototype.appendAfter = function(element) {
  element.parentNode.insertBefore(this, element.nextSibling);
}, false;

/* Typical Creation and Setup A New Orphaned Element Object */
var NewElement = document.createElement('div');
NewElement.innerHTML = 'New Element';
NewElement.id = 'NewElement';

/* Add NewElement BEFORE -OR- AFTER Using the Aforementioned Prototypes */
NewElement.appendAfter(document.getElementById('Neighbor2'));

div {
  text-align: center;
}
#Neighborhood {
  color: brown;
}
#NewElement {
  color: green;
}

<div id="Neighborhood">
  <div id="Neighbor1">Neighbor 1</div>
  <div id="Neighbor2">Neighbor 2</div>
  <div id="Neighbor3">Neighbor 3</div>
</div>

Führen Sie es auf JSFiddle aus

4 Stimmen

En Erweiterung Funktionsnamen sind irreführend. Ich denke, es sollte eher appendMeBefore und appendMeAfter heißen. Ich dachte, sie wird wie die appendChild() Methode z.B. existingElement.appendAfter(newElement); . Sehen Sie, was ich meine, auf dieser aktualisierten jsfiddle .

3 Stimmen

Append After funktioniert, denn wenn element.nextSibling keinen nächsten Geschwisterteil hat, ist nextSibling NULL, und dann wird am Ende angehängt.

0 Stimmen

Ich erhalte Warnungen in jslint: Erwartete ';' und stattdessen sah ','. }, false;

93voto

Mister SirCode Punkte 1070

Lösung 2018 (Schlechte Praxis, gehen Sie zu 2020)

Ich weiß, dass diese Frage uralt ist, aber für alle zukünftigen Benutzer, hier ist ein modifizierter Prototyp. Dies ist nur ein Polyfill für die Funktion .insertAfter, die nicht existiert. Dieser Prototyp fügt direkt die Funktion HTMLElement.insertAfter(element); zum HTMLElement-Prototyp:

// Parent
const el = document.body;
// New Element
const newEl = document.createElement("div");

// Custom Method
Element.prototype.insertAfter = function(new) {
    this.parentNode.insertBefore(new, this.nextSibling);
}

// Insert Before Element
el.insertBefore(newEl)

// Insert After Element
el.insertAfter(newEl);

// Just remember you cant use .insertAfter() or .insertBefore() 
// after either is already called.
// You cant place one element in two places at once.

2019 Lösung (Hässlich / Veraltet, gehen Sie zu 2020)

Verwenden Sie keine Prototypen (wie die Lösung 2018). Das Überschreiben des Prototyps ist sowohl gefährlich als auch von geringer Qualität. Wenn Sie eine neue Methode wünschen, verwenden Sie stattdessen Funktionsüberschreibungen.
Wenn Sie eine sichere Funktion für kommerzielle Projekte wünschen, verwenden Sie einfach eine Standardfunktion. Sie ist nicht so schön, aber sie funktioniert:

// Parent
const el = document.body;
// New Element
const newEl = document.createElement("div");

// Function You Need
function insertAfter(el0, el1) {
    el0.parentNode.insertBefore(el1, el0.nextSibling);
}

// Insert Before Element
el.insertBefore(newEl);

// Insert After Element
insertAfter(el, newEl);

// Just remember you cant use insertAfter() or .insertBefore()
// after either is already called.
// You cant place one element in two places at once.

2020 Lösung - ChildNode

Aktuelle Webstandards für ChildNode: MDN Docs - ChildNode

Es befindet sich derzeit in den Living Standards und ist sicher zu verwenden.

Für nicht unterstützte Browser (z.B. IE), verwenden Sie dieses Polyfill: https://github.com/seznam/JAK/blob/master/lib/polyfills/childNode.js

Mir ist klar, dass das Polyfill Proto Overrides verwendet, als ich sagte, dass sie eine schlechte Praxis sind. Sie sind, vor allem, wenn sie blind verwendet werden, wie mit meiner ersten Lösung. Das Polyfill in der MDN-Dokumentation verwendet jedoch eine Form der Initialisierung und Ausführung, die im Vergleich zum einfachen Überschreiben eines Prototyps wesentlich zuverlässiger und sicherer ist.

Wie man ChildNode verwendet:

// Parent 
const el = document.body;
// New Element
const newEl = document.createElement("div");

// Insert Before Element
el.before(newEl);

// Insert After Element
el.after(newEl);

// Just remember you cant use .after() or .before()
// after either is already called.
// You cant place one element in two places at once.

// Another feature of ChildNode is the .remove() method,
// which deletes the element from the DOM
el.remove();
newEl.remove();

2 Stimmen

Über die "Lösung 2020": before y after sind beide auf der MDN-Seite als "experimentell" gekennzeichnet: Experimental. Expect behavior to change in the future.

4 Stimmen

@izogfif Nun, wenn man bedenkt, dass es gerade in den Lebensstandard gekommen ist, ist das zu erwarten. Ich bezweifle stark, dass sie das Verhalten der Methode signifikant ändern werden, um einen neuen Standard anzupassen. Wenn sie es tun, werde ich die Antwort bearbeiten. Der einzige Grund, warum es in den MDN-Dokumenten steht, ist höchstwahrscheinlich, dass es erst kürzlich in den Living Standard aufgenommen wurde und daher noch "experimentell" ist, obwohl es stabil und in der aktuellen Version enthalten ist.

0 Stimmen

Es funktioniert perfekt. Volle Unterstützung außer IE.

69voto

insertAdjacentHTML + outerHTML

elementBefore.insertAdjacentHTML('afterEnd', elementAfter.outerHTML)

Die Vorteile:

  • DRYer: Sie müssen den Before-Knoten nicht in einer Variablen speichern und zweimal verwenden. Wenn Sie die Variable umbenennen, muss sie weniger oft geändert werden.
  • golft besser als die insertBefore (bricht auch dann ab, wenn der vorhandene Knotenvariablenname 3 Zeichen lang ist)

Die Nachteile:

  • geringere Browserunterstützung seit neueren Versionen: https://caniuse.com/#feat=insert-adjacent
  • verliert Eigenschaften des Elements wie Ereignisse, weil outerHTML wandelt das Element in eine Zeichenkette um. Wir brauchen das, weil insertAdjacentHTML fügt Inhalte aus Zeichenketten statt aus Elementen hinzu.

23 Stimmen

Wenn Sie das Element bereits konstruiert haben, können Sie mit .insertAdjacentElement()

12 Stimmen

Ab 2018 sieht die Browserunterstützung ziemlich solide aus: caniuse.com/#feat=insert-adjacent

2 Stimmen

Dies war eine gute Lösung, ich empfehle jedem, dies zu lesen xahlee.info/js/js_insert_after.html

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X