Jest insertBefore()
w JavaScript, ale jak mogę wstawić element za innym elementem bez użycia jQuery lub innej biblioteki?
javascript
dom
insert
append
Xah Lee
źródło
źródło
Odpowiedzi:
Gdzie
referenceNode
jest węzeł, po którym chcesz umieścićnewNode
. JeślireferenceNode
jest ostatnim dzieckiem w swoim elemencie nadrzędnym, to w porządku, ponieważreferenceNode.nextSibling
będzienull
iinsertBefore
obsługuje tę sprawę, dodając na końcu listy.Więc:
Możesz to przetestować za pomocą następującego fragmentu:
źródło
insertBefore()
współpracuje z węzłami tekstowymi. Dlaczego chceszinsertAfter()
być inny? Należy utworzyć osobną parę nazwanychinsertBeforeElement()
iinsertAfterElement()
do tego celu.Prosty JavaScript byłby następujący:
Dołącz przed:
Dołącz po:
Ale wrzuć tam kilka prototypów, aby ułatwić ich użycie
Budując następujące prototypy, będziesz mógł wywoływać te funkcje bezpośrednio z nowo tworzonych elementów.
newElement.appendBefore(element);
newElement.appendAfter(element);
.appendBefore (element) Prototyp
.appendAfter (element) Prototyp
Aby zobaczyć wszystko w akcji, uruchom następujący fragment kodu
Pokaż fragment kodu
Uruchom go na JSFiddle
źródło
existingElement.appendAfter(newElement);
. Zobacz, co mam na myśli w tym zaktualizowanym jsfiddle .insertAdjacentHTML
+outerHTML
Plusy:
insertBefore
(nawet jeśli istniejąca nazwa zmiennej węzła ma długość 3 znaków)Wady:
outerHTML
konwertuje element na ciąg. Potrzebujemy tego, ponieważinsertAdjacentHTML
dodaje treść z ciągów zamiast elementów.źródło
.insertAdjacentElement()
Szybkie wyszukiwanie w Google ujawnia ten skrypt
źródło
targetElement.nextSibling
zwrócinull
. Gdynode.insertBefore
jest wywoływanynull
jako jako drugi argument, doda węzeł na końcu kolekcji. Innymi słowy,if(parent.lastchild == targetElement) {
gałąź jest zbyteczna, ponieważparent.insertBefore(newElement, targetElement.nextSibling);
będzie poprawnie obsługiwać wszystkie przypadki, nawet jeśli na początku może się wydawać inaczej. Wielu już to zauważyło w innych komentarzach.Chociaż
insertBefore()
(patrz MDN ) jest świetny i zawiera większość odpowiedzi tutaj. Aby zwiększyć elastyczność i być bardziej precyzyjnym, możesz użyć:insertAdjacentElement()
(patrz MDN ) Pozwala to na odwołanie się do dowolnego elementu i wstawienie elementu, który ma zostać przeniesiony, dokładnie tam, gdzie chcesz:Inne do rozważenia w podobnych przypadkach użycia:
insertAdjacentHTML()
iinsertAdjacentText()
Bibliografia:
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
źródło
Metoda
node.after
( doc ) wstawia węzeł za innym węzłem.Dla dwóch węzłów DOM
node1
inode2
,node1.after(node2)
wstawianode2
ponode1
.Ta metoda nie jest dostępna w starszych przeglądarkach, dlatego zwykle potrzebny jest wielopełniacz.
źródło
Rozwiązanie 2018 (Zła praktyka, przejdź do 2020 r.)
Wiem, że to pytanie jest starożytne, ale dla wszystkich przyszłych użytkowników, oto zmodyfikowany prototyp, jest to po prostu mikro-wypełnienie dla funkcji .insert Po tym, który nie istnieje, ten prototyp bezpośrednio dodaje nową funkcję
baseElement.insertAfter(element);
do prototypu Element:Po umieszczeniu wypełniacza w bibliotece, treści lub po prostu w kodzie (lub w innym miejscu, do którego można się odwołać) Po prostu napisz
document.getElementById('foo').insertAfter(document.createElement('bar'));
Rozwiązanie 2019 (brzydkie, przejdź do 2020 r.)
Nowa edycja: NIE WOLNO STOSOWAĆ PROTOTYPÓW. Zastępują one domyślną bazę kodu i nie są bardzo wydajne ani bezpieczne i mogą powodować błędy zgodności, ale jeśli dotyczy to projektów niekomercyjnych, nie powinno to mieć znaczenia. jeśli chcesz bezpieczną funkcję do użytku komercyjnego, po prostu użyj funkcji domyślnej. to nie jest ładne, ale działa:
Rozwiązanie 2020
Aktualne standardy sieciowe dla ChildNode: https://developer.mozilla.org/en-US/docs/Web/API/ChildNode
Jest obecnie w Living Standards i jest BEZPIECZNY.
W przypadku nieobsługiwanych przeglądarek skorzystaj z funkcji Polyfill: https://github.com/seznam/JAK/blob/master/lib/polyfills/childNode.js
Ktoś wspomniał, że Polyfill używa Protos, kiedy powiedziałem, że to zła praktyka. Są, szczególnie gdy są używane nieprawidłowo, podobnie jak moje rozwiązanie na 2018 rok. Jednak ta polifill znajduje się w Dokumentacji MDN i korzysta z bezpieczniejszej inicjalizacji i wykonania. Plus JEST dla starszych przeglądarek, w czasach, gdy nadpisywanie prototypów nie było takie złe.
Jak korzystać z rozwiązania 2020:
źródło
Lub możesz po prostu zrobić:
źródło
źródło
Metoda insertBefore () jest używana jak
parentNode.insertBefore()
. Aby to naśladować i stworzyć metodęparentNode.insertAfter()
, możemy napisać następujący kod.JavaScript
HTML
Pamiętaj, że rozszerzenie DOM może nie być właściwym rozwiązaniem dla Ciebie, jak stwierdzono w tym artykule .
Jednak ten artykuł został napisany w 2010 roku i teraz może być inaczej. Zdecyduj więc sam.
JavaScript DOM insertAfter () metoda @ jsfiddle.net
źródło
Idealnie
insertAfter
powinien działać podobnie do insertBefore . Poniższy kod wykona następujące czynności:Node
jest dołączaneNode
, noweNode
jest dodawaneNode
po referencjiNode
, nowaNode
jest dołączanaNode
ma później rodzeństwo, nowyNode
jest wstawiany przed tym rodzeństwemNode
Rozsuwalny
Node
Jeden wspólny przykład
Zobacz działający kod
Pokaż fragment kodu
źródło
Wiem, że na to pytanie ma już zbyt wiele odpowiedzi, ale żadne z nich nie spełniło moich dokładnych wymagań.
Chciałem funkcji, która ma dokładnie odwrotne zachowanie
parentNode.insertBefore
- to znaczy musi zaakceptować wartość zerowąreferenceNode
(czego nie przyjmuje zaakceptowana odpowiedź ) i gdzieinsertBefore
wstawiłaby na końcu dzieci, którą należy wstawić na początku , ponieważ w przeciwnym razie ' d nie można w żaden sposób wstawić w miejscu początkowym z tą funkcją; ten sam powódinsertBefore
wstawia na końcu.Ponieważ wartość null
referenceNode
wymaga zlokalizowania elementu nadrzędnego, musimy znać element nadrzędny -insertBefore
jest to metodaparentNode
, więc ma on w ten sposób dostęp do elementu nadrzędnego; nasza funkcja nie, więc musimy przekazać parametr nadrzędny jako parametr.Wynikowa funkcja wygląda następująco:
Lub (jeśli musisz, nie polecam) możesz oczywiście ulepszyć
Node
prototyp:źródło
Ten kod jest praca, aby wstawić właściwą pozycję Link po ostatnim istniejącym dziecka inline mały plik css
źródło
Możesz użyć
appendChild
funkcji do wstawienia po elemencie.Odniesienie: http://www.w3schools.com/jsref/met_node_appendchild.asp
źródło
solidna implementacja insertAfter.
};
źródło
Pozwala obsłużyć wszystkie scenariusze
źródło
źródło
Można tak naprawdę wywołać metodę
after()
w nowszej wersji Chrome, Firefox i Opera. Minusem tej metody jest to, że Internet Explorer jeszcze jej nie obsługuje.Przykład:
Prosty kod HTML do przetestowania, który jest:
Zgodnie z oczekiwaniami przesuwa element w górę za elementem w dół
źródło