Element: Methode moveBefore()
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
Experimentell: Dies ist eine experimentelle Technologie
Überprüfen Sie die Browser-Kompatibilitätstabelle sorgfältig vor der Verwendung auf produktiven Webseiten.
Die moveBefore()
-Methode des Element
-Interfaces verschiebt einen angegebenen Node
innerhalb des aufrufenden Knotens als direktes Kind vor einen angegebenen Referenzknoten.
Syntax
moveBefore(movedNode, referenceNode)
Parameter
movedNode
-
Ein
Node
, der den zu verschiebenden Knoten darstellt. Beachten Sie, dass dies einElement
- oder einCharacterData
-Knoten sein muss. referenceNode
-
Ein
Node
, vor demmovedNode
verschoben wird, odernull
. Wenn der Wertnull
ist, wirdmovedNode
am Ende der Kindknoten des aufrufenden Knotens eingefügt.
Rückgabewert
Keiner (undefined
).
Ausnahmen
HierarchyRequestError
TypeError
-
Wird in einer der folgenden Situationen ausgelöst:
- Der angegebene
movedNode
ist nicht Teil des DOM und Sie versuchen, ihn in einen Knoten zu verschieben, der Teil des DOM ist, oder umgekehrt. - Der angegebene
movedNode
ist ein Vorfahre des Elements, auf demmoveBefore()
aufgerufen wird. - Sie versuchen,
movedNode
zwischen zwei verschiedenen Dokumenten zu verschieben. - Der angegebene
movedNode
ist weder einElement
- noch einCharacterData
-Knoten.
- Der angegebene
NotFoundError
TypeError
-
Der angegebene
referenceNode
ist kein Kind des Knotens, auf dem SiemoveBefore()
aufrufen, d.h. des Knotens, in den SiemovedNode
verschieben möchten. TypeError
TypeError
-
Das zweite Argument wurde nicht angegeben.
Beschreibung
Die moveBefore()
-Methode verschiebt einen angegebenen Knoten an eine neue Stelle im DOM. Sie bietet ähnliche Funktionalität wie die Methode Node.insertBefore()
, entfernt und fügt den Knoten jedoch nicht erneut ein. Dies bedeutet, dass der Zustand des Knotens (der zurückgesetzt würde, wenn er mit insertBefore()
und ähnlichen Mechanismen verschoben wird) nach dem Verschieben erhalten bleibt. Dies umfasst:
- Animation- und Übergang-Zustand.
- Ladezustand des
.
- Interaktivitätszustände (zum Beispiel
:focus
und:active
). - Vollbild-Elementzustand.
- Offen/geschlossen Zustand von Popovern.
- Modaler Zustand von
-Elementen (modale Dialoge werden nicht geschlossen).
Der Wiedergabezustand von - und
-Elementen ist in der obigen Liste nicht enthalten, da diese Elemente ihren Zustand beim Entfernen und Wiedereinfügen beibehalten, unabhängig vom verwendeten Mechanismus.
Beim Beobachten von Änderungen am DOM mithilfe eines MutationObserver
werden Knoten, die mit moveBefore()
verschoben wurden, mit einem entfernten Knoten und einem hinzugefügten Knoten aufgezeichnet.
Einschränkungen von moveBefore()
Es gibt einige Einschränkungen, die beim Verwenden von moveBefore()
zu beachten sind:
- Es funktioniert nur, wenn ein Knoten innerhalb desselben Dokuments verschoben wird.
- Es funktioniert nicht, wenn Sie versuchen, einen nicht mit dem DOM verbundenen Knoten zu einem bereits verbundenen Elternteil zu verschieben oder umgekehrt.
In solchen Fällen schlägt moveBefore()
mit einer HierarchyRequestError
-Ausnahme fehl. Wenn die oben genannten Einschränkungen Anforderungen für Ihren speziellen Anwendungsfall darstellen, sollten Sie stattdessen Node.insertBefore()
verwenden oder try...catch
verwenden, um die Fehler zu behandeln, die in solchen Fällen auftreten.
Verschieben von benutzerdefinierten Elementen bei gleichzeitigem Erhalt des Zustands
Jedes Mal, wenn die Position eines benutzerdefinierten Elements im DOM über Element.moveBefore()
oder ähnliche Methoden wie Node.insertBefore()
aktualisiert wird, werden seine disconnectedCallback()
- und connectedCallback()
-Lebenszyklus-Rückrufe ausgeführt. Da diese Rückrufe normalerweise verwendet werden, um erforderlichen Initialisierungs- oder Bereinigungscode zu implementieren, der zu Beginn oder am Ende des Lebenszyklus des Elements ausgeführt werden soll, kann ihre Ausführung beim Verschieben des Elements (anstatt beim Entfernen oder Einfügen) Probleme mit seinem Zustand verursachen.
Sie können den connectedMoveCallback()
-Rückruf verwenden, um den Zustand eines benutzerdefinierten Elements zu erhalten. Beim Verwenden von moveBefore()
, um ein benutzerdefiniertes Element zu verschieben, wird connectedMoveCallback()
anstelle von connectedCallback()
und disconnectedCallback()
ausgeführt.
Weitere Informationen finden Sie unter Verschieben von benutzerdefinierten Elementen.
Beispiele
Grundlegende Verwendung von moveBefore()
In diesem Demo veranschaulichen wir die grundlegende Verwendung von moveBefore()
.
HTML
Das HTML umfasst ein Wir stellen einige rudimentäre Stile für das Aussehen und die Abstände der Boxen bereit und verwenden flexbox, um deren Inhalt zu zentrieren. In unserem Skript fügen wir dem Das gerenderte Beispiel sieht folgendermaßen aus: Versuchen Sie, einige Male auf das In diesem Demo bieten wir mehrere Mechanismen, um ein Das HTML umfasst ein Wir verwenden flexbox für die Anordnung, um die beiden In unserem Skript fügen wir jedem Das gerenderte Beispiel sieht folgendermaßen aus: Versuchen Sie, das YouTube-Embed abzuspielen und dann ein paar Mal auf jeden -Element, das ein
-Elemente enthält. Das
, das wir später verwenden, um es zu verschieben.
Section 1
Section 2
CSS
#section1,
#section2,
#mover {
width: 200px;
height: 80px;
border: 5px solid rgb(0 0 0 / 0.25);
margin-bottom: 10px;
display: flex;
align-items: center;
justify-content: center;
}
#section1,
#section2 {
background-color: hotpink;
}
#mover {
background-color: orange;
}
JavaScript
über
addEventListener()
einen Klick-Event-Listener hinzu. Wenn der Button geklickt wird, prüfen wir, ob das nextElementSibling
unseres mover
--Element ist. Wenn ja, rufen wir
moveBefore()
auf dem wrapper
- auf und geben an, das
zu verschieben. Wenn nicht, verwenden wir
moveBefore()
, um das zu verschieben.
const wrapper = document.getElementById("wrapper");
const section1 = document.getElementById("section1");
const section2 = document.getElementById("section2");
const mover = document.getElementById("mover");
const moveBtn = document.querySelector("button");
moveBtn.addEventListener("click", () => {
if (mover.nextElementSibling === section1) {
wrapper.moveBefore(mover, section2);
} else {
wrapper.moveBefore(mover, section1);
}
});
Ergebnis
zu klicken und beachten Sie, wie es zwischen den beiden Positionen wechselt.
Demonstration der Zustandserhaltung
moveBefore()
den Wiedergabezustand des Embed erhält, während die anderen Mechanismen dies nicht tun.
HTML
-Element, das zwei
-Elemente enthält. Das erste
-Element enthält ein
-Elementen, denen wir später über JavaScript Funktionalität hinzufügen, um das Embed-
CSS
-Elemente nebeneinander zu platzieren und die Buttons gleichmäßig im
controls
-#wrapper,
#controls {
width: 100%;
display: flex;
}
#wrapper {
margin-bottom: 10px;
}
section {
flex: 1;
padding: 10px;
}
#controls {
display: flex;
justify-content: space-around;
}
#section1 {
background-color: hotpink;
}
#section2 {
background-color: orange;
}
#mover {
max-width: 100%;
background-color: black;
}
JavaScript
über
addEventListener()
click
-Event-Listener hinzu. Wenn die Buttons geklickt werden, prüfen wir, welches -Element das
parentElement
unseres Embed-moveBefore()
, insertBefore()
oder prepend()
), um es in das andere -Element zu verschieben.
const section1 = document.getElementById("section1");
const section2 = document.getElementById("section2");
const mover = document.getElementById("mover");
const moveBeforeBtn = document.getElementById("move-before");
const insertbeforeBtn = document.getElementById("insertbefore");
const prependBtn = document.getElementById("prepend");
moveBeforeBtn.addEventListener("click", () => {
if (mover.parentElement === section1) {
section2.moveBefore(mover, null);
} else {
section1.moveBefore(mover, null);
}
});
insertbeforeBtn.addEventListener("click", () => {
if (mover.parentElement === section1) {
section2.insertBefore(mover, null);
} else {
section1.insertBefore(mover, null);
}
});
prependBtn.addEventListener("click", () => {
if (mover.parentElement === section1) {
section2.prepend(mover);
} else {
section1.prepend(mover);
}
});
Ergebnis
zu klicken, um die Bildschirmposition des
insertBefore()
und prepend()
nach jedem Verschieben zurückgesetzt wird, sodass er neu gestartet werden muss. Im Fall von moveBefore()
bleibt der Zustand nach jedem Verschieben erhalten.Spezifikationen
Specification DOM
# dom-parentnode-movebeforeBrowser-Kompatibilität
Siehe auch